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