本人打算写一个完整的万年历:这是开始的第一步
完整电路图:
完整代码:
#include <reg51.h>
#include <intrins.h> //包含_nop_( )空函数指令的头文件
#define uchar unsigned char
#define uint unsigned int
#define out P2
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
void lcd1602_initial(void); //lcd1602初始化函数
void lcd1602_write_command(uchar com); //lcd1602写命令函数
void lcd1602_write_data(uchar dat); //lcd1602写数据函数
void lcd1602_string(uchar ad ,uchar *s);//lcd1602写字符串
void delay(uint); //延时函数
uchar code table1[]={"2021-01-24"};
uchar code table2[]={"23:59:50"};
/**************************************************************
*函数名 :delay
*函数功能 :延时函数
*函数参数 :需要延时的毫秒数:uint j
*函数返回值 :无
****************************************************************/
void delay(uint j){ //1ms延时子程序
uchar i=250;
for(;j>0;j--){
while(--i);
i=249;
while(--i);
i=250;
}
}
/**************************************************************
*函数名 :lcd1602_write_command
*函数功能 :lcd1602的写命令函数
*函数参数 :所要设置的命令:uchar command
*函数返回值 :无
****************************************************************/
void lcd1602_write_command(uchar command) {
E=0;
RS=0;
RW=0;
out=command;
E=1;
_nop_( );
E=0;
delay(1);
}
/**************************************************************
*函数名 :lcd1602_write_data
*函数功能 :lcd1602的写数据函数
*函数参数 :要写入的数据:uchar dat
*函数返回值 :无
****************************************************************/
void lcd1602_write_data(uchar dat){
E=0;
RS=1;
RW=0;
out=dat;
E=1;
_nop_();
E=0;
delay(1);
}
/**************************************************************
*函数名 : lcd1602_initial
*函数功能 : lcd1602的初始化
*函数参数 : 无
*函数返回值 : 无
****************************************************************/
void lcd1602_initial(void){
lcd1602_write_command(0x38); //写入命令0x38:8位两行显示,5×7点阵字符
lcd1602_write_command(0x0C); //写入命令0x0C:开整体显示,光标关,无黑块
lcd1602_write_command(0x06); //写入命令0x06:光标右移
lcd1602_write_command(0x01); //写入命令0x01:清屏
delay(1);
}
/**************************************************************
*函数名 :lcd1602_string
*函数功能 :将字符串写入对应的地址上
*函数参数 :地址:uchar ad 字符串:uchar *s
*函数返回值 :无
****************************************************************/
void lcd1602_string(uchar ad,uchar *s){
lcd1602_write_command(ad);
while(*s>0) {
lcd1602_write_data(*s++); //输出字符串,且指针增1
delay(100);
}
}
/**************************************************************
*函数名 : 主函数
*函数功能 : 驱动程序
*函数参数 : 无
*函数返回值: 无
****************************************************************/
void main(void){
lcd1602_initial( ); //调用对LCD初始化函数
while(1){
lcd1602_string(0x80,table1); //显示的第1行数据
lcd1602_string(0x80+0x40,table2); //显示第2行数据
delay(300); //延时
}
}
展示效果: