普发单片机,多功能时钟

实现功能

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){
                            
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值