51单片机lcd1602电子时钟代码
时间: 2023-07-23 18:23:11 浏览: 104
以下是51单片机LCD1602电子时钟的代码,你可以参考一下:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK=P1^0;
sbit RCLK=P1^1;
sbit SRCLK=P1^2;
sbit DIO=P1^3;
uchar code table[]={
//0~9的显示码
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
//0~9的位置
0x80,0x88,0x90,0x98,0xa0,0xa8,
//冒号的位置
0x87,0xa7,
//星期的位置
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6
};
uchar code week[]={
//星期的显示码
0x38,0x3f,0x3d,0x07,0x0e,0x1c,0x38
};
uchar code time[]={
//时分秒的初始值
0x00,0x00,0x00
};
bit flag_1ms,flag_1s,flag_1min,flag_1h;
uchar dis_data[8];
//延时函数
void delay(uint i){
while(i--);
}
//将数据写入595
void write_data(uchar dat){
uchar i;
for(i=0;i<8;i++){
SRCLK=0;
_nop_();
_nop_();
DIO=dat&0x80;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
}
}
//将595的数据锁存到输出端
void lock_data(){
RCLK=0;
_nop_();
_nop_();
RCLK=1;
_nop_();
_nop_();
}
//将显示数据写入LCD1602
void write_lcd1602(uchar dat,bit cmd){
DIO=cmd;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
SCLK=0;
_nop_();
_nop_();
DIO=dat&0xf0;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
SCLK=0;
_nop_();
_nop_();
DIO=(dat<<4)&0xf0;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
SCLK=0;
_nop_();
_nop_();
}
//LCD1602初始化
void init_lcd1602(){
write_lcd1602(0x02,0);
delay(5);
write_lcd1602(0x28,0);
delay(5);
write_lcd1602(0x0c,0);
delay(5);
write_lcd1602(0x06,0);
delay(5);
}
//显示一个字符
void display_char(uchar addr,uchar dat){
write_lcd1602(addr,0);
write_lcd1602(dat,1);
}
//显示字符串
void display_string(uchar addr,uchar *str){
write_lcd1602(addr,0);
while(*str){
write_lcd1602(*str++,1);
}
}
//更新显示数据
void update_dis_data(){
uchar i;
for(i=0;i<8;i++){
dis_data[i]=0xff;
}
dis_data[0]=table[time[0]/10];
dis_data[1]=table[time[0]%10];
dis_data[2]=table[time[1]/10];
dis_data[3]=table[time[1]%10];
dis_data[4]=table[time[2]/10];
dis_data[5]=table[time[2]%10];
dis_data[6]=table[10];
dis_data[7]=table[10];
if(flag_1s){
if(dis_data[7]==table[10]){
dis_data[7]=table[11];
}
else{
dis_data[7]=table[10];
}
flag_1s=0;
}
}
//更新LCD1602
void update_lcd1602(){
uchar i;
for(i=0;i<8;i++){
write_data(~dis_data[i]);
}
lock_data();
for(i=0;i<7;i++){
display_char(table[18+i],week[i]);
}
}
//时分秒加1
void time_add(){
time[2]++;
if(time[2]==60){
time[2]=0;
time[1]++;
if(time[1]==60){
time[1]=0;
time[0]++;
if(time[0]==24){
time[0]=0;
}
}
}
}
//定时器0中断
void timer_0() interrupt 1{
static uchar cnt_1ms,cnt_1s,cnt_1min,cnt_1h;
TH0=0xfc;
TL0=0x67;
cnt_1ms++;
cnt_1s++;
cnt_1min++;
cnt_1h++;
if(cnt_1ms==100){
cnt_1ms=0;
flag_1ms=1;
}
if(cnt_1s==1000){
cnt_1s=0;
flag_1s=1;
time_add();
}
if(cnt_1min==60000){
cnt_1min=0;
flag_1min=1;
}
if(cnt_1h==3600000){
cnt_1h=0;
flag_1h=1;
}
}
void main(){
init_lcd1602();
TMOD=0x01;
TH0=0xfc;
TL0=0x67;
EA=1;
ET0=1;
TR0=1;
while(1){
if(flag_1ms){
flag_1ms=0;
update_dis_data();
update_lcd1602();
}
}
}
```
这个代码中使用了定时器0中断来实现1ms的定时,同时使用了flag标志位来记录1ms、1s、1min、1h的到达,从而实现时钟的显示和计时。希望对你有所帮助!
阅读全文