標(biāo)題: LCD1602時(shí)鐘,調(diào)時(shí),怎樣讓數(shù)字閃爍,或者相應(yīng)位置的光標(biāo)閃爍?感謝。 [打印本頁]

作者: csz9981    時(shí)間: 2017-2-22 19:26
標(biāo)題: LCD1602時(shí)鐘,調(diào)時(shí),怎樣讓數(shù)字閃爍,或者相應(yīng)位置的光標(biāo)閃爍?感謝。
示例中用LCD1602做了一個簡單的時(shí)鐘,但是調(diào)整時(shí)間的時(shí)候,沒有閃爍也沒有光標(biāo)提示,也不知道,現(xiàn)在是調(diào)整 時(shí),還是 分。
/*******************************************************************************
* 實(shí)驗(yàn)名                           : 定時(shí)器實(shí)驗(yàn)
* 使用的IO             :
* 實(shí)驗(yàn)效果       :1602顯示時(shí)鐘,按K3進(jìn)入時(shí)鐘設(shè)置,按K1選擇設(shè)置的時(shí)分秒,按K2選擇
*選擇設(shè)置加1。
*        注意                                         :
*******************************************************************************/
#include<reg51.h>       
#include"lcd.h"
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;

unsigned char Time;
//用來計(jì)時(shí)間的值

void Delay1ms(unsigned int c);
void TimerConfiguration();
void Int0Configuration();

unsigned char SetPlace;

/*******************************************************************************
* 函 數(shù) 名         : main
* 函數(shù)功能                   : 主函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void main(void)
{
        unsigned char hour,minute,second;
        unsigned int i;
        TimerConfiguration();
        Int0Configuration();
        LcdInit();
        hour=12;
        LcdWriteData('0'+hour/10);
        LcdWriteData('0'+hour%10);
        LcdWriteData('-');
        LcdWriteData('0'+minute/10);
        LcdWriteData('0'+minute%10);
        LcdWriteData('-');
        LcdWriteData('0'+second/10);
        LcdWriteData('0'+second%10);
        while(1)
        {
                if(TR0==0)
                {
                        if(K1==0)                //檢測按鍵K2是否按下
                        {
                                Delay1ms(10);        //消除抖動
                                if(K1==0)
                                {
                                        SetPlace++;
                                        if(SetPlace>=3)
                                                SetPlace=0;                                       
                                }

                                while((i<50)&&(K1==0))         //檢測按鍵是否松開
                                {
                                        Delay1ms(1);
                                        i++;
                                }
                                i=0;
                        }
                        if(K2==0)                //檢測按鍵K3是否按下
                        {
                                Delay1ms(10);        //消除抖動
                                if(K2==0)
                                {
                                        if(SetPlace==0)
                                        {
                                                second++;
                                                if(second>=60)
                                                        second=0;
                                        }
                                        else if(SetPlace==1)
                                        {
                                                minute++;
                                                if(minute>=60)
                                                        minute=0;       
                                        }
                                        else
                                        {
                                                hour++;
                                                if(hour>=24)
                                                        hour=0;
                                        }                               
                                }

                                while((i<50)&&(K2==0))         //檢測按鍵是否松開
                                {
                                        Delay1ms(1);
                                        i++;
                                }
                                i=0;
                        }
                }       
                if(Time>=20)         //一秒鐘來到改變數(shù)值
                {
                        Time=0;
                        second++;
                        if(second==60)
                        {
                                second=0;
                                minute++;
                                if(minute==60)
                                {
                                        minute=0;
                                        hour++;
                                        if(hour==24)
                                        {
                                                hour=0;       
                                        }
                                }                               
                        }                                       
                }       
            //--顯示時(shí)鐘--//
                LcdWriteCom(0x80);
                LcdWriteData('0'+hour/10);
                LcdWriteData('0'+hour%10);
                LcdWriteCom(0x83);
                LcdWriteData('0'+minute/10);
                LcdWriteData('0'+minute%10);
                LcdWriteCom(0x86);
                LcdWriteData('0'+second/10);
                LcdWriteData('0'+second%10);
       
        }                               
}
/*******************************************************************************
* 函 數(shù) 名       : Delay1ms()
* 函數(shù)功能                 : 延時(shí)1ms
* 輸    入       : c
* 輸    出       : 無
*******************************************************************************/                  

void Delay1ms(unsigned int c)   //誤差 0us
{
    unsigned char a,b;
        for (; c>0; c--)
        {
                for(b=199;b>0;b--)
                {
                        for(a=1;a>0;a--);
                }

        }

}

