久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11061|回復: 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();
        }       
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2014-7-13 01:03 | 只看該作者
好東西  頂啊 要是有電路圖就更好了
回復

使用道具 舉報

板凳
ID:63918 發表于 2014-7-13 21:24 | 只看該作者
恩恩,好論壇,以后我也開發揚我為人人,人人為我的精髓
回復

使用道具 舉報

地板
ID:67573 發表于 2014-10-23 08:47 | 只看該作者
在哪里呀
回復

使用道具 舉報

5#
ID:84566 發表于 2015-7-23 14:36 | 只看該作者
可以說一下編程的思想嗎
回復

使用道具 舉報

6#
ID:94340 發表于 2015-11-1 19:58 | 只看該作者
怎么沒有電路圖呢
回復

使用道具 舉報

7#
ID:191450 發表于 2017-5-1 16:30 | 只看該作者

 樓主能分享一下原理圖嗎?
回復

使用道具 舉報

8#
ID:474538 發表于 2019-11-29 01:27 | 只看該作者
有沒有原理圖啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区二区三区在线 | 在线国产视频观看 | 成人无遮挡毛片免费看 | 中文字幕第一页在线 | 国产成人精品一区二区三区四区 | www.免费看片.com | 天天干.com | 久久久久久91 | 99riav3国产精品视频 | 在线视频 欧美日韩 | 一区二区三区亚洲视频 | 久久国产香蕉 | 精品美女视频在免费观看 | 日韩福利在线 | 欧美二区在线 | 天天夜碰日日摸日日澡 | 精品成人一区二区 | 日韩在线免费视频 | 91视频亚洲 | 日韩欧美在线视频观看 | 日本一区二区视频 | 久久99精品久久久水蜜桃 | 精品国产一区二区三区日日嗨 | 亚洲综合久久久 | 日韩欧美国产一区二区三区 | 欧美一级片在线播放 | 日韩综合| 精品一区二区三区免费毛片 | 欧美一级免费看 | 欧美激情精品久久久久久 | aaa在线| 91精品国产91久久综合桃花 | 亚洲欧美精品在线 | 久久久久国产一区二区三区 | 黄免费在线 | 精品国产91乱码一区二区三区 | 午夜精品久久久久久 | 精品在线一区 | 色婷婷综合成人av | 成人一区二 | 国产毛片视频 |