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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11602|回復: 4
打印 上一主題 下一主題
收起左側

LCD1602顯示時間年月日優化及顯示星期問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:160658 發表于 2017-1-17 21:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己總覺得程序有待優化,且星期顯示有問題,對7求余為0時,星期不變化,請高手給予指點,謝謝!
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit EP = P3^2; //使能端
sbit RW = P3^1; //數據/命令選擇端
sbit RS = P3^0; //讀寫選擇端
sbit KEY_1 = P3^4;          //設置模式選擇
sbit KEY_2 = P3^5;          //

static uint code table1[] = {0, 31, 59, 90, 120, 151,181, 212, 242, 273, 303, 334};
static uchar code *Week[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
uchar sec = 0, hour = 12, minu = 0;
uchar count = 0, week = 0; month = 1, day = 1;

void T0_Init()
{
        ET0 = 1;
        TMOD = 0x01;
        TH0 = (65536 - 46071)/256;
        TL0 = (65536 - 46071)%256;
        TR0 = 1;
}

void delay(uint ms)
{
        uint i, j;
       
        for(i=ms; i>0; i--)
                for(j=110; j>0; j--);
}

void Lcd_Ready() //測忙函數
{
        uchar sta;

        RS = 0;
        RW = 1;
        do {
                EP = 1;
                sta = P1;
                EP = 0;
        }while(sta & 0x80);         //檢測P1最高位是否為1,若為1,則1602忙,為0則可以讀寫操作
}
void Write_Cmd(uchar cmd) //寫入命令
{
        Lcd_Ready();
        RS = 0;
        RW = 0;
        P1 = cmd;
        delay(5);
        EP = 1;
        delay(5);
        EP = 0;
}

void Write_Dat(uchar dat) //寫入數據
{
        Lcd_Ready();  //LCD1602 不忙則跳出
        RS = 1;
        RW = 0;
        P1 = dat;
        delay(5);
        EP = 1;
        delay(5);
        EP = 0;
}

void Write_Week(uchar day, uchar month)                        //星期與日期同步
{
        week = (table1[(month - 1)] + day - 1);
        week = week % 7;
        Write_Cmd(0x80 + 12);                  
        while(*Week[week] != '\0')
                Write_Dat(*Week[week]++);

}

void Write_Num(uchar x, uchar y, uchar num) //將時分秒和日期寫入1602
{
        uchar unit, decad;

        unit = num % 10;
        decad = num /10;
        if(y == 1)
        {
                Write_Cmd(0x80 + 0x40 + x);
                Write_Dat(0x30 + decad);         //即加48,將數字轉換為ASC||字符數字
                Write_Dat(0x30 + unit);
        }
        else
        {
                Write_Cmd(0x80 + x);
                Write_Dat(0x30 + decad);
                Write_Dat(0x30 + unit);
        }
}

void Lcd_Init()          //LCD初始化設定
{
        Write_Cmd(0x38); // 16*2顯示,5*7點陣,8位數據
        Write_Cmd(0x0c); // 顯示開,關光標
        Write_Cmd(0x06); // 讀寫地址自動加1,光標加1
        Write_Cmd(0x01); //清除屏幕
}

void Display()  //
{
        Write_Week(day, month);
        Write_Num(9, 0, day);
        Write_Num(6, 0, month);
        Write_Num(4, 1, hour);
        Write_Num(7, 1, minu);
        Write_Num(10, 1, sec);
        Write_Cmd(0x80 + 0x40 + 6);
        Write_Dat(':');
        Write_Cmd(0x80 + 0x40 + 9);
        Write_Dat(':');
}

void TimerCount()
{
        if(count == 20)
        {
                count = 0;
                sec++;
                if(sec == 60)
                {
                        sec = 0;
                        minu++;
                         if(minu == 60)
                        {
                                minu = 0;
                                hour++;
                                 if(hour == 24)
                                {
                                        hour = 0;
                                        day++;
                                        week++;
                                        if(week == 7)
                                                week = 0;
                                        switch(month)
                                        {
                                                case 1:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                       
                                                                break;
                                                        }
                                                case 2:
                                                        if(day == 29)
                                                        {
                                                                day = 0;
                                                                month++;
                                                       
                                                                break;
                                                        }
                                                case 3:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                                Write_Num(6, 0, month);
                                                                break;
                                                        }
                                                case 4:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 5:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 6:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 7:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 8:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                       
                                                                break;
                                                        }
                                                case 9:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 10:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 11:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                                Write_Num(6, 0, month);
                                                                break;
                                                        }
                                                case 12:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month = 1;
                                                                Write_Num(6, 0, month);
                                                                break;
                                                        }
                                        }
                                       
                                }
                               
                        }
                       
                }
                Display();
        }
}

