找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18521|回复: 11
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
示例中用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);}
        }
}



我现在想请教的是,在调整时间的时候,怎样让数字闪烁,或者相应位置的光标闪烁,以提示,现在调整的是,小时,分钟,感谢。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-2-22 21:15 | 只看该作者
本帖最后由 zl2168 于 2017-2-22 21:18 编辑

在调整时间时让数字闪烁的时钟1602


具有校正功能的时钟1302LCD1602显示)
Proteus仿真,确认有效。
实例91 带校正时钟1302(LCD1602显示).rar (52.74 KB, 下载次数: 295)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1,书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

板凳
ID:161933 发表于 2017-2-23 18:51 | 只看该作者
zl2168 发表于 2017-2-22 21:15
在调整时间时让数字闪烁的时钟1602

只有图片,没看到程序???
快速闪烁是 怎样实现的?子函数???
回复

使用道具 举报

地板
ID:111634 发表于 2017-2-23 19:00 | 只看该作者
csz9981 发表于 2017-2-23 18:51
只有图片,没看到程序???
快速闪烁是 怎样实现的?子函数???

仿真电路和Hex文件能在出版社网站免费下载,程序源代码只能到书上看了。
回复

使用道具 举报

5#
ID:166239 发表于 2017-2-23 19:06 | 只看该作者
zl2168 发表于 2017-2-23 19:00
仿真电路和Hex文件能在出版社网站免费下载,程序源代码只能到书上看了。

解决没,新手学学
回复

使用道具 举报

6#
ID:111634 发表于 2017-2-23 20:02 | 只看该作者
linbaiyang 发表于 2017-2-23 19:06
解决没,新手学学

虽然没有源程序,但仍可仿真,演示、观测和验证案例效果。确认了再设法去弄源程序,免得上当受骗!网上的虚假信息、无效程序、看不懂的程序和伪劣程序太多了。真想学,不妨先proteus仿真,不会让你失望的。
回复

使用道具 举报

7#
ID:151348 发表于 2017-3-2 18:47 | 只看该作者
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');这样行不行,
回复

使用道具 举报

8#
ID:167724 发表于 2017-3-2 18:59 | 只看该作者
多谢楼主
回复

使用道具 举报

9#
ID:16255 发表于 2017-5-8 22:59 | 只看该作者
imxuheng 发表于 2017-3-2 18:47
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');这样行不行,

太浪费系统时间了。
回复

使用道具 举报

10#
ID:198432 发表于 2017-5-8 23:10 | 只看该作者
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');  试试这样
回复

使用道具 举报

11#
ID:299233 发表于 2018-8-7 16:04 | 只看该作者
楼主解决了吗?
回复

使用道具 举报

12#
ID:1010131 发表于 2022-5-5 11:13 | 只看该作者
imxuheng 发表于 2017-3-2 18:47
LcdWriteData('0'+minute/10);delayms(10);LcdWriteData(' ');这样行不行,

大哥可以可以,我试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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