单片机学习小组
直播中

朱利华

7年用户 167经验值
私信 关注

普通电子钟用LCD1602显示程序



#include "reg52.h"
typedef unsigned int uint16;
typedef unsigned char uint8;
uint16 H = 23,M = 0,S = 0,j = 0,x = 0;//初始化
uint8 code time[5] = {"time:"};
***it RS = P2^5;
***it RW = P2^6;
***it E = P2^7;
//延时函数
void delay(uint16 k)
         {
                 uint16 i;
                 for(i = 0;i < k;i++);
         }
//写LCD1602的命令
void write_com(uint8 com)
         {
                  RS = 0;
                  RW = 0;
                  P0 = com;
                  E = 0;
                  delay(20);
                  E = 1;
         }
//写LCD1602的数据
void write_date(uint8 date)
         {
                 RS = 1;
                 RW = 0;
                 P0 = date;
                 E = 0;
                 delay(20);
                 E = 1;
         }
//LCD1602的初始化
void init(void)
         {
                 write_com(0x38);
                 write_com(0x0c);
                 write_com(0x06);
                 write_com(0x01);
         }
//主程序
void main(void)
         {
                 init();
                 TMOD = 0x01;//设置定时器0的工作方式为1
                 TH0 = 0xdc;
                 TL0 = 0x00;
                 ET0 = 1;
                 EA = 1;
                 TR0 = 1;
                 while(1)
                 {
                          write_com(0x80);
                          for(x = 0;x < 5;x++)
                          {
                                   write_date(time[x]);
                          }
                          write_com(0x80+0x05);//时的十位显示的位置
                          write_date((H/10)+'0');//时的十位显示的内容
                          write_com(0x80+0x06);//时的个位显示的位置
                          write_date((H%10)+'0');//时的个位显示的内容
                          write_com(0x80+0x07);//‘:’显示的位置
                          write_date(':');//‘:’显示的内容
                          write_com(0x80+0x08);//分的十位显示的位置
                          write_date((M/10)+'0');//分的十位显示的内容
                          write_com(0x80+0x09);//分的个位显示的位置
                          write_date((M%10)+'0');//分的个位显示的内容
                          write_com(0x80+0x0A);//‘:’显示的位置
                          write_date(':');//‘:’显示的内容
                          write_com(0x80+0x0B);//秒的十位显示的位置
                          write_date((S/10)+'0');//秒的十位显示的内容
                          write_com(0x80+0x0C);//秒的个位显示的位置
                          write_date((S%10)+'0');//秒的个位显示的内容
                 }
         }
//定时器0中断服务子函数
void TIME0(void) interrupt 1//10MS中断一次
         {
                 TH0 = 0xdc;//重新赋值
                 TL0 = 0x00;
                 j++;
                 if(j==100)
                 {
                         j = 0;
                         S++;
                         if(S==60)
                         {
                                 S = 0;
                                 M++;
                                 if(M==60)
                                 {
                                         M = 0;
                                         H++;
                                         if(H==24)
                                         {
                                                 H = 0;
                                         }
                                 }
                         }
                 }
         }

更多回帖

发帖
×
20
完善资料,
赚取积分