微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD1602时钟,调时,怎样让数字闪烁,或者相应位置的光标闪烁?感谢。

LCD1602时钟,调时,怎样让数字闪烁,或者相应位置的光标闪烁?感谢。

时间:10-02 整理:3721RD 点击:
示例中用LCD1602做了一个简单的时钟,但是调整时间的时候,没有闪烁也没有光标提示,也不知道,现在是调整 时,还是 分。
/*******************************************************************************
* 实验名                           : 定时器实验
* 使用的IO             :
* 实验效果       :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒,按K2选择
*选择设置加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;
//用来计时间的值
void Delay1ms(unsigned int c);
void TimerConfiguration();
void Int0Configuration();
unsigned char SetPlace;
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
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)         //一秒钟来到改变数值
                {
                        Time=0;
                        second++;
                        if(second==60)
                        {
                                second=0;
                                minute++;
                                if(minute==60)
                                {
                                        minute=0;
                                        hour++;
                                        if(hour==24)
                                        {
                                                hour=0;        
                                        }
                                }                                
                        }                                       
                }        
            //--显示时钟--//
                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);
        
        }                                
}
/*******************************************************************************
* 函 数 名       : Delay1ms()
* 函数功能                 : 延时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--);
                }
        }
}
/*******************************************************************************
* 函 数 名         : TimerConfiguration()
* 函数功能                   : 配置定时器值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void TimerConfiguration()
{
    TMOD = 0x01; //选择工作方式1
    TH0 = 0x3C;         //设置初始值
    TL0 = 0x0B0;
    EA = 1;                         //打开总中断
    ET0 = 1;                 //打开定时器0中断
    TR0 = 1;                 //启动定时器0
}
/*******************************************************************************
* 函 数 名         : Timer0()
* 函数功能                   : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void Timer0() interrupt 1
{
          TH0 = 0x3C;         //设置初始值
    TL0 = 0x0B0;
                Time++;
}
/*******************************************************************************
* 函 数 名         : Int0Configuration()
* 函数功能                   : 配置外部中断0
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void Int0Configuration()
{
        //设置INT0
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。
        EA=1;//打开总中断        
}
/*******************************************************************************
* 函 数 名         : Int0() interrupt 0
* 函数功能                   : 外部中断0的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void Int0() interrupt 0                 
{
        Delay1ms(10);
        if(K3==0)
        {
                TR0=~TR0;
                SetPlace=0;
        }
}

在第2个程序中,为了标明,现在调整的是 时,还是 分,我在时间的下面,对应位置上,添加 了个 * 号,
/*******************************************************************************
* 实验名                           : 定时器实验
* 使用的IO             :
* 实验效果       :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒,按K2选择
*选择设置加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;
//用来计时间的值
void Delay1ms(unsigned int c);
void TimerConfiguration();
void Int0Configuration();
unsigned char SetPlace;
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
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)         //一秒钟来到改变数值
                {
                        Time=0;
                        second++;
                        if(second==60)
                        {
                                second=0;
                                minute++;
                                if(minute==60)
                                {
                                        minute=0;
                                        hour++;
                                        if(hour==24)
                                        {
                                                hour=0;        
                                        }
                                }                                
                        }                                       
                }        
            //--显示时钟--//
                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);
        
        }                                
}
/*******************************************************************************
* 函 数 名       : Delay1ms()
* 函数功能                 : 延时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--);
                }
        }
}
/*******************************************************************************
* 函 数 名         : TimerConfiguration()
* 函数功能                   : 配置定时器值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void TimerConfiguration()
{
    TMOD = 0x01; //选择工作方式1
    TH0 = 0x3C;         //设置初始值         50ms
    TL0 = 0xB0;
    EA = 1;                         //打开总中断
    ET0 = 1;                 //打开定时器0中断
    TR0 = 1;                 //启动定时器0
}
/*******************************************************************************
* 函 数 名         : Timer0()
* 函数功能                   : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void Timer0() interrupt 1
{
          TH0 = 0x3C;         //设置初始值  50ms
    TL0 = 0xB0;
                Time++;
}
/*******************************************************************************
* 函 数 名         : Int0Configuration()
* 函数功能                   : 配置外部中断0
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void Int0Configuration()
{
        //设置INT0
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。
        EA=1;//打开总中断        
}
/*******************************************************************************
* 函 数 名         : Int0() interrupt 0
* 函数功能                   : 外部中断0的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/                  
void Int0() interrupt 0                 
{
        Delay1ms(10);
        if(K3==0)
        {
                TR0=~TR0;
                SetPlace=0;
                if(TR0==1)
                {LcdWriteCom(0x01);}
       }
}
我现在想请教的是,在调整时间的时候,怎样让数字闪烁,或者相应位置的光标闪烁,以提示,现在调整的是,小时,分钟,感谢。

1602是有光标闪烁功能的,自己看数据手册

按照寄存器控制方式设置光标闪烁后,其他位置也会闪烁,必须在显示完那一位后在把光标关掉。如果是调时,比如我现在要求小时光标闪烁,我设置好光标模式后,显示分 秒 和其他位置时,也会有光标。这个怎么解决呢?

已经解决了  谢谢 LZ。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top