找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10246|回复: 7
收起左侧

138译码器控制的数码管时钟(超级详细精简)

[复制链接]
ID:63918 发表于 2014-7-12 22:11 | 显示全部楼层 |阅读模式
#include<reg51.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;
int  b=0;//有符号标志位
uint8  gewei;//个位
uint8  shiwei;//十位
uint8  a[6];  //用来存储时,分,秒的个位和十位的"动态数组"
uint8 code number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint8  keyNum=0;//按键扫描后得到的键值从1到16
static uint8 miao=0;//秒
static uint8 fen=30;//分
static uint8 shi=12;//时
uint16 counter;
sbit ADDR0=P2^2;
sbit ADDR1=P2^3;
sbit ADDR2=P2^4;
void delay()/***********************延时函数*****************************/
{
        uint16 i=800;

        while (i--);
}
void timer1_init()/*****************定时器1初始化***********************/
{
        TMOD|=0X10 ;
        TMOD&=0XDF;
        TH1=0XFC;
        TL1=0X67;
        TR1=1;
}                          
void int_init()/*********************定时器1溢出中断初始化**************/
{
        ET1=1;
        EA=1;
}
void key_deal()/*********************每个按键对应的单击事件(共4*4=16个按键)********/
{
        switch(keyNum)
        {
                case 1 :switch(b)//数字0
                                {
                                        case 1:miao=miao/10*10+0;break;
                                        case 2:miao=miao%10+0*10;break;
                                        case 3:fen=fen/10*10+0; break;
                                        case 4:fen=fen%10+10*0; break;
                                        case 5:shi=shi/10*10+0; break;
                                        case 6:shi=shi%10+10*0; break;
                                        default:break;
                                }       
                                break;
                case 2 : switch(b)//+加号键
                                 {
                                         case 0:break;
                                        case 1:shiwei=miao/10;gewei=miao%10;if(gewei==9)  gewei=0; else gewei++; miao=shiwei*10+gewei;keyNum=0;break;
                                        case 2:shiwei=miao/10;gewei=miao%10;if(shiwei==5) shiwei=0;else shiwei++;miao=shiwei*10+gewei;keyNum=0;break;
                                        case 3:shiwei=fen/10; gewei=fen%10; if(gewei==9)  gewei=0; else gewei++; fen=shiwei*10+gewei;keyNum=0; break;
                                        case 4:shiwei=fen/10; gewei=fen%10; if(shiwei==5) shiwei=0;else shiwei++;fen=shiwei*10+gewei;keyNum=0; break;
                                        case 5:shiwei=shi/10; gewei=shi%10;
                                                                                                                if(shiwei<2&&gewei<9)  {gewei++; goto zz1;}
                                                                                                                if(shiwei<2&&gewei==9) {gewei=0; goto zz1;}
                                                                                                                if(shiwei>1&&gewei==3) {gewei=0; goto zz1;}
                                                                                                                if(shiwei>1&&gewei<3)  {gewei++; goto zz1;}
                                                                                                                zz1:
                                                                                 shi=shiwei*10+gewei;keyNum=0;                                      break;
                                        case 6:shiwei=shi/10; gewei=shi%10; if(gewei<4&&shiwei==2) {shiwei=0; goto zz2;}
                                                                                                                if(gewei<4&&shiwei<2)  {shiwei++; goto zz2;}
                                                                                                                if(gewei>3&&shiwei==1) {shiwei=0; goto zz2;}
                                                                                                                if(gewei>3&&shiwei<1)  {shiwei++; goto zz2;}
                                                                                                                zz2:                                       
                                                                                                shi=shiwei*10+gewei;keyNum=0;                                                                        break;
                                        default :break;
                                 }
                                 break;
               
                case 3 :switch(b)//-减号键
                                 {
                                         case 0:break;
                                        case 1:shiwei=miao/10;gewei=miao%10;if(gewei==0)  gewei=9; else gewei--; miao=shiwei*10+gewei;keyNum=0;break;
                                        case 2:shiwei=miao/10;gewei=miao%10;if(shiwei==0) shiwei=5;else shiwei--;miao=shiwei*10+gewei;keyNum=0;break;
                                        case 3:shiwei=fen/10; gewei=fen%10; if(gewei==0)  gewei=9; else gewei--; fen=shiwei*10+gewei;keyNum=0; break;
                                        case 4:shiwei=fen/10; gewei=fen%10; if(shiwei==0) shiwei=5;else shiwei--;fen=shiwei*10+gewei;keyNum=0; break;
                                        case 5:shiwei=shi/10; gewei=shi%10; if(shiwei<2&&gewei==0) {gewei=9; goto xx1;}
                                                                                                                if(shiwei<2&&gewei>0)  {gewei--; goto xx1;}
                                                                                                                if(shiwei>1&&gewei==0) {gewei=3; goto xx1;}
                                                                                                                if(shiwei>1&&gewei>0)  {gewei--; goto xx1;}
                                                                                                                xx1:
                                                                                shi=shiwei*10+gewei;keyNum=0;                                                                    break;
                                        case 6:shiwei=shi/10; gewei=shi%10; if(gewei<4&&shiwei==0) {shiwei=2; goto xx2;}
                                                                                                                if(gewei<4&&shiwei>0)  {shiwei--; goto xx2;}
                                                                                                                if(gewei>3&&shiwei==0) {shiwei=1; goto xx2;}
                                                                                                                if(gewei>3&&shiwei>0)  {shiwei--; goto xx2;}
                                                                                                                xx2:
                                                                                                                shi=shiwei*10+gewei;keyNum=0;                                                                            break;
                                        default :break;
                                 }
                                 break;
                case 5 :switch(b)//数字3
                                {
                                        case 1:miao=miao/10*10+3;break;
                                        case 2:miao=miao%10+3*10;break;
                                        case 3:fen=fen/10*10+3; break;
                                        case 4:fen=fen%10+10*3; break;
                                        case 5:shi=shi/10*10+3; break;
                                       
                                        default:break;
                                }               
                                break;
                case 6 :switch(b)//数字6
                                {
                                        case 1:miao=miao/10*10+6;break;
                                       
                                        case 3:fen=fen/10*10+6; break;
                                       
                                        case 5:if(shi/10<2) shi=shi/10*10+6; break;
                                       
                                        default:break;
                                }                       
                                break;
                case 7:switch(b)//数字9
                                {
                                        case 1:miao=miao/10*10+9;break;
                                       
                                        case 3:fen=fen/10*10+9; break;
                                       
                                        case 5:if(shi/10<2) shi=shi/10*10+9; break;
                                       
                                        default:break;
                                }                               
                                break;
                case 9 :switch(b)//数字2
                                {
                                        case 1:miao=miao/10*10+2;break;
                                        case 2:miao=miao%10+2*10;break;
                                        case 3:fen=fen/10*10+2; break;
                                        case 4:fen=fen%10+10*2; break;
                                        case 5:shi=shi/10*10+2; break;
                                        case 6:if(shi%10<4) shi=shi%10+10*2; break;
                                        default:break;
                                }               
                                break;
                case 10 :switch(b)//数字5
                                {
                                        case 1:miao=miao/10*10+5;break;
                                        case 2:miao=miao%10+5*10;break;
                                        case 3:fen=fen/10*10+5; break;
                                        case 4:fen=fen%10+10*5; break;
                                        case 5:if(shi/10<2) shi=shi/10*10+5; break;
                                       
                                        default:break;
                                }               
                                break;
                case 11:switch(b)//数字8
                                {
                                        case 1:miao=miao/10*10+8;break;
                                       
                                        case 3:fen=fen/10*10+8; break;
                                       
                                        case 5:if(shi/10<2) shi=shi/10*10+8; break;
                                       
                                        default:break;
                                }                               
                                break;
                case 12: --b;if(b<0) b=6; keyNum=0;break;//移位键,向右移一位
                case 13 :switch(b)//数字1
                                {
                                        case 1:miao=miao/10*10+1;break;
                                        case 2:miao=miao%10+1*10;break;
                                        case 3:fen=fen/10*10+1; break;
                                        case 4:fen=fen%10+10*1; break;
                                        case 5:shi=shi/10*10+1; break;
                                        case 6:shi=shi%10+10*1; break;
                                        default:break;
                                }               
                                break;
                case 14 :switch(b)//数字4
                                {
                                        case 1:miao=miao/10*10+4;break;
                                        case 2:miao=miao%10+4*10;break;
                                        case 3:fen=fen/10*10+4; break;
                                        case 4:fen=fen%10+10*4; break;
                                        case 5:if(shi/10<2) shi=shi/10*10+4; break;
                                       
                                        default:break;
                                }               
                                break;
                case 15:switch(b)//数字7
                                {
                                        case 1:miao=miao/10*10+7;break;
                                       
                                        case 3:fen=fen/10*10+7; break;
                                       
                                        case 5:if(shi/10<2) shi=shi/10*10+7; break;
                                       
                                        default:break;
                                }                               
                                break;
                case 16: ++b;if(b>6) b=0; keyNum=0;break;//移位键,向左移一位
                default:break;
        }
}
void refresh_led()/***************************数码管刷新函数************************/
{
        static uint8 j=0;
        switch(j)
        {
                case 0:if(b==1){ADDR0=0;ADDR1=0;ADDR2=0;j++;if(counter<500) P0=number[a[0]]; else P0=0x00;}
               else{ADDR0=0;ADDR1=0;ADDR2=0;j++;P0=number[a[0]];}break;
                case 1:if(b==2){ADDR0=1;ADDR1=0;ADDR2=0;j++;if(counter<500) P0=number[a[1]]; else P0=0x00;}
                           else{ADDR0=1;ADDR1=0;ADDR2=0;j++;P0=number[a[1]];}break;

                case 2:ADDR0=0;ADDR1=1;ADDR2=0;j++;P0=0x40;break;

                case 3:if(b==3){ADDR0=1;ADDR1=1;ADDR2=0;j++;if(counter<500) P0=number[a[2]]; else P0=0x00;}
                           else{ADDR0=1;ADDR1=1;ADDR2=0;j++;P0=number[a[2]];}break;
                case 4:if(b==4){ADDR0=0;ADDR1=0;ADDR2=1;j++;if(counter<500) P0=number[a[3]]; else P0=0x00;}
                           else{ADDR0=0;ADDR1=0;ADDR2=1;j++;P0=number[a[3]];}break;
               
                case 5:ADDR0=1;ADDR1=0;ADDR2=1;j++;P0=0x40;break;
               
                case 6:if(b==5){ADDR0=0;ADDR1=1;ADDR2=1;j++;if(counter<500) P0=number[a[4]];else P0=0x00;}
               else{ADDR0=0;ADDR1=1;ADDR2=1;j++;P0=number[a[4]];}break;
                case 7:if(b==6){ADDR0=1;ADDR1=1;ADDR2=1;j=0;if(counter<500) P0=number[a[5]]; else P0=0x00;}
               else{ADDR0=1;ADDR1=1;ADDR2=1;j=0;P0=number[a[5]];}break;
                default:break;
        }       
}
void key_scan()/*********************矩阵键盘扫描函数***********************************************/
{
        uint8 hang,lie,tmp1,tmp2;
        tmp1=0x01;//0000   0001
        for(lie=0;lie<4;lie++)
        {
                P1=0xf0;
                P1=~tmp1;
                tmp1*=2;
                if((P1&0xf0)<0xf0)
                delay();
                if((P1&0xf0)<0xf0)
                {
                        tmp2=0x10;
                        for(hang=0;hang<4;hang++)
                        {
                                if((P1&tmp2)==0x00)
                                {
                                        keyNum=lie*4+hang+1;
                                        return;
                                }
                                tmp2*=2;
                        }
                }
        }
       
        key_deal();               
}
void interrupt_timer1() interrupt 3/*******************定时器1溢出中断*****************/
{
          
       
        TH1=0XFC;
        TL1=0X67;
        counter++;
        if(counter==1000)
        {
                counter=0;
                if(b!=0) goto cc;
                miao++;
                cc:
                if(miao==60)
                {
                        miao=0;
                        fen++;
                }
                if(fen==60)
                {
                         fen=0;
                        shi++;
                }
                if(shi>23)
                {
                        shi=0;
                }
                a[0]=miao%10;
                a[1]=miao/10;
                a[2]=fen%10;
                a[3]=fen/10;
                a[4]=shi%10;
                a[5]=shi/10;

        }
       
    refresh_led();
}
//////////////////LCD1602显示