/*******************************************************************************
* 函 數(shù) 名         : TimerConfiguration()
* 函數(shù)功能                   : 配置定時(shí)器值
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void TimerConfiguration()
{
    TMOD = 0x01; //選擇工作方式1
    TH0 = 0x3C;         //設(shè)置初始值
    TL0 = 0x0B0;
    EA = 1;                         //打開總中斷
    ET0 = 1;                 //打開定時(shí)器0中斷
    TR0 = 1;                 //啟動定時(shí)器0
}
/*******************************************************************************
* 函 數(shù) 名         : Timer0()
* 函數(shù)功能                   : 定時(shí)器0中斷函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void Timer0() interrupt 1
{
          TH0 = 0x3C;         //設(shè)置初始值
    TL0 = 0x0B0;
                Time++;
}
/*******************************************************************************
* 函 數(shù) 名         : Int0Configuration()
* 函數(shù)功能                   : 配置外部中斷0
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void Int0Configuration()
{
        //設(shè)置INT0
        IT0=1;//跳變沿出發(fā)方式(下降沿)
        EX0=1;//打開INT0的中斷允許。
        EA=1;//打開總中斷       
}
/*******************************************************************************
* 函 數(shù) 名         : Int0() interrupt 0
* 函數(shù)功能                   : 外部中斷0的中斷函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void Int0() interrupt 0                 
{
        Delay1ms(10);
        if(K3==0)
        {
                TR0=~TR0;
                SetPlace=0;
        }
}



在第2個程序中,為了標(biāo)明,現(xiàn)在調(diào)整的是 時(shí),還是 分,我在時(shí)間的下面,對應(yīng)位置上,添加 了個。√,

/*******************************************************************************
* 實(shí)驗(yàn)名                           : 定時(shí)器實(shí)驗(yàn)
* 使用的IO             :
* 實(shí)驗(yàn)效果       :1602顯示時(shí)鐘,按K3進(jìn)入時(shí)鐘設(shè)置,按K1選擇設(shè)置的時(shí)分秒,按K2選擇
*選擇設(shè)置加1。
*        注意                                        :
*******************************************************************************/
#include<reg51.h>       
#include"lcd.h"
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;

unsigned char Time;
//用來計(jì)時(shí)間的值

void Delay1ms(unsigned int c);
void TimerConfiguration();
void Int0Configuration();

unsigned char SetPlace;

/*******************************************************************************
* 函 數(shù) 名         : main
* 函數(shù)功能                   : 主函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void main(void)
{
        unsigned char hour,minute,second;
        unsigned int i;
        TimerConfiguration();
        Int0Configuration();
        LcdInit();
        hour=12;
        LcdWriteData('0'+hour/10);
        LcdWriteData('0'+hour%10);
        LcdWriteData(':');
        LcdWriteData('0'+minute/10);
        LcdWriteData('0'+minute%10);
        LcdWriteData(':');
        LcdWriteData('0'+second/10);
        LcdWriteData('0'+second%10);
        while(1)
        {
                if(TR0==0)
                {                        LcdWriteCom(0xc7);
                                         LcdWriteData('*');
                                       
                        if(K1==0)                //檢測按鍵K1是否按下
                        {
                                Delay1ms(10);        //消除抖動
                                if(K1==0)
                                {
                                        SetPlace++;
                                        if(SetPlace>=3)
                                                SetPlace=0;                                       
                                }

                                while((i<50)&&(K1==0))         //檢測按鍵是否松開
                                {
                                        Delay1ms(1);
                                        i++;
                                }
                                i=0;                        
                                switch(SetPlace)
                                {case 0 :
                                        {LcdWriteCom(0x01);
                                        LcdWriteCom(0xc7);
                                         LcdWriteData('*');
                                        }break;
                                case 1 :
                                {LcdWriteCom(0x01);
                                LcdWriteCom(0xc4);
                                 LcdWriteData('*');
                                }break;
                                case 2 :
                                {LcdWriteCom(0x01);
                                LcdWriteCom(0xc1);
                                 LcdWriteData('*');
                                }break;                               
                                }
                        }
                        if(K2==0)                //檢測按鍵K2是否按下
                        {
                                Delay1ms(10);        //消除抖動
                                if(K2==0)
                                {
                                        if(SetPlace==0)
                                        {
                                               
                                                second++;
                                                if(second>=60)
                                                        second=0;
                                        }
                                        else if(SetPlace==1)
                                        {
                                                minute++;
                                                if(minute>=60)
                                                        minute=0;       
                                        }
                                        else
                                        {
                                                hour++;
                                                if(hour>=24)
                                                        hour=0;
                                        }                               
                                }

                                while((i<50)&&(K2==0))         //檢測按鍵K2是否松開
                                {
                                        Delay1ms(1);
                                        i++;
                                }
                                i=0;
                        }
                }       

                if(Time>=20)         //一秒鐘來到改變數(shù)值
                {
                        Time=0;
                        second++;
                        if(second==60)
                        {
                                second=0;
                                minute++;
                                if(minute==60)
                                {
                                        minute=0;
                                        hour++;
                                        if(hour==24)
                                        {
                                                hour=0;       
                                        }
                                }                               
                        }                                       
                }       
            //--顯示時(shí)鐘--//
                LcdWriteCom(0x80);
                LcdWriteData('0'+hour/10);
                LcdWriteData('0'+hour%10);
                LcdWriteData(':');
                LcdWriteCom(0x83);
                LcdWriteData('0'+minute/10);
                LcdWriteData('0'+minute%10);
                LcdWriteData(':');
                LcdWriteCom(0x86);
                LcdWriteData('0'+second/10);
                LcdWriteData('0'+second%10);
       
        }                               
}
/*******************************************************************************
* 函 數(shù) 名       : Delay1ms()
* 函數(shù)功能                 : 延時(shí)1ms
* 輸    入       : c
* 輸    出       : 無
*******************************************************************************/                  

