找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1275|回复: 0
打印 上一主题 下一主题
收起左侧

单片机开发板制作可按键控制 倒计时( 含数显)

[复制链接]
跳转到指定楼层
楼主
ID:765212 发表于 2020-5-30 18:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uint  unsigned int
#define ucahr unsigned char
#define key P1        

sbit  LSA=P2^2;
sbit  LSB=P2^3;
sbit  LSC=P2^4;
sbit  beep=P1^5;

uint hour,min,sec;
ucahr date[8];
ucahr a;
uint code table[16]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴

void  delay(uint x)
{
                uint i,j;
                for(i=0;i<x;++i)
                        for(j=0;j<110;++j);
}
/******************************************************************
函数:init
功能:初始化
******************************************************************/
void init()
{
        TMOD=0x21;  //定时器0模式,使用工作方式1
               
        TH0=(65536-50000)/256;//赋予初值 50ms
        TL0=(65536-50000)%256;
        EA=1;
        ES=1;
        ET0=1;  //打开定时器,容许中断
        TR0=1; //打开终中断
//串口中断设置
        SCON=0X50;
        //TMOD=0X20;
        PCON=0X80;
        TH1=0Xf3;
        TL1=0Xf3;
        TR1=1;
        
        hour=1;
        min=1;
        sec=5;
}

/******************************************************************
函数:display
功能:1\数码管数显 2输入时分秒进行数显
/******************************************************************/
void dispiay()
{
        ucahr v;
        //微位选打开所有数码管
                for(v=0;v<8;v++)
                {
                        switch(v)
                        {
                                case 0 :
                                        LSA=1;LSB=1;LSC=1;break;
                                case 1 :
                                        LSA=0;LSB=1;LSC=1;break;
                                case 2 :
                                        LSA=1;LSB=0;LSC=1;break;
                                case 3 :
                                        LSA=0;LSB=0;LSC=1;break;
                                case 4 :
                                        LSA=1;LSB=1;LSC=0;break;
                                case 5 :
                                        LSA=0;LSB=1;LSC=0;break;
                                case 6 :
                                        LSA=1;LSB=0;LSC=0;break;
                                case 7 :
                                        LSA=0;LSB=0;LSC=0;break;
                        }

                        P0=date[v];
                        delay(1);        
                        P0=0x00;
                }
}        

void  datepros()
{
  date[0]=table[hour/10];
        date[1]=table[hour%10];
        date[2]=0x40;        
        date[3]=table[min/10];
        date[4]=table[min%10];
        date[5]=0x40;
        date[6]=table[sec/10];
        date[7]=table[sec%10];
        
}
/***********************************************
函数:timer0  interrupt  1
功能:定时0 中环函数
************************************************/

void timer0 () interrupt 1
{
        ucahr t0;

        TH0=(65536-50000)/256;//赋予初值 50ms
        TL0=(65536-50000)%256;
        t0++;//五十毫秒为基础单位,20此后达到一秒,进行时分秒的换换算

        if(t0==20)
        {
                t0=0;
                if(sec==0)//对清清零情况进行判定
                {
                        if(hour==0&&min==0&&sec==0)
                                sec=0;
                        else
                        {
                                sec=59;
                                min--;
                        }
                }
                else//用以实现功能
                        sec--;        
        
                if(sec<0)//对秒的情况进行判定
                {
                        //sec=59;
                        if(hour==0&&min==0)
                        {
                                hour=0;
                                min=0;
                                sec=0;
                        }               
                        else           //n套入对分的判定
                        {
                                if(min>0)
                                        min--;
                                else
                                {
                                        min=59;
                                        if(hour!=0)
                                                hour--;
                                }
                        }
                        
                        
                        if(min<0)//对分钟的判定
                        {
                                if(hour==0)  //倒计时情况
                                {
                                        min=0;
                                        hour=0;
                                }        
                                else  //对分钟及前位的操作
                                {
                                        min=59;
                                        hour--;
                                }
                                
                  }
          }
        }        
        
        if(sec==0&&min==0&&hour!=0)
        {
                hour--;
                min=59;
                sec=59;                        
        }
               
        if(hour==0&&min==0&&sec==0)
        {        
                beep=~beep;
                //delay(1);
        }        
}