sbit RS = P2^6 ;
sbit RW = P2^5 ;
sbit EN = P2^7 ;
sbit BUSY = P0^7;


unsigned char code word1[]={"Hi,teacher wan!"};
unsigned char code word2[]={"made by Mr GUO"};


/**
* 等待繁忙标志
*/
void wait(void)
{
        P0 = 0xFF;

       
        do
        {
                RS = 0;
                RW = 1;
                EN = 0;
                EN = 1;
        }while (BUSY == 1);
        EN = 0;
}

/**
* 写数据
*/
void w_dat(uint8 dat)
{
        wait();
        EN = 0;
        P0 = dat;
        RS = 1;
        RW = 0;
        EN = 1;
        EN = 0;
}

/**
* 写命令
*/
void w_cmd(uint8 cmd)
{
        wait();
        EN = 0;
        P0 = cmd;
        RS = 0;
        RW = 0;
        EN = 1;
        EN = 0;
}

/**
* 发送字符串到LCD
*/
void w_string(uint8 addr_start, uint8 *p)
{
        w_cmd(addr_start);
        while (*p != '\0')
        {
                w_dat(*p++);
        }
}


/**
* 初始化1602
*/
void Init_LCD1602(void)
{
        w_cmd(0x38);  // 16*2显示,5*7点阵,8位数据接口
        w_cmd(0x0C);  // 显示器开、光标开、光标允许闪烁
        w_cmd(0x06);  // 文字不动,光标自动右移
        w_cmd(0x01);  // 清屏
}
void main()/*****************************主函数******************/
{       
        Init_LCD1602();
        w_string(0x80,word1);
        w_string(0xC0,word2);
        timer1_init();
        int_init();
        while(1)
        {       
                key_scan();
        }       
}


回复

使用道具 举报

ID:1 发表于 2014-7-13 01:03 | 显示全部楼层
好东西  顶啊 要是有电路图就更好了
回复

使用道具 举报

ID:63918 发表于 2014-7-13 21:24 | 显示全部楼层
恩恩,好论坛,以后我也开发扬我为人人,人人为我的精髓
回复

使用道具 举报

ID:67573 发表于 2014-10-23 08:47 | 显示全部楼层
在哪里呀
回复

使用道具 举报

ID:84566 发表于 2015-7-23 14:36 | 显示全部楼层
可以说一下编程的思想吗
回复

使用道具 举报

ID:94340 发表于 2015-11-1 19:58 | 显示全部楼层
怎么没有电路图呢
回复

使用道具 举报

ID:191450 发表于 2017-5-1 16:30 | 显示全部楼层

 楼主能分享一下原理图吗?
回复

使用道具 举报

ID:474538 发表于 2019-11-29 01:27 | 显示全部楼层
有没有原理图啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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