void KeyScan()
{
        static uchar key1cnt = 0;                //KEY_1按下的次數
       
        if(KEY_1 == 0)
        {
                delay(10);
                if(KEY_1 == 0)
                {
                        key1cnt++;
                        while(!KEY_1);
                        switch(key1cnt)
                        {
                                case 1:
                                        TR0 = 0;
                                        Write_Cmd(0x80 + 0x40 + 5);
                                        Write_Cmd(0x0F);            //顯示光標且光標閃爍
                                        break;
                                case 2:
                                        Write_Cmd(0x80 + 0x40 + 8);       
                                        break;
                                case 3:
                                        Write_Cmd(0x80 + 0x40 + 11);       
                                        break;
                                case 4:
                                        Write_Cmd(0x80 + 7);
                                        break;
                                case 5:
                                        Write_Cmd(0x80 + 10);
                                        break;
                                case 6:
                                        TR0 = 1;
                                        Write_Cmd(0x0C);           //不顯示光標
                                        key1cnt = 0;
                                        break;
                        }
                }
        }
        if(key1cnt != 0)
        {
                if(KEY_2 == 0)
                {
                        delay(10);
                        if(KEY_2 == 0)
                        {
                                while(!KEY_2);
                                switch(key1cnt)
                                {
                                        case 1:
                                                hour++;
                                                if(hour == 24)
                                                        hour = 0;
                                                Write_Num(4, 1, hour);
                                                Write_Cmd(0x80 + 0x40 + 5);
                                                break;
                                        case 2:
                                                minu++;
                                                if(minu == 60)
                                                        minu = 0;
                                                Write_Num(7, 1, minu);
                                                Write_Cmd(0x80 + 0x40 + 8);
                                                break;
                                        case 3:
                                                sec++;
                                                if(sec == 60)
                                                        sec = 0;
                                                Write_Num(10, 1, sec);
                                                Write_Cmd(0x80 + 0x40 + 11);
                                                break;
                                        case 4:
                                                month++;
                                                if(month == 13)
                                                        month = 1;
                                                Write_Num(6, 0, month);
                                                Write_Cmd(0x80 + 7);
                                                break;
                                        case 5:
                                                day++;
                                                if(day == 32)
                                                        day = 1;
                                                Write_Num(9, 0, day);
                                                Write_Cmd(0x80 + 10);
                                                break;
                                }
                        }
                }
        }       
}

void main()
{
        uchar i = 0;
        uchar code table[] = {"2017-01-01 Sun"};
       
        EA = 1;
        Lcd_Init();                        //1602初始化
        T0_Init();          //定時器0初始化
       
        Write_Cmd(0x80 + 1);
        while(table[i] != '\0')
        {
                Write_Dat(table[i]);
                i++;
        }
        while(1)
        {
                KeyScan();
        }
}

void Timer0() interrupt 1
{
        TH0 = (65536 - 46071)/256;
        TL0 = (65536 - 46071)%256;
       
        count++;
        TimerCount();
       
}

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

使用道具 舉報

沙發
ID:89072 發表于 2018-8-31 15:51 | 只看該作者
/*作者:lern01 自己總覺得程序有待優化,且星期顯示有問題,對7求余為0時,星期不變化,請高手給予指點,謝謝!                                         **/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

/****
sbit rs=P3^5;
sbit lcden=P3^4;
sbit rw=P3^6;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^7;        //矩陣鍵盤         公共
*****/
sbit EP = P3^4; //使能端
sbit RW = P3^6; //數據/命令選擇端
sbit RS = P3^5; //讀寫選擇端
sbit KEY_1 = P3^0;          //設置模式選擇
sbit KEY_2 = P3^1;          //

