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);}
}
}
我现在想请教的是,在调整时间的时候,怎样让数字闪烁,或者相应位置的光标闪烁,以提示,现在调整的是,小时,分钟,感谢。
/*******************************************************************************
* 实验名 : 定时器实验
* 使用的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。