#includereg51hsbit K1=P1^4;°´¼üunsigned char code shuzu1=0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f;µ¥¿ÅÁ÷¶¯Êý×éunsigned char code shuzu2=0xfc0xf90xf30xe70xcf0x9f0x3f0x7e;Á½¿ÅÁ÷¶¯Êý×éunsigned char jishu=0;¼ÆÊý±
#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,重新开始显示
}
}
原文地址: http://www.cveoy.top/t/topic/hjuT 著作权归作者所有。请勿转载和采集!