/*******************************************************************************
* 实验名 : 定时器实验
* 使用的IO :
* 实验效果 :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒,按K2选择
*选择设置加1。
* 注意 :
*******************************************************************************/
#include
#include"lcd.h"
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
h5 R- f* R* d
void Delay1ms(unsigned int c);
void TimerConfiguration();
void Int0Configuration();
unsigned char Time; //用来计时间的值
unsigned char SetPlace; //设置修改位
9 I/ S, M( c* b" S% k% }) x
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
unsigned char hour=13,minute=14,second=00;
unsigned char H2[]=" I LOVE YOU!!! "; //可以改成任意16个字符。
unsigned int i;
TimerConfiguration();
Int0Configuration();
LcdInit();
LcdWriteCom(0x84);
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);
LcdWriteCom(0xc0);
for(i=0;i<16;i++) //第2行显示的字符
{
LcdWriteData(H2);
}
while(1)
{
if(TR0==0)
{ if(K1==0) //检测按键K1是否按下
{
Delay1ms(10); //消除抖动
if(K1==0)
{
SetPlace++;
Delay1ms(100);
if(SetPlace>=3)
SetPlace=0;
}
while((i<50)&&(K1==0)) //检测按键K1是否松开
{
Delay1ms(1);
i++;
}
i=0;
}
switch(SetPlace)
{case 0 :
{LcdWriteCom(0x8b); //定位置
LcdWriteCom(0x0f);
Delay1ms(100);
if(K2==0) //检测按键K2是否按下
{
Delay1ms(10); //消除抖动
if(K2==0)
{
second++;
Delay1ms(100);
if(second>=60)
second=0;
) {: m" A! e# p0 P3 z% j }
}
LcdWriteCom(0x8a); //定位置
LcdWriteData('0'+second/10);
LcdWriteData('0'+second%10);
LcdWriteCom(0x8b);
}break;
case 1 :
{LcdWriteCom(0x88); //定位置
LcdWriteCom(0x0f);
Delay1ms(100);
if(K2==0) //检测按键K2是否按下
{
Delay1ms(10); //消除抖动
if(K2==0)
{
minute++;
Delay1ms(100);
if(minute>=60)
minute=0;
3 _8 _+ e P% n3 V+ S; b3 ~ t }
}
LcdWriteCom(0x87); //定位置
LcdWriteData('0'+minute/10);
LcdWriteData('0'+minute%10);
LcdWriteCom(0x88);
}break;
case 2 :
{LcdWriteCom(0x85); //定位置
LcdWriteCom(0x0f);
Delay1ms(100);
if(K2==0) //检测按键K2是否按下
{
Delay1ms(10); //消除抖动
if(K2==0)
{
hour++;
Delay1ms(100);
if(hour>=24)
hour=0;
, f9 r, x: n0 ?5 c5 j
}
}
LcdWriteCom(0x84); //定位置
LcdWriteData('0'+hour/10);
LcdWriteData('0'+hour%10);
LcdWriteCom(0x85);
}break;
}
}
0 {- D6 U+ ^& |2 L% H else
{
LcdWriteCom(0x0c);
if(Time>=20) //一秒钟来到改变数值
{
Time=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
//--显示时钟--//
LcdWriteCom(0x84);
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);
}
}
}
- S# z, i# @6 x
/*******************************************************************************
* 函 数 名 : Delay1ms()
* 函数功能 : 延时1ms
* 输 入 : c
* 输 出 : 无
*******************************************************************************/
: ^3 ~7 v- e& w7 I
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--);
}
4 S, \! k6 I3 l' ^, q7 K. a, Z }
& @& h) o( R2 t R; R
}
' F( O2 s# ]4 `- ~3 A" c6 ^3 C/*******************************************************************************
* 函 数 名 : TimerConfiguration()
* 函数功能 : 配置定时器值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
0 ]* z. N& I3 ^void TimerConfiguration()
{
TMOD = 0x01; //选择工作方式1
TH0 = 0x3C; //设置初始值 50ms
TL0 = 0xB0;
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
/*******************************************************************************
* 函 数 名 : Timer0()
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
7 j; \1 X0 N) q6 o* C
void Timer0() interrupt 1
{
TH0 = 0x3C; //设置初始值 50ms
TL0 = 0xB0;
Time++;
}
/*******************************************************************************
* 函 数 名 : Int0Configuration()
* 函数功能 : 配置外部中断0
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
: S( f7 x$ o7 z" X1 l% I7 _2 ]4 s# z
void Int0Configuration()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}
/*******************************************************************************
* 函 数 名 : Int0() interrupt 0
* 函数功能 : 外部中断0的中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
2 \+ k4 m% D1 tvoid Int0() interrupt 0
{
Delay1ms(10);
if(K3==0)
{
TR0=~TR0;
SetPlace=0;
}
}
) H% T1 u1 P& a; f- N书上原来的程序,可以实现1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒,按K2选择加1。 但是进入设置后,正在设置的哪一位没有光标提示,不够人性化。我在原程序的基础上,加以修改,进入设置功能后,正在设置哪一位,有了光标闪烁提示。
9 n. S1 C( R. \! G* [0 ]* y9 h0 u
$ F3 |+ Z7 L" D6 |2 A7 o2 R
( G5 b2 B7 ?$ p, d& w t, L/ I& u; |) v, E
. `5 Z5 E8 E2 l+ F
. e9 D2 Z' B! W! G- k8 O6 C
* B; F5 T" t+ O, t
! O( Q, t# q( N. I7 [. Y- n
$ a6 J& V% w8 t5 R2 z. q5 B
. t( v$ y" Y' B% X* v+ d
# b, |8 Q/ L# L0 B ~1 r9 E2 {6 T( i0 @8 Z, H$ U! ?' F
- {2 i$ s! E& z2 }( y1 ]/ d
$ k+ F2 f& v: t, _4 j0 }" G8 t, ?
0 Z$ C( B( i B& O( G& i
$ W+ c, J: R3 {" c
/ v! C2 \( h4 Y6 ], y5 J& l
L1 ^, F) o# g, ?
3 J$ V; k2 e: K8 h
{7 B! X" X) _! |3 g1 @
* q8 n% y$ E1 A+ ?. o6 e) y5 [
3 ?2 p5 [" v$ |1 A, t
/ T* e1 d5 `) f- d3 l* p8 A& B& T" F# h( X
- N7 P& \' a" O& C2 b$ s1 `& v, }; W% q5 Q0 E6 m
- L: {* ~& |7 v1 P; e, d
5 f1 z* ^0 K2 i" j5 R5 V6 [; }; B
* ~+ F; a% G. R" I' E![]()