一,实验现象
实验项目现象如下:
文章来源地址https://www.toymoban.com/news/detail-505508.html
这个项目需要用到51单片机板上的功能如下:
1.独立按键
2.LCD1602
3.定时器中断
功能介绍
1.独立按键实现三个功能,选择键,增大键,减小键。
2.lcd1602显示时间
3.定时器中断确定时间
代码如下:
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit K1 = P3^1; //功能键
sbit K2 = P3^0; //增大
sbit K3 = P3^2; //减小
//lcd管脚定义
sbit RS = P2^6;
sbit EN = P2^7;
sbit RW=P2^5;
#define LCD1602_DATAPORT P0
u16 sum,KEY,i;
int hour,minute,second;
u8 code xin[]="2022-07-24";
u8 code xg[]="Clock";
//延迟函数
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void delay_10us(u16 i)
{
while(i--);
}
//液晶显示器1602A
//写命令
void write_com(u8 com)
{
EN = 0;
RS = 0;
RW=0;
LCD1602_DATAPORT = com;
delay_ms(1);
EN = 1;
delay_ms(1);
EN = 0;
}
//写数据
void write_dat(u8 dat)
{
EN = 0;
RS = 1;
RW=0;
LCD1602_DATAPORT = dat;
delay_ms(1);
EN = 1;
delay_ms(1);
EN = 0;
}
//写时分秒函数
void write_sfm(u8 add,u8 dat)
{
u8 a,b;
a=dat/10;
b=dat%10;
write_com(0x80+0x40+add);
write_dat(0x30+a);
write_dat(0x30+b);
}
//初始化
void init(void)
{
sum=0;
KEY=0;
hour=0;
minute=0;
second=0;
//对lcd1602初始化
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
//颜文字
write_com(0x80+1);
write_dat(0x6f);
write_com(0x80+2);
write_dat(0x5f);
write_com(0x80+3);
write_dat(0x6f);
//日期
write_com(0x80+5);
for(i=0;i<10;i++)
{
write_dat(xin[i]);
}
//冒号
write_com(0x80+0x40+2);
write_dat(':');
write_com(0x80+0x40+5);
write_dat(':');
//英文字母
write_com(0x80+0x40+9);
for(i=0;i<5;i++)
{
write_dat(xg[i]);
}
//对定时器0初始化
TMOD |= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
//定义按键
void keycon()
{
if(K1==0)
{
delay_ms(10);
if(K1==0)
{
KEY++;
while(!K1);
//等待释放按键
if(KEY==1)
{
TR0 = 0;
write_com(0x80+0x40+6);//移动到秒
write_com(0x0f);
}
if(KEY==2)
{
write_com(0x80+0x40+3);//移动到分
write_com(0x0f);
}
if(KEY==3)
{
write_com(0x80+0x40);//移动到小时
write_com(0x0f);
}
if(KEY==4)
{
KEY = 0;
write_com(0x0c);
TR0 = 1;
}
}
}
if(KEY!=0)
{
if(K2==0)
{
delay_ms(10);
if(K2==0)
{
while(!K2);
if(KEY==1)
{
second++;
if(second==60)
second=0;
write_sfm(6,second);
write_com(0x80+0x40+6);
}
if(KEY==2)
{
minute++;
if(minute==60)
minute=0;
write_sfm(3,minute);
write_com(0x80+0x40+3);
}
if(KEY==3)
{
hour++;
if(hour==24)
hour=0;
write_sfm(0,hour);
write_com(0x80+0x40);
}
}
}
if(K3==0)
{
delay_ms(10);
if(K3==0)
{
while(!K3);
if(KEY==1)
{
second--;
if(second==-1)
second=59;
write_sfm(6,second);
write_com(0x80+0x40+6);
}
if(KEY==2)
{
minute--;
if(minute==-1)
minute=59;
write_sfm(3,minute);
write_com(0x80+0x40+3);
}
if(KEY==3)
{
hour--;
if(hour==-1)
hour=23;
write_sfm(0,hour);
write_com(0x80+0x40);
}
}
}
}
}
void main()
{
init();
while(1)
{
keycon();
}
}
void init0() interrupt 1
{
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
sum++;
if(sum==20)
{
second++;
sum=0;
if(second==60)
{
minute++;
second=0;
if(minute==60)
{
hour++;
minute=0;
if(hour==24)
{
hour=0;
}
write_sfm(0,hour);
}
write_sfm(3,minute);
}
write_sfm(6,second);
}
}
文章来源:https://www.toymoban.com/news/detail-505508.html
到了这里,关于简单的C51单片机项目之LCD1602时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!