实现功能
1、跑表,可以记录,最多可以记录15个
2、倒计时表
3、闹钟
4、正常时钟
用到的键盘
左下方四个小按键:调时、闹钟、关闭铃声
矩阵键盘:
0 1 2 3
4 5 6 7
8 9 a b
c d e f
0:清零跑表(在时钟状态下)
暂停跑表(跑表状态)
1:开始跑表
2:记录跑表
3:退出跑表
4:查看记录(倒叙查看)
8:进入倒计时表
9、a、b、c、e、f:小时、分钟和秒的调时
e:开始倒计时
代码如下(在普发单片机中可以直接跑):
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
//矩阵键盘输出 端口
#define GPIO_KEY P1
unsigned char value;
//用来存放读取到的键值
unsigned char KeyState; //记录按键的状态,0没有,1有
unsigned char jishiState = 0;//用来判断是否在计时状态
unsigned char daojishi = 0;//用来判断是否在倒计时状态
sbit led=P2^0;
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
sbit beep=P1^5;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit dian=P0^7;
//lsa lsb lsc 用来选择显示的数码管
u8 value,alarmexist=0;
u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00};//段选码,分别对应0到无
u16 cnt=0,i=0,j=0,flag=0,ji=0,zhizhen=0,time[8]={0,0,0,0,0,0,0,0};//只用数码管0,1 3,4 6,7
u16 alarm[8]={0,0,0,0,0,0,1,0}, chucun[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
u16*p;
u8 ssec,sec,min;
u16 jisuan[8] = {0,0,0,0,0,0,0,0};
u8 tth0, ttl0;
u8 coun;
void delay(u16 mmp);
void t0andt1init();
void addproct(int x);
void addproca(int x);
void reduceproct(int x);
void reduceproca(int x);
void keyscan();
void jia();
void jian();
void KeyDown(); //检测按键函数
void Delay10ms(); //延时10ms
void clear();//把时间清零准备计时
void DigDisplay();
void datapros();
u16 outputMS();
void outputSGM(u16 num);
void main()
{
led=0;
t0andt1init();
P0=0x00;
while(1)
{
if(time[0]==alarm[0]&&time[1]==alarm[1]&&time[3]==alarm[3]&&time[4]==alarm[4]&&time[6]==alarm[6]&&time[7]==alarm[7])//满足条件 蜂鸣器以一定的时间间隔响,只到K4按键并松开,此时数码管任然正常显示当前时间
{
alarmexist=0;
while(k4)
{
beep=~beep;
delay(25);
beep=~beep;
delay(25);
}
}
keyscan();
KeyDown();
if(KeyState == 1){
switch(value){
case 0:
TR0 = 0;
ssec = 0;
sec = 0;
min = 0;
zhizhen = 0;
datapros();
lsa=0;lsb=0;lsc=0;P0=smgduan[0];
break;
case 1:
jishiState = 1;
TR0 = 1;
while(1){
datapros();
DigDisplay();
KeyDown();
if(value == 2 && zhizhen < 15 && KeyState == 1){
TR0 = 0;
chucun[zhizhen] = outputMS();
TR0 = 1;
zhizhen++;
KeyState = 0;
}
if(value == 3&& KeyState == 1){
jishiState = 0;
if(TR0 == 0)
TR0 = 1;
break;
}
if(value == 0&& KeyState == 1){
tth0 = TH0;
ttl0 = TL0;
TR0 = 0;
KeyState = 0;
}
if(value == 1&& KeyState == 1){
TH0 = tth0;
TL0 = ttl0;
if(TR1 == 1){