89C51实现单个指定按键消抖后计数(使用共阴极数码管7SEG-MPX8-CC-BLUE)

发布时间 2023-06-01 13:17:33作者: stysty

 

位选

关键锁存器

按键(消抖)区

小灯泡D1用于指示SW1是否被检测到按下(计数器设置为1次就溢出,在中断中计数num+1的同时对小灯泡连接的端口取反用于指示)。

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define SEGPORT P2  //显示字形

#define BITPORT P0   //控制位选

 

sbit LED = P1^7;

sbit en = P3^0;     //控制74LS373使能位,用于打开/关闭锁存。

 

unsigned int num = 0;

unsigned char code ledTab[]=

{

  0x3F,0x06,  0x5B,  0x4F,  0x66,  0x6D, 0x7D, 0x07, 0x7F,  0x6F,

};            //共阴极的字码

 

void Delay_Us(unsigned int us)

{

       unsigned char i;

  while(us--)

       {

              for(i=0;i<100;i++);

       }

}       //延时函数

 

void DynamicLed(unsigned char Ligh)    //已定最高显示三位数,设置为数码管右边三位亮

{

         Delay_Us(Ligh);

SEGPORT = 0x00;

         BITPORT = 0Xfe;

         SEGPORT = ledTab[num%10];  //显示个位

         en = 0;         //关闭锁存

         Delay_Us(Ligh);  //延时,否则失效,数码管会闪烁并且数值会交替变化(非故障)

         en = 1;         //打开锁存

         Delay_Us(Ligh);

         BITPORT = 0Xfd;

         SEGPORT = ledTab[num/10%10];   //显示十位

         Delay_Us(Ligh);

         BITPORT = 0Xfb;

         SEGPORT = ledTab[num/100%10];   //显示百位

 

}

 

void main()

{

       unsigned char Counter = 0;

       TMOD = 0X60;

       TH1 = 255;

       TL1 = 255;

       LED = 0;

       EA = 1;

       ET1 = 1;

       TR1 = 1;

  while(1)

  {

         DynamicLed(1);

  }

}

 

void timer1() interrupt 3

{

       LED = ~LED;

       num = num + 1;

}