static uint code table1[] = {0, 31, 59, 90, 120, 151,181, 212, 242, 273, 303, 334};
static uchar code *Week[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
uchar sec = 0, hour = 12, minu = 0;
uchar count = 0, week = 0; month = 1, day = 1;

void T0_Init()
{
        ET0 = 1;
        TMOD = 0x01;
        TH0 = (65536 - 46071)/256;
        TL0 = (65536 - 46071)%256;
        TR0 = 1;
}

void delay(uint ms)
{
        uint i, j;
        
        for(i=ms; i>0; i--)
                for(j=110; j>0; j--);
}


void Write_Cmd(uchar cmd) //寫入命令
{
       // Lcd_Ready();
        RS = 0;
        RW = 0;
                EP = 0;
        P0 = cmd;
        delay(5);
        EP = 1;
        delay(5);
        EP = 0;
}

void Write_Dat(uchar dat) //寫入數據
{
       // Lcd_Ready();  //LCD1602 不忙則跳出
        RS = 1;
        RW = 0;
                EP = 0;
        P0 = dat;
        delay(5);
        EP = 1;
        delay(5);
        EP = 0;
}

void Write_Week(uchar day, uchar month)                        //星期與日期同步
{
        week = (table1[(month - 1)] + day - 1);
        week = week % 7;
        Write_Cmd(0x80 + 12);                  
        while(*Week[week] != '\0')
                Write_Dat(*Week[week]++);

}

void Write_Num(uchar x, uchar y, uchar num) //將時分秒和日期寫入1602
{
        uchar unit, decad;

        unit = num % 10;
        decad = num /10;
        if(y == 1)
        {
                Write_Cmd(0x80 + 0x40 + x);
                Write_Dat(0x30 + decad);         //即加48,將數字轉換為ASC||字符數字
                Write_Dat(0x30 + unit);
        }
        else
        {
                Write_Cmd(0x80 + x);
                Write_Dat(0x30 + decad);
                Write_Dat(0x30 + unit);
        }
}

void Lcd_Init()          //LCD初始化設定
{
        Write_Cmd(0x38); // 16*2顯示,5*7點陣,8位數據
        Write_Cmd(0x0c); // 顯示開,關光標
        Write_Cmd(0x06); // 讀寫地址自動加1,光標加1
        Write_Cmd(0x01); //清除屏幕
                Write_Cmd(0x80);
}

void Display()  //
{
        Write_Week(day, month);
        Write_Num(9, 0, day);
        Write_Num(6, 0, month);
        Write_Num(4, 1, hour);
        Write_Num(7, 1, minu);
        Write_Num(10, 1, sec);
        Write_Cmd(0x80 + 0x40 + 6);
        Write_Dat(':');
        Write_Cmd(0x80 + 0x40 + 9);
        Write_Dat(':');
}

void TimerCount()
{
        if(count == 20)
        {
                count = 0;
                sec++;
                if(sec == 60)
                {
                        sec = 0;
                        minu++;
                         if(minu == 60)
                        {
                                minu = 0;
                                hour++;
                                 if(hour == 24)
                                {
                                        hour = 0;
                                        day++;
                                        week++;
                                        if(week == 7)
                                                week = 0;
                                        switch(month)
                                        {
                                                case 1:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                        
                                                                break;
                                                        }
                                                case 2:
                                                        if(day == 29)
                                                        {
                                                                day = 0;
                                                                month++;
                                                        
                                                                break;
                                                        }
                                                case 3:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                                Write_Num(6, 0, month);
                                                                break;
                                                        }
                                                case 4:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 5:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 6:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 7:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 8:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                        
                                                                break;
                                                        }
                                                case 9:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 10:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month++;
                                                               
                                                                break;
                                                        }
                                                case 11:
                                                        if(day == 31)
                                                        {
                                                                day = 0;
                                                                month++;
                                                                Write_Num(6, 0, month);
                                                                break;
                                                        }
                                                case 12:
                                                        if(day == 32)
                                                        {
                                                                day = 0;
                                                                month = 1;
                                                                Write_Num(6, 0, month);
                                                                break;
                                                        }
                                        }
                                       
                                }
                                
                        }
                        
                }
                Display();
        }
}

