楼主想要完成上述预想的功能没必要写这么复杂,只要把逻辑关系捋清,很容易实现。不论仿真或实物也完全不需要按键消抖。给你改好了,你试试。
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar Duan[] = {//共阳数码管段码"0~f-. "
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0xFF};
- uchar Wei[4]={0x01,0x02,0x04,0x08}; //位的控制端 (仿真)
- uchar Time_Buffer[4]; //时间缓存
- uint Time=0;
- uint Time_Count=0;
- uchar Cnt100us=0;
- bit flag=0;
- /*
- void delayms(uint x) //延时函数
- {
- uint i,j;
- for(i = x; i > 0; i --)
- for(j = 125; j > 0; j --);
- }*/
- void Show_Time() //数码管动态扫描显示
- {
- uchar i;
- uint j;
- static uchar k=0;
- /*****************数据分解*****************************/
- if(flag==0)//判断启动标志复位 处理数据
- {
- j=Time;
- for(i=4;i>0;i--)
- {
- Time_Buffer[i-1]=Duan[j%10];//由低位到高位保存
- j/=10;
- }
- }
- else //等待计时结束
- {
- for(i=4;i>0;i--)
- {
- Time_Buffer[i-1]=0xbf;//全部'-'
- }
- }
- P0 = 0xFF;
- P1 = Wei[k];
- if(k==0)P0=Time_Buffer[k]&0x7f;//加小数点
- else P0=Time_Buffer[k];
- k++;k%=4;
- }
- /******************
- 主函数
- ******************/
- void main()
- {
- IT0 = 1;//下降沿触发
- IT1 = 1;
- EX0 = 1;
- EX1 = 1;
- EA = 1;
-
- TMOD=0x02; //设置为自动重载方式
- TH0=0x9c; //设置为100us的计数
- TL0=0x9c;
- ET0=1;
- TR0=0;
- while(1)
- {
- Show_Time();
- }
- }
- void Timer_T0() interrupt 1
- {
- if(++Cnt100us>=10) //1ms
- {
- Cnt100us=0;
- if(++Time_Count>9999) //计时范围0-9999
- Time_Count=0; //10s
- }
- }
- void Stop_Int0() interrupt 0
- {
- if(TR0==0) //与INT1互锁
- {
- flag=1; //启动标志
- Cnt100us=0; //初始值清0
- Time_Count=0; //初始值清0
- TR0=1; //开始计时
- }
- }
- void Start_ExInt1()interrupt 2
- {
- if(flag) //判断启动状态 与INT0互锁
- {
- TR0=0; //停止计时
- flag=0; //启动标志复位
- Time=Time_Count;//读取计数值
- }
- }
复制代码
|