8×8LED点阵屏仿电梯数字滚动显示(串行通信控制)
//名称: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;
// ...
}
}
原文地址: https://www.cveoy.top/t/topic/gc4t 著作权归作者所有。请勿转载和采集!