void KeyScan()
{
        static uchar key1cnt = 0;                //KEY_1按下的次數
        
        if(KEY_1 == 0)
        {
                delay(10);
                if(KEY_1 == 0)
                {
                        key1cnt++;
                        while(!KEY_1);
                        switch(key1cnt)
                        {
                                case 1:
                                        TR0 = 0;
                                        Write_Cmd(0x80 + 0x40 + 5);
                                        Write_Cmd(0x0F);            //顯示光標且光標閃爍
                                        break;
                                case 2:
                                        Write_Cmd(0x80 + 0x40 + 8);        
                                        break;
                                case 3:
                                        Write_Cmd(0x80 + 0x40 + 11);        
                                        break;
                                case 4:
                                        Write_Cmd(0x80 + 7);
                                        break;
                                case 5:
                                        Write_Cmd(0x80 + 10);
                                        break;
                                case 6:
                                        TR0 = 1;
                                        Write_Cmd(0x0C);           //不顯示光標
                                        key1cnt = 0;
                                        break;
                        }
                }
        }
        if(key1cnt != 0)
        {
                if(KEY_2 == 0)
                {
                        delay(10);
                        if(KEY_2 == 0)
                        {
                                while(!KEY_2);
                                switch(key1cnt)
                                {
                                        case 1:
                                                hour++;
                                                if(hour == 24)
                                                        hour = 0;
                                                Write_Num(4, 1, hour);
                                                Write_Cmd(0x80 + 0x40 + 5);
                                                break;
                                        case 2:
                                                minu++;
                                                if(minu == 60)
                                                        minu = 0;
                                                Write_Num(7, 1, minu);
                                                Write_Cmd(0x80 + 0x40 + 8);
                                                break;
                                        case 3:
                                                sec++;
                                                if(sec == 60)
                                                        sec = 0;
                                                Write_Num(10, 1, sec);
                                                Write_Cmd(0x80 + 0x40 + 11);
                                                break;
                                        case 4:
                                                month++;
                                                if(month == 13)
                                                        month = 1;
                                                Write_Num(6, 0, month);
                                                Write_Cmd(0x80 + 7);
                                                break;
                                        case 5:
                                                day++;
                                                if(day == 32)
                                                        day = 1;
                                                Write_Num(9, 0, day);
                                                Write_Cmd(0x80 + 10);
                                                break;
                                }
                        }
                }
        }        
}

void main()
{
        uchar i = 0;
        uchar code table[] = {"2017-01-01 Sun"};
        
        EA = 1;
        Lcd_Init();                        //1602初始化
        T0_Init();          //定時器0初始化
        
        Write_Cmd(0x80 + 1);
        while(table[i] != '\0')
        {
                Write_Dat(table[i]);
                i++;
        }
        while(1)
        {
                KeyScan();
        }
}

void Timer0() interrupt 1
{
        TH0 = (65536 - 46071)/256;
        TL0 = (65536 - 46071)%256;
        
        count++;
        TimerCount();
        
}





為什么要做個測試呢?我把程序改了下現在可以用了,星期我也沒搞明白怎樣顯示,希望高手指導
回復

使用道具 舉報

板凳
ID:1 發表于 2018-8-31 16:38 | 只看該作者
hslcac 發表于 2018-8-31 15:51
/*作者:lern01 自己總覺得程序有待優化,且星期顯示有問題,對7求余為0時,星期不變化,請高手給予指點, ...

最好到問答區發,這里人氣不夠
回復

使用道具 舉報

地板
ID:89072 發表于 2018-8-31 17:12 | 只看該作者
admin 發表于 2018-8-31 16:38
最好到問答區發,這里人氣不夠

好的,謝謝你
回復

使用道具 舉報

5#
ID:392924 發表于 2018-9-3 14:29 | 只看該作者
厲害了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本视频一区二区 | 久久99精品久久久久 | 国产视频精品视频 | 久久高清国产视频 | 亚洲a毛片 | 狠狠的日| 韩日一区二区 | 欧美日韩电影一区二区 | 欧美色综合一区二区三区 | 精品国产伦一区二区三区观看体验 | 亚洲国产一区二区三区在线观看 | 高清久久| 久久91av| 色噜噜狠狠色综合中国 | 国产精品久久亚洲 | 日韩一区二区三区在线 | 欧美精品一区二区三区四区 在线 | 国产精品久久久久久久岛一牛影视 | 国产精品久久久久久久久久久新郎 | 男女激情网站免费 | 尹人av| 四虎影院新地址 | 超碰伊人久久 | 亚洲午夜精品 | 精品久久久久久亚洲精品 | 99精品国产一区二区青青牛奶 | 91视频导航 | 日韩av在线免费 | 一区二区三区在线观看免费视频 | 免费视频一区二区 | www.色53色.com | 欧美国产日韩在线观看 | 色网在线播放 | 黄色一级在线播放 | 欧美激情视频一区二区三区在线播放 | 亚洲国产高清在线观看 | 精品一区二区电影 | 欧美一级毛片免费观看 | 玩丰满女领导对白露脸hd | 国产二区视频 | 日本国产一区二区 |