一、硬件链接
二、驱动代码
#define uchar unsigned char
#define uint unsigned int
#define data_1602 P0
uchar code table_num[]="0123456789abcdefg";
sbit rs=P2^7; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P2^6; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P2^5; //片选信号 下降沿触发
/***********************延时函数************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************lcd1602写命令函数************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602写数据函数************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602初始化设置************************/
void init_1602() //lcd1602初始化设置
{
write_com(0x38); //
write_com(0x0c);
write_com(0x06);
}
/***********************lcd1602上显示两位十进制数************************/
void write_sfm1(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date % 10);
}
/***********************lcd1602上显示两位十进制数************************/
void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
{
uchar shi,ge;
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
shi=date/16;
ge=date%16;
// write_data(0x30+shi);
// write_data(0x30+ge);
write_data(table_num[shi]);
write_data(table_num[ge]);
}
/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/*****************控制光标函数********************/
void write_guanbiao(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date == 1)
write_com(0x0f); //显示光标并且闪烁
else
write_com(0x0c); //关闭光标
}
三、示例代码
示例程序是基于51单片机温度控制和液位监测程序。
若需要全部工程资料源文件可在评论区评论或者私信我。
/*****************主函数********************/
void main()
{
beep = 0; //开机蜂鸣器叫一声
delay_1ms(200);
P0 = P1 = P2 = P3 = 0xff; //初始化IO口
init_time0(); //初始化定时器
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化显示
do
{
temp=Temper();
}
while(temp==850); //因为DS18B20上电之后会读出来850,但不是温度值,所以等待读出温度值
delay_1ms(100);
while(1)
{
key(); //按键程序
if(key_can > 0)
{
beep = 0;
delay_1ms(50);
beep = 1;
key_with();
}
if(flag_200ms == 1)
{
flag_200ms = 0;
if(menu_1 == 0)
{
read_time(); //读时间
init_1602_ds1302(); //显示时钟
vol_value=VOL_VAL*A_D()/256; //获取模拟电压值
percent = 100.0*vol_value/VOL_VAL;
display_temp(55);
}
}
delay_1ms(1);
}
}