//名称:8×8LED点阵屏仿电梯数字滚动显示(加入串行通信)
//说明:本例模拟了电梯显示屏上下滚动显示楼层的效果,当目标楼层大于
//当前楼层时,将向上滚动显示,反之则向下滚动显示。同时加入了串行通信,
//可以接收上位机的拨动开关状态并控制LED灯亮灭。
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

uchar code Table[]= 
{
	0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,//0
	0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,//1
	0x00,0x7E,0x02,0x02,0x7E,0x40,0x40,0x7E,//2
	0x00,0x7E,0x02,0x02,0x7E,0x02,0x02,0x7E,//3
	0x00,0x48,0x48,0x48,0x7E,0x08,0x08,0x08,//4
	0x00,0x7E,0x40,0x40,0x7E,0x02,0x02,0x7E,//5
	0x00,0x7C,0x40,0x40,0x7C,0x44,0x44,0x7C,//6
	0x00,0x7C,0x04,0x04,0x04,0x04,0x04,0x04,//7
	0x00,0x7C,0x44,0x44,0x7C,0x44,0x44,0x7C,//8
	0x00,0x7E,0x42,0x42,0x7E,0x02,0x02,0x7E,//9
	
};

uint r= 0;
char offset = 0;
uchar Current_Level = 1,Dest_Level=1,x=0,t =0;

void main()
{
	P3 = 0x80; //初始化LED点阵屏
	Current_Level = 1;//从1开始显示
	TMOD  = 0x01;	//T0工作方式1
	TH0 = -4000/256;//4ms//每个数字有8字节
	TL0 = -4000%256;
	TR0=1; //启动T0
	
	SCON = 0x50;  //串口工作方式1,允许接收
	TMOD |= 0x20; //定时器1工作方式2
	TH1 = TL1 = 0xfd; //波特率9600
	TR1 = 1; //启动T1
	
	IE = 0x92; //开启串口和定时器0中断
	EA =1; //开启总中断
	
	while(1);	
}

void Led_Dispaly() interrupt 1
{
	uchar i;
	//在停止滚动时,如果有按键按下,则判断目标楼层
	if (P1 != 0xff && Current_Level == Dest_Level )
	{
		if (P1 ==0xfe)Dest_Level =5;
		if (P1 ==0xfd)Dest_Level =4;
		if (P1 ==0xfb)Dest_Level =3;
		if (P1 ==0xf7)Dest_Level =2;
		if (P1 ==0xef)Dest_Level =1;
	}
	TH0 = -4000/256;//4ms
	TL0 = -4000%256;
	P3 =_crol_(P3,1); //点阵屏列扫描
	i = Current_Level *8 + r + offset;
	P0 = ~Table[i]; //显示数字
	
	//上升显示
	if (Current_Level < Dest_Level )
	{
		if ( ++r ==8)
		{//每个数字有8字节
				r =0;
			if( ++x ==4)
			{//每完成x次刷新后后偏
				x = 0;
				if(++offset ==8)
				{
					offset = 0;
					Current_Level++;				
				}
				
			}
		}
		
	}
	//下降显示
	else if(Current_Level > Dest_Level )
	{
		if ( ++r ==8)
		{//每个数字有8字节
			r =0;
			if( ++x ==4)
			{//每完成x次刷新后前偏
				x = 0;
				if(--offset == -8)
				{
					offset = 0;
					Current_Level--;				
				}
				
			}
		}
		
	}
	//停止滚动,保持稳定的刷新显示
	else
	{
		if ( ++r ==8) r =0;		
	}
}

void Uart() interrupt 4
{
	if (RI == 1)
	{
		RI = 0; //清除接受中断标志位
		uchar val = SBUF; //读取串口接受缓冲器中的数据
		//根据接受到的数据控制LED灯亮灭
		// ... (此处可根据实际硬件连接修改代码)
		// 例如,控制P2口的LED灯
		if (val == 0x01) P2 = 0xfe;
		else if (val == 0x02) P2 = 0xfd;
		else if (val == 0x03) P2 = 0xfb; 
		// ...
	}
}

8×8LED点阵屏仿电梯数字滚动显示(串行通信控制)

原文地址: https://www.cveoy.top/t/topic/gc4t 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录