资讯详情

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

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

如下:

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

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

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

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

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

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

如下:

#include<reg51.h> 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为复位键。

仿真显示分别如图所示:

 

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

 

标签: 电阻9k1

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

锐单商城 - 一站式电子元器件采购平台