#include<reg51.h>

sbit K1=P1^4;//定义K1为P1.4引脚,即按键所接引脚

unsigned char code shuzu1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义一个小数组,用于存储小段移动时的显示码 unsigned char code shuzu2[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7e};//定义一个大数组,用于存储大段移动时的显示码

unsigned char jishu=0;//定义一个计数器变量,用于存储当前显示的码在数组中的位置 unsigned char moshi=2;//定义一个模式变量,用于表示当前显示的模式,默认为2 unsigned char Time;//定义一个计时变量,用于计算每次循环的时间

void main() { P2=shuzu1[jishu];//将初始显示码设置为小数组中的第一个 TMOD = 0x11; //设置计时器0为模式1 TH0 = 0x3C; //设置计时器0的初始值,实现50ms的计时 TL0 = 0xB0; EA = 1; //开启总中断 ET0 = 1;TR0 = 1;//开启计时器0中断//启动计时器0
while(1) { if(K1==0)//如果按键被按下 { moshi++;//模式变量加1,实现切换模式 if(moshi>1)//如果模式变量大于1,即已经切换到大段移动模式 moshi=0;//模式变量重置为0,即切换回小段移动模式 Time=0;jishu=0;//计时变量和计数器变量清零,用于实现重新开始显示 while(K1==0);//等待按键松开 } if(moshi==0)//如果当前模式为小段移动模式 { P2=shuzu1[jishu];//将P2端口输出设置为小数组中对应位置的显示码 } if(moshi==1)//如果当前模式为大段移动模式 { P2=shuzu2[jishu];//将P2端口输出设置为大数组中对应位置的显示码 } } }

void Timer0() interrupt 1//计时器0中断服务函数 { TH0 = 0x3C; //重置计时器0的初始值 TL0 = 0xB0; Time++;//计时变量加1 if(moshi==0)//如果当前模式为小段移动模式 { if(Time>=20) //如果计时变量达到了20,即经过了1秒钟 { Time=0;//计时变量清零 jishu++;//计数器变量加1,实现切换到下一个显示码 if(jishu>=8) jishu=0; //如果计数器变量超过了数组长度,即已经显示完了一遍,将计数器变量重置为0,重新开始显示 } } else//如果当前模式为大段移动模式
if(Time>=1) //如果计时变量达到了1,即经过了50ms { { Time=0;//计时变量清零 jishu++;//计数器变量加1,实现切换到下一个显示码 if(jishu>=8) jishu=0; //如果计数器变量超过了数组长度,即已经显示完了一遍,将计数器变量重置为0,重新开始显示 } }

#includereg51hsbit K1=P1^4;°´¼üunsigned char code shuzu1=0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f;µ¥¿ÅÁ÷¶¯Êý×éunsigned char code shuzu2=0xfc0xf90xf30xe70xcf0x9f0x3f0x7e;Á½¿ÅÁ÷¶¯Êý×éunsigned char jishu=0;¼ÆÊý±

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

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