void Delay1ms(unsigned int c)   //誤差 0us
{
    unsigned char a,b;
        for (; c>0; c--)
        {
                for(b=199;b>0;b--)
                {
                        for(a=1;a>0;a--);
                }

        }

}

/*******************************************************************************
* 函 數(shù) 名         : TimerConfiguration()
* 函數(shù)功能                   : 配置定時(shí)器值
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void TimerConfiguration()
{
    TMOD = 0x01; //選擇工作方式1
    TH0 = 0x3C;         //設(shè)置初始值         50ms
    TL0 = 0xB0;
    EA = 1;                         //打開總中斷
    ET0 = 1;                 //打開定時(shí)器0中斷
    TR0 = 1;                 //啟動定時(shí)器0
}
/*******************************************************************************
* 函 數(shù) 名         : Timer0()
* 函數(shù)功能                   : 定時(shí)器0中斷函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void Timer0() interrupt 1
{
          TH0 = 0x3C;         //設(shè)置初始值  50ms
    TL0 = 0xB0;
                Time++;
}
/*******************************************************************************
* 函 數(shù) 名         : Int0Configuration()
* 函數(shù)功能                   : 配置外部中斷0
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void Int0Configuration()
{
        //設(shè)置INT0
        IT0=1;//跳變沿出發(fā)方式(下降沿)
        EX0=1;//打開INT0的中斷允許。
        EA=1;//打開總中斷       
}
/*******************************************************************************
* 函 數(shù) 名         : Int0() interrupt 0
* 函數(shù)功能                   : 外部中斷0的中斷函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/                  

void Int0() interrupt 0                 
{
        Delay1ms(10);
        if(K3==0)
        {
                TR0=~TR0;
                SetPlace=0;
                if(TR0==1)
                {LcdWriteCom(0x01);}
        }
}



我現(xiàn)在想請教的是,在調(diào)整時(shí)間的時(shí)候,怎樣讓數(shù)字閃爍,或者相應(yīng)位置的光標(biāo)閃爍,以提示,現(xiàn)在調(diào)整的是,小時(shí),分鐘,感謝。


作者: zl2168    時(shí)間: 2017-2-22 21:15
本帖最后由 zl2168 于 2017-2-22 21:18 編輯

在調(diào)整時(shí)間時(shí)讓數(shù)字閃爍的時(shí)鐘1602


具有校正功能的時(shí)鐘1302LCD1602顯示)
Proteus仿真,確認(rèn)有效。
實(shí)例91 帶校正時(shí)鐘1302(LCD1602顯示).rar (52.74 KB, 下載次數(shù): 295)
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。



作者: csz9981    時(shí)間: 2017-2-23 18:51
zl2168 發(fā)表于 2017-2-22 21:15
在調(diào)整時(shí)間時(shí)讓數(shù)字閃爍的時(shí)鐘1602

只有圖片,沒看到程序???
快速閃爍是 怎樣實(shí)現(xiàn)的?子函數(shù)???
作者: zl2168    時(shí)間: 2017-2-23 19:00
csz9981 發(fā)表于 2017-2-23 18:51
只有圖片,沒看到程序???
快速閃爍是 怎樣實(shí)現(xiàn)的?子函數(shù)???

仿真電路和Hex文件能在出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。
作者: linbaiyang    時(shí)間: 2017-2-23 19:06
zl2168 發(fā)表于 2017-2-23 19:00
仿真電路和Hex文件能在出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。

解決沒,新手學(xué)學(xué)
作者: zl2168    時(shí)間: 2017-2-23 20:02
linbaiyang 發(fā)表于 2017-2-23 19:06
解決沒,新手學(xué)學(xué)

雖然沒有源程序,但仍可仿真,演示、觀測和驗(yàn)證案例效果。確認(rèn)了再設(shè)法去弄源程序,免得上當(dāng)受騙!網(wǎng)上的虛假信息、無效程序、看不懂的程序和偽劣程序太多了。真想學(xué),不妨先proteus仿真,不會讓你失望的。
作者: imxuheng    時(shí)間: 2017-3-2 18:47
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');這樣行不行,
作者: 1842043386    時(shí)間: 2017-3-2 18:59
多謝樓主
作者: mengsiu    時(shí)間: 2017-5-8 22:59
imxuheng 發(fā)表于 2017-3-2 18:47
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');這樣行不行,

太浪費(fèi)系統(tǒng)時(shí)間了。
作者: Libraone    時(shí)間: 2017-5-8 23:10
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');  試試這樣
作者: 402898503    時(shí)間: 2018-8-7 16:04
樓主解決了嗎?
作者: cat-1    時(shí)間: 2022-5-5 11:13
imxuheng 發(fā)表于 2017-3-2 18:47
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');這樣行不行,

大哥可以可以,我試試




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1