找回密码
 注册
关于网站域名变更的通知
查看: 488|回复: 1
打印 上一主题 下一主题

LCD1602电子时钟

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-21 13:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
LCD1602电子时钟
4 K5 g& D" r6 k! Y
' R3 i& m  w0 P( c8 r! m! _) `

4 T# J. ~# T. w
/*******************************************************************************
* 实验名                           : 定时器实验
* 使用的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 t
void 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
0 ?3 e% G7 h* k7 Z; t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-18 12:50 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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