加个松手检测 |
wulin 发表于 2017-7-27 09:32 不知道是不是delay的关系,我之前计时的开关是直接控制定时器的开关,大概因为这样所以有延迟吧,用了你的那种暂停标志的写法就解决了,顺带连记录数据时的延迟也解决了。谢谢啊 |
动态数码管显示+按键操作切不可用delay软件延时,否则互相干扰,给你一个6位数码管99分钟百分秒表程序参考。 #include <AT89X52.H> #define uint unsigned int //宏定义无符号整型数据 #define uchar unsigned char //宏定义无符号字符型数据 sbit key1=P3^6; sbit dula=P2^6; //段 sbit wela=P2^7; //位 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar swan,wan,qian,bai,shi,ge; uchar Cnt1ms=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0; //中断计时变量 bit zantin=0; //暂停标志 //unsigned long Cnt1s=0; //秒变量 void display(); void conversion(); void keyscan(); /***********按键扫描程序****************/ void keyscan() { static uchar count2=0,count1=0; //计数变量 static bit key_sign=0; //按键状态标志 if(key1==0) //检测输入如果为0 { count1++; //计数延时消抖 if(count1>=20) //20次检测按键如果为0 { count1=20; //防止溢出 if(key_sign==0) //按键状态标志为0 { key_sign=1; //按键状态标志置1,防止重复响应 count2++; if(count2>=3) count2=0; switch(count2) { case 0: Cnt1ms=0; Cnt10ms=0; Cnt1s=0; Cnt1min=0; break;//清0 case 1: zantin=1; break;//计时 case 2: zantin=0; break;//暂停 } } } } else { count1=0; //计数变量清0 key_sign=0; //按键状态标志清0 } } /***********定时器初始化程序****************/ void Timer0Init() //1毫秒@11.0592MHz { TMOD = 0x01; //设置定时器模式 TL0 = 0x66; //设置定时初值 TH0 = 0xFC; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 EA=1; //开总中断 ET0=1; //开定时器0中断 } /***************主程序****************/ void main() { Timer0Init(); //定时器初始化 while(1) { keyscan(); //按键扫描 conversion(); //数字分解 } } /**************中断服务程序*****************/ void timer0() interrupt 1 { TL0 = 0x66; //设置定时初值 TH0 = 0xFC; //设置定时初值 Cnt1ms++; //中断变量Cnt1ms自+1 if(Cnt1ms>=10) //10ms { Cnt1ms=0; //清0 if(zantin==1) //暂停/启动 Cnt10ms++; //毫秒计数 if(Cnt10ms>=100) { Cnt10ms=0; Cnt1s++; //秒计数 if(Cnt1s>=60) { Cnt1s=0; Cnt1min++; //分计数 if(Cnt1min>=100) Cnt1min=0; } } } display(); //显示程序 } void display()//显示程序 { static uchar count=0; //计数变量 switch(count) { case 0: dula=0; P0=table[swan]; //显示十万位 dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; count=1; break; case 1: dula=0; P0=table[wan]; //显示万位 dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; count=2; break; case 2: P0=table[qian]; //显示千位 dula=1; dula=0; P0=0x7b; wela=1; wela=0; count=3; break; case 3: P0=table[bai]; //显示百位 dula=1; dula=0; P0=0x77; wela=1; wela=0; count=4; break; case 4: P0=table[shi]; //显示十位 dula=1; dula=0; P0=0xef; wela=1; wela=0; count=5; break; case 5: P0=table[ge]; //显示个位 dula=1; dula=0; P0=0xdf; wela=1; wela=0; count=0; break; } } void conversion() { swan = Cnt1min/10; // 十万位 wan = Cnt1min%10; // 万位 qian = Cnt1s/10; // 千位 bai = Cnt1s%10; // 百位 shi = Cnt10ms/10; // 十位 ge = Cnt10ms%10; // 个位 } |
参与人数 1 | 黑币 +2 | 收起 理由 |
---|---|---|
![]() | + 2 | 很给力! |