/***********************************************
函数;keydown
功能;扫描对应矩阵按键,服赋予按键不同功能
*******************************************/
void keydown(void)
{
        uint k1;
        //uchar a;
        key=0x0f;
        if(key!=0x0f)
        {
                        //waterfall_display();
                        delay(10);
                        if(key!=0x0f)
                        
                        {
                                        key=0X0F;//开列
                                        switch(key)
                                        {
                                                case 0x07:k1=0;
                                                        break;
                                                case 0x0b:k1=1;
                                                        break;
                                                case 0x0d:k1=2;
                                                        break;
                                                case 0x0e:k1=3;
                                                        break;
                                        }
                                        key=0xf0;//开行
                                        switch(key)
                                        {
                                                case 0x70:k1=k1;
                                                        break;
                                                case 0xb0:k1=k1+4;
                                                        break;
                                                case 0xd0:k1=k1+8;
                                                        break;
                                                case 0xe0:k1=k1+12;
                                                        break;
                                        }               
                        }               
                //while((key!=0xf0)&&(a<50))
                        while(key!=0xf0)
                {
                        delay(10);
                //        a++;
                }        
        }
//赋予按键功能
    //0.1.2.3分别控制第一二位(时)
        //4.5.6.7分别控制第三四位(分)
        //8.9.10.11   控制七八位(秒)
        //12.13.14.15 清空时,分,秒,全部
        if(k1==0)
        {
                hour=hour+10;
        }
        if(k1==1)
        {        
                if(hour>=10)
                hour=hour-10;
                else
                hour=0;        
        }        
        if(k1==2)
                hour++;
        if(k1==3)
        {
                if(hour>=1)
    hour--;
                else
                hour=0;
        }
        if(k1==4)
        {
                min=min+10;
                if(min>=60)
                        min=min-60;
        }
        if(k1==5)
        {
                if(min>=10)
                        min=min-10;
                else
                {
                        if(min==0)
                                min=50;
                        else
                                min=60-min;
          }
        }
        if(k1==6)
        {
                min++;
                if(min>=60)
                        min=60-min;
        }        
        if(k1==7)
        {
                if(min>=1)
                        min--;
                else
                        min=59;
        }
        if(k1==8)
        {
                sec=sec+10;
                if(sec>=60)
                        sec=sec-60;
        }
        if(k1==9)
        {
                if(sec>10)
                        sec=sec-10;
                else
                {
                        if(sec==0)
                                sec=50;
                        else
                         sec=60-sec;
                }
        }
        if(k1==10)
        {
                sec++;
                if(sec>=60)
                        sec=sec-60;
        }
        if(sec==11)
        {

                if(sec>=1)
                        sec--;
                else
                {
                        if(sec==0)
                                sec=59;
                        else
                         sec=60-sec;
                }
        }
        if(k1==12)
                hour=0;
        if(k1==13)
                min=0;
        if(k1==14)        
                sec=0;
        if(k1==15)
        {
                hour=0;
                min=0;
                sec=0;
        }
}

/***********************************************
函数;chuankou
功能;利用上位机直接修改数值
********************************************/
void Usr() interrupt 4
{
        uint re;
        //ucahr re1;
        //ucahr re2;
        
        re=SBUF;
        RI=0;
        SBUF=re;
        while(TI==0);
        TI=0;
        a++;
        
        re=re/16*10+re%16;

        if(a==1)
                hour=re;
        if(a==2)
                min=re;
        if(a==3)
        {        
                sec=re;
                a=0;
        }
}

/************************************************
主函数
*************************************************/
void main()
{
        init();
        while(1)
        {
                keydown();  //矩阵扫描并修改数值
                datepros();//产传送数值到数组内
                dispiay();//数显

        }
}


普中的板子
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表