采用状态机思路,利用定时器中断方式实现按键计数检测,
每按下按键K1 一次,计数值加 1,加到 23 后再按下,
计数值回到 0,并用动态显示计数值。
电路原理图如图所示
状态机转移示意图
以下为老师提供的代码。他使用了·10ms这个按键抖动时间作为检查状态的间隔时间。
- /*
- P0.0~P0.8输出到两位一体的共阳数码管7SEG-MPX2-CA的段码部分
- P2.4和P2.5经过74HC04的反相分别接到7SEG-MPX2-CA的位选部分
- P2.0通过一个按钮接地
- 要求按下按钮,数码管显示数字加1
- 本程序使用状态机框架
- 相关视频:https://www.bilibili.com/video/BV11a4y1v7k9
- */
- #include "reg52.h"
- #include "INTRINS.H"
-
- #define LEDPORT P0
- sbit BUTTON=P2^0;
- sbit gewei=P2^4;
- sbit shiwei=P2^5;
-
- unsigned char code CA_numbers[]=
- {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xc1,0x91,0x7c,0x00,0xff};
-
- signed char count=0;
-
- void display(void);
-
- void delaynms(unsigned int n);
- void Delay1ms(void);
-
- void Timer0_Init(void);
- void timer0_isr(void);
-
- void Action();
-
- //void Sys_Init(){
- // state=0;
- //}
-
- void main(void){
- EA=1;
- Timer0_Init();
- //Sys_Init();
- while(1){
- display();
- }
- }
-
- void Timer0_Init(void) //10毫秒@11.0592MHz
- {
- //AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0=(65536-10000)%256; //设置定时初始值
- TH0=(65536-10000)/256; //设置定时初始值
- TF0 = 0; //清除TF0标志
- PT0=1;
- ET0 = 1; //使能定时器0中断
- TR0 = 1; //定时器0开始计时
- }
- void timer0_isr(void) interrupt 1
- {
- static signed char state=0;
- TF0=0;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
-
- switch(state){
- case 0:
- {
- if(0==BUTTON){
- state=1;
- }
- break;
- }
- case 1:
- {
- if(0==BUTTON){
- state=2;
- Action();
- }else{
- state=0;
- }
- break;
- }
- case 2:
- {
- if(1==BUTTON){
- state=3;
- }
- break;
- }
- case 3:
- {
- if(1==BUTTON){
- state=0;
- }else{
- state=2;
- }
- break;
- }
- default:{
- ;//留空
- }
- }
- }
- void Action(){
- count++;
- if(count>=23){
- count=0;
- }
- }
-
- void display(void){
- //先显示个位
- gewei=1;
- shiwei=0;
- LEDPORT=CA_numbers[count%10];
- gewei=0;
- delaynms(1);
- //再显示十位
- gewei=0;
- shiwei=1;
- LEDPORT=CA_numbers[count/10];
- shiwei=0;
- delaynms(1);
- }
-
- void Delaynms(unsigned int n){
- while(n--){
- Delay1ms();
- }
- }
- void Delay1ms(void) //@11.0592MHz
- {
- unsigned char data i, j;
-
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
复制代码
|