|
本帖最后由 paulhyde 于 2014-9-15 09:37 编辑
- /*****************************************************
- 本程序的目标是这样的:
- 1:不使用INTn中断功能,按键接在普通IO上
- 2:由定时器T/C2每隔一段时间检测按键一次, 并具有防抖动功能
- 3:每点击按键一次,在按键松开后,变量A=A+1
- 4:如果按键按下后不放,则每隔 n ms 就做A=A+1运算一次
- 5:在按键按下期间,CPU除了处理按键外,还必须能正常运行主程序
- 6:本程序的系统时钟是1MHz
- *****************************************************/
- #include
- #include
- #include
- unsigned char A,B;
- unsigned char n;
- bit step1, step2, step3,step4; //使用几个位变量记忆按键状态
- //***************************************************
- interrupt [10] void TC2_OVF(void)
- {
- if(n<255) n++;
- if(PIND.2==1 && n>8) step1=1; //按键松开一定时间后开始进入可用状态
- if(PIND.2==0 && step1) {step1=0; step2=1; n=0;} //按键由可用状态进入到按下状态
- if(PIND.2==1 && step2) {step2=0; step3=1; n=0;} //按键由按下状态进入到松开状态
- //-------------------------------------------------
- //按键按下后...
- if(step2)
- {
- n++;
- if(n>60) //如果按下超过一定时间
- {
- A+=1;
- n=40;
- step4=1;
- }
- }
- //-------------------------------------------------
- if(step3) //按键松开后...
- {
- step3=0;
- if(step4) step4=0; else A+=1;
- }
- }
- //***************************************************
- //www.avrdiy.com panxiaoyi
- void main(void)
- {
- PORTB&=209;
- DDRB|=46; //设置单片机的4个LCD引脚输出0
- lcd_init(); //lcd初始化
- lcd_cls(); //清屏,光标回位
- DDRD.2=0;
- PORTD.2=1; //PD2设置为输入,上拉电阻有效(接按键)
- TCCR2B|=4; //T/C2采用系统时钟的64分频
- #asm("sei"); //全局中断使能
- TIMSK2|=1; //T/C2计数溢出中断使能
- while (1)
- {
- B+=1;
- lcd_gotoxy(12,1);
- lcd_putsf("AVRDIY.COM",10);
- lcd_gotoxy(15,3);
- lcd_putchar(B/100+48); //显示变量B
- lcd_putchar(B/10%10+48);
- lcd_putchar(B%10+48);
- lcd_gotoxy(52,3);
- lcd_putchar(A/100+48); //显示变量A
- lcd_putchar(A/10%10+48);
- lcd_putchar(A%10+48);
- };
- }
复制代码
|
|