锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

项目9—电子表显示(包括四个按键、按键包括时间的加减、闹钟)

时间:2022-08-03 17:19:00 电阻9k1

模拟类似于项目8的八位数字管显示,可以自行添加蜂鸣器或LED。

仿真如下:

在八位数字管的基础上,编写按键功能,以及按键几次会出现的效果。

的器件有AT8951,RES-PACK8,按键BUTTON等,蜂鸣BUZZE模拟图用电阻代替,所用设备名称如图所示。

电子表是在八段数字管的基础上添加按钮。

在这里,我们将第一个按钮定义为选位、时位、分位和秒位。

第二个按钮定义为加键,第三个按钮减少。

第四个按钮是恢复按钮,恢复到原始位置。

程序如下:

#include code unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; code bit_scan[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char  num[8],cp,cp1,cp2,k1_flag,flash; char sec = 30,min = 30,hour = 12,hour_n,min_n; sbit LE = P1^0; sbit BUZZER = P1^5; void timer0_isr(void) interrupt 1 {  TH0 = (65536 - 2500) / 256;  TL0 = (65536 - 2500) % 256;  cp1  ;  if(cp1 >= 200){cp1 = 0;flash = ~flash;cp2  ;}  if(cp2 >= 2){cp2 = 0;sec  ;}  if(sec >= 60){sec = 0;min  ;}  if(min >= 60){min = 0;hour  ;}  if(hour >= 24)hour = 0;   P0 = 0xff;  P0 = bit_scan[cp];LE = 0;LE = 1;LE = 0;P0 = num[cp];  cp  ;  if(cp >= 8)cp = 0; } void timer0_init(void)  {  TMOD = 0x01;  TH0 = (65536 - 2500) / 256;  TL0 = (65536 - 2500) % 256;  EA = 1;  ET0 = 1;  TR0 = 1; } void key(void) {   P2 = 0xef;  if(P2 == 0xee)  {   k1_flag  ;   if(k1_flag >= 6)k1_flag = 1;  }   if(P2 == 0xed)  {   if(k1_flag == 1){hour  ;if(hour >= 24)hour = 23;}   if(k1_flag == 2){min  ;if(min >= 60)min = 59;}     if(k1_flag == 3){sec  ;if(sec >= 60)sec = 59;}      if(k1_flag == 4){hour_n  ;if(hour_n >= 24)hour_n = 23;}    if(k1_flag == 5){min_n  ;if(min_n >= 60)min_n = 59;}   }  if(P2 == 0xeb)  {   if(k1_flag == 1){hour--;if(hour <= 0)hour = 0;}   if(k1_flag == 2){min--;if(min <= 0)min = 0;}     if(k1_flag == 3){sec--;if(sec <= 0)sec = 0;}      if(k1_flag == 4){hour_n--;if(hour_n <= 0)hour_n = 0;}    if(k1_flag == 5){min_n--;if(min_n <= 0)min_n = 0;}   }  if(P2 == 0xe7)k1_flag = 0;  while(P2 < 0xef); } void num_cov(void) {   if(k1_flag == 0)  {   num[0] =  seven_seg[sec % 10];   num[1] =  seven_seg[sec / 10];   num[2] =  0xbf | flash;   num[3] =  seven_seg[min % 10];   num[4] =  seven_seg[min / 10];   num[5] =  0xbf | flash;   num[6] =  seven_seg[hour % 10];   num[7] =  seven_seg[hour / 10];   }  if(k1_flag == 1)  {   num[6] =  seven_seg[hour % 10] | flash;   num[7] =  seven_seg[hour / 10] | flash;   }  if(k1_flag == 2)  {   num[3] =  seven_seg[min % 10] | flash;   num[4] =  seven_seg[min / 10] | flash;  }  if(k1_flag == 3)  {   num[0] =  seven_seg[sec % 10] | flash;   num[1] =  seven_seg[sec / 10] | flash;  }  if(k1_flag == 4)  {   num[3] =  seven_seg[hour_n % 10] | flash;   num[4] =  seven_seg[hour_n / 10] | flash;   num[6] =  0xc0;   num[7] =  0xc8;   }  if(k1_flag == 5)  {   num[0] =  seven_seg[min_n % 10] | flash;   num[1] =  seven_seg[min_n / 10] | flash;    num[6] =  0xc0;   num[7] =  0xc8;   }  if(k1_flag != 0)  {   num[2] =  0xbf;   num[5] =  0xbf;  } }  void main(void) {  timer0_init();  while(1)  {   num_cov();   key();   if(hour == hour_n && min == min_n)BUZZER = 0;   else BUZZER = 1;   } }

其中num_cov();这个函数简化了,应该是

if(k1_flag == 0)
{
num[0] = seven_seg[sec % 10];
num[1] = seven_seg[sec / 10];
num[2] = 0xbf | flash;
num[3] = seven_seg[min % 10];
num[4] = seven_seg[min / 10];
num[5] = 0xbf | flash;
num[6] = seven_seg[hour % 10];
num[7] = seven_seg[hour / 10];
}
if(k1_flag == 1)
{

num[0] = seven_seg[sec % 10];
num[1] = seven_seg[sec / 10];
num[2] = 0xbf | flash;
num[3] = seven_seg[min % 10];
num[4] = seven_seg[min / 10];
num[5] = 0xbf | flash;
num[6] = seven_seg[hour % 10] | flash;
num[7] = seven_seg[hour / 10] | flash;
}
if(k1_flag == 2)
{

nbsp;     num[0] =  seven_seg[sec % 10];
        num[1] =  seven_seg[sec / 10];
        num[3] =  seven_seg[min % 10] | flash;
        num[4] =  seven_seg[min / 10] | flash;

        num[5] =  0xbf | flash;
        num[6] =  seven_seg[hour % 10];
        num[7] =  seven_seg[hour / 10];    
    }等等,以下不再一一列出。

Flash表示闪烁,按键在前面项目中有详细讲解,这里不在一一解释。

仿真结果

其中数码管第三位和第六位闪烁。

按下K1,按下一次,为调时钟时间,按下第二次为调分钟,按下第三次为调秒,第四次为闹钟。 

K2为加,K3为减,K4为复位键。

仿真显示分别如图所示:

 

 感谢观看!如有不足请指正!

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章