单片机之电子表(闪烁、加加减减)
#include<REG52.H>
unsigned char SEG[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char i,cp,num,key1_s,key2_s,key3_s,sec=50,min=59,hour=23,mode,flash;
unsigned cp1;
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit key3 = P3^2;
void delay(unsigned int x){
while(x--);
}
void key(void){
if(key1==0){
delay(500);
if(key1==0){
key1=1;
key1_s=1;
}
}
if(key1==1&&key1_s==1){
key1_s=0;
mode++;
//这时候估计要开始闪烁
}
if(key2==0){ //按第二下,加秒
delay(500);
if(key2==0){
key2_s=1;
key2=1;
}
}
if(key2==1&&key2_s==1){
key2_s=0;
//加
if(mode==1){
sec++;
if(sec>59) sec=0;
}
if(mode==2){
min++;
if(min>59) min=0;
}
if(mode==3){
hour++;
if(hour>23) hour=0;
}
//减
}
if(key3==0){ //按第二下,
delay(500);
if(key3==0){
key3_s=1;
key3=1;
}
}
if(key3==1&&key3_s==1){
key3_s=0;
//减
if(mode==1){
sec--;
if(sec<=0) sec=59;
}
if(mode==2){
min--;
if(min<=0) min=59;
}
if(mode==3){
hour--;
if(hour<=0) hour=23;
}
}
if(mode>=4) mode=0;
}
void display(void){
P0 = 0xFF;
if(mode==0){
switch(i){
case 0:P0 = SEG[sec%10]&0x7F;P2 = 0xFE; break;
case 1:P0 = SEG[sec/10];P2 = 0xFD; break;
case 2:P0 = SEG[min%10]&0x7F;P2 = 0xFB; break;
case 3:P0 = SEG[min/10];P2 = 0xF7; break;
case 4:P0 = SEG[hour%10]&0x7F;P2 = 0xEF; break;
case 5:P0 = SEG[hour/10];P2 = 0xDF; break;
}
}
if(mode==1){
switch(i){
case 0:P0 = SEG[sec%10]|flash;P2 = 0xFE; break;
case 1:P0 = SEG[sec/10]|flash;P2 = 0xFD; break;
case 2:P0 = SEG[min%10]&(0x7F|flash);P2 = 0xFB; break;
case 3:P0 = SEG[min/10];P2 = 0xF7; break;
case 4:P0 = SEG[hour%10]&(0x7F|flash);P2 = 0xEF; break;
case 5:P0 = SEG[hour/10];P2 = 0xDF; break;
}
}
if(mode==2){
switch(i){
case 0:P0 = SEG[sec%10]&(0x7F|flash);P2 = 0xFE; break;
case 1:P0 = SEG[sec/10];P2 = 0xFD; break;
case 2:P0 = SEG[min%10]|flash;P2 = 0xFB; break;
case 3:P0 = SEG[min/10]|flash;P2 = 0xF7; break;
case 4:P0 = SEG[hour%10]&(0x7F|flash);P2 = 0xEF; break;
case 5:P0 = SEG[hour/10];P2 = 0xDF; break;
}
}
if(mode==3){
switch(i){
case 0:P0 = SEG[sec%10]&(0x7F|flash);P2 = 0xFE; break;
case 1:P0 = SEG[sec/10];P2 = 0xFD; break;
case 2:P0 = SEG[min%10]&(0x7F|flash);P2 = 0xFB; break;
case 3:P0 = SEG[min/10];P2 = 0xF7; break;
case 4:P0 = SEG[hour%10]|flash;P2 = 0xEF; break;
case 5:P0 = SEG[hour/10]|flash;P2 = 0xDF; break;
}
}
if(mode==4){
switch(i){
case 0:P0 = SEG[sec%10]&0x7F;P2 = 0xFE; break;
case 1:P0 = SEG[sec/10];P2 = 0xFD; break;
case 2:P0 = SEG[min%10]&0x7F;P2 = 0xFB; break;
case 3:P0 = SEG[min/10];P2 = 0xF7; break;
case 4:P0 = SEG[hour%10]&0x7F;P2 = 0xEF; break;
case 5:P0 = SEG[hour/10];P2 = 0xDF; break;
}
}
i++;
if(i>=6) i=0;
}
void main(void){
EA=1;
ET0=1;
TMOD=0x01;
TL0 = (65536-10000)%256;
TH0 = (65536-10000)/256;
TR0=1;
while(1){
key();
display();
}
}
void t0(void) interrupt 1{
TL0 = (65536-10000)%256;
TH0 = (65536-10000)/256;
cp++;
cp1++;
if(cp1>=50)
{
cp1=0;
flash = ~flash;
}
if(cp>=100){
cp=0;
sec++;
if(sec>59){
sec=0;
min++;
if(min>59){
min=0;
hour++;
if(hour>23){
hour=0;
}
}
}
}
}
上了那么多课,0-9的16进制要能熟练打出来,不能考试的时候还看手机
还不完善,缺少定时,并且调整的时候表并不走,需要在interrupt函数里再加一个对mode的判断,也要加变量
定时功能:可以定时与分,秒不定,hour_d与min_d,到时间亮灯或响铃
以上是需要完善的
总结最近:
1.不能关了灯再玩手机了,对眼睛伤害太大了!
2.以前写的CSDN里好多没有解决的问题,计划11.20之前解决
3.下周要考核,妈呀还没开始复习,擦,快忘光了,11.13-11.16复习类接口那一块
4.每天一道算法题,11.19号要更新五道题,在这立个flag,和xl还有yx组队比赛不能拖后腿
5.十月底做的那套四级卷子还没有认真订错,每天认真订错一个题型并展开复习,并且背单词
6.校园跑校园跑校园跑!
7.部门工作加到手机便签里
8.复习计组与数据库,计网上课的时候看看前面的
结合课表计划
9.省点钱吧
10.前端的课一直没看啊啊啊啊
11.通知培训赶快开了
12.天天开心