模拟类似于项目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为复位键。
仿真显示分别如图所示:
感谢观看!如有不足请指正!