#includereg51h#includeintrinsh#define uchar unsigned char#define uint unsigned int#define data1 P0#define data2 P2sbit s1=P3^6;sbit s2=P3^7;bit fangxiang;uint alt=0net=0sl=600;bit mode;uchar code tab=
这是一个基于51单片机的LED滚动屏幕程序。具体分析如下:
- 宏定义和全局变量定义:
#define uchar unsigned char #define uint unsigned int #define data1 P0 #define data2 P2 sbit s1=P3^6; sbit s2=P3^7; bit fangxiang; uint alt=0,net=0,sl=600; bit mode; uchar code tab[] = {...};
其中,uchar代表无符号字符型,uint代表无符号整型,bit代表位型,sbit定义端口位,code表示定义的数组为只读常量存储在程序存储器中,tab[]存储了显示字符的点阵信息,alt为计时器的计数值,net用于存储当前屏幕中显示的字符的位置,sl为字符滚动到末尾时的位置,fangxiang表示字符滚动的方向。
- delay函数:
void delay(uint z) { uchar x; for(;z>0;z--) for(x=30;x>0;x--); }
此函数为延时函数,z为要延时的时间,x为循环计数器,通过循环进行延时。
- xianshi函数:
void xianshi() { uchar aa,i; for(i=0;i<16;i++) //循环显示16列 { P1=i; //P1为控制列的端口 data1=tab[net+aa]; //将对应的点阵信息输出到data1和data2端口控制的LED点阵上 aa++; data2=tab[net+aa]; aa++; delay(5); //延时 data1=0; //清空data1和data2端口 data2=0; P1=0x00; //清空P1端口 if(aa>30) aa=0; //当aa大于30时,重新开始循环 } }
此函数实现了LED点阵的滚动显示,循环显示16列,将对应的点阵信息输出到data1和data2端口控制的LED点阵上,通过延时实现滚动效果,当aa大于30时,重新开始循环。
- 主函数:
void main() { ET1=1; //打开定时器1中断 EA=1; //打开总中断 TR1=1; //启动定时器1 while(1) { xianshi(); //调用xianshi函数,进行LED点阵的滚动显示 if(s1==0) //判断是否按下s1 { delay(10); //延时 TR1=~TR1; //改变定时器1的运行状态 while(!s1)xianshi(); //等待s1松开后再次进行LED点阵的滚动显示 delay(10); } if(s2==0) //判断是否按下s2 { delay(10); fangxiang=~fangxiang; //改变字符滚动的方向 while(!s2)xianshi(); //等待s2松开后再次进行LED点阵的滚动显示 delay(10); } } }
此函数为主函数,循环调用xianshi函数实现LED点阵的滚动显示,当按下s1时,改变定时器1的运行状态,当按下s2时,改变字符滚动的方向,松开按键后再次进行LED点阵的滚动显示。
- timer1中断函数:
void timer1() interrupt 3 { alt++; //计数器加1 if(alt==30) //当计数器满30时 { alt=0; //计数器清零 if(fangxiang==0) //当字符滚动方向为正向时 { net=net+2; //字符位置加2 if(net>sl) //当字符位置超过末尾位置时,重新回到起始位置 net=0; } else //当字符滚动方向为反向时 { net=net-2; //字符位置减2 if(net<2) //当字符位置小于2时,重新回到末尾位置 net=sl; } } }
此函数为定时器1中断函数,每当计数器满30时,改变字符的显示位置,实现字符的滚动。当字符滚动方向为正向时,字符位置加2,当字符位置超过末尾位置时,重新回到起始位置;当字符滚动方向为反向时,字符位置减2,当字符位置小于2时,重新回到末尾位置
原文地址: https://www.cveoy.top/t/topic/fqbB 著作权归作者所有。请勿转载和采集!