单片机中,常用的显示方式大抵以下:8段式数码管,点阵LED,LCD1602,LCD12864。其中数码管和点阵表示的信息有限,所以此处不考虑。对于LCD1602和LCD12864,LCD1602能表示16x2=32位字母数字,而LCD12864虽然能表示更多信息,但是其电路和内部代码指令也更为复杂。因此我选择使用LCD1602,这个显示足够满足点滴报警器的需要。
此处需要注意的就是在VEE处需要上拉一个10kΩ的滑动电阻,以调节显示。其次VSS指的是地电压,VDD为5V.
在实际模块中,还需要对显示的背光度进行调节(即多出来的两个接口A和K),太亮会很耗电,太暗会看不清上面的字符。
把lcd调用的代码封装在一个头文件里
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include "Delay.h"
#define lcd1602_io P2
sbit lcd1602_en = P1 ^ 0;
sbit lcd1602_rw = P1 ^ 1;
sbit lcd1602_rs = P1 ^ 2;
void lcd1602_write_cmd(unsigned char cmd)
{
lcd1602_io = cmd;
lcd1602_rs = 0;
lcd1602_en = 0;
lcd1602_rw = 0;
Delay(1);
lcd1602_en = 1;
Delay(1);
lcd1602_en = 0;
}
void lcd1602_write_data(unsigned char dat)
{
lcd1602_io = dat;
lcd1602_rs = 1;
lcd1602_en = 0;
lcd1602_rw = 0;
Delay(1);
lcd1602_en = 1;
Delay(1);
lcd1602_en = 0;
}
void lcd1602_init()
{
lcd1602_rw = 0;
lcd1602_write_cmd(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
Delay(1);
lcd1602_write_cmd(0x0e); //显示模式设置
Delay(1);
lcd1602_write_cmd(0x06); //显示模式设置:光标右移,字符不移
Delay(1);
lcd1602_write_cmd(0x01); //清屏幕指令,将以前的显示内容清除
Delay(1);
}
void lcd1602_write_char(unsigned char x, unsigned char y, unsigned char dat) //坐标定位
{
unsigned char address;
if(y == 0)
address = 0x80 + x; //y=0,写第一行
else
address = 0xc0 + x; //y=1,写第二行
lcd1602_write_cmd(address);
lcd1602_write_data(dat);
}
void lcd1602_write_string(unsigned char x, unsigned char y, unsigned char *dat) //坐标定位
{
unsigned char address;
if(y == 0)
address = 0x80 + x; //y=0,写第一行
else if(y == 1)
address = 0xc0 + x; //y=1,写第二行
lcd1602_write_cmd(address);
while(*dat > 0)
{
lcd1602_write_data(*dat);
dat++;
Delay(1);
}
}
#endif //__LCD1602_H__
主函数调用
#include
#include "Delay.h"
#include "lcd1602.h"
void main()
{
lcd1602_init();
while(1)
{
lcd1602_write_string(0,0,"Speed:");
}
}
此处会在第一排显示“Speed:”,还可以进行其他显示,但主要一定要初始化。