老习惯,先看开发板的原理图,再看一下LCD1602的数据手册。这里要用到RS,RW,E三个引脚,分别对应单片机上的P20,P21,P12,引脚定义好后,下面主要就是1602液晶的指令了
与单片机寄存器的用法类似,1602液晶在使用时,首先要进行初始的功能配置。以下要清楚:
1.显示模式设置,写指令0x38,就是设置16*2显示,5*7点阵,8位数据接口。
2.显示开/关以及光标设置指令。这里有2条指令,对应最后一张图。我这里用了0x0c和0x06,请游客自行设置。
3.清屏指令.建议选用0x01
4.RAM地址设置指令。该指令的最高位为1,低七位为RAM的地址,RAM的地址与液晶上字符的关系就是倒数第二张图片所示。
以下是我写的一个例子,在显示屏上显示 Welcome to HPU HPU EDD
#include <STC12C5A60S2.H>
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P1^2;
#define Data P0 //宏定义
void LCD_init();//液晶屏初始化函数
void LCD_Display(unsigned char x,unsigned char y, unsigned char *p);//液晶屏显示函数
void main()//主函数
{
unsigned char str[]="Welcome to HPU";//数组
LCD_init();
LCD_Display(1,0,str);
LCD_Display(4,1,"HPU EDD");
while(1);
}
void delay_us(unsigned int n)//微秒级延时函数
{
extern void _nop_(void);
register unsigned char i = n, j = (n>>8);
_nop_(); _nop_(); _nop_();
if ((--i) | j)
{
do
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
if (0xFF == (i--)) j--; else {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();};
} while (i | j);
}
}
void delay_ms(unsigned int n)//毫秒级延时函数
{
while (n--) delay_us(1000);
}
void LCD_Write_Cmd(unsigned char cmd)Lcd1602液晶写入指令函数,cmd为待写入指令
{
RS = 0;
RW = 0;
Data = cmd;
delay_us(1);
E = 1;
delay_us(1);
E = 0;
delay_ms(2);
}
void LCD_Write_Data(unsigned char dat)//Lcd1602液晶写入数据函数,dat为待写入数据值
{
RS = 1;
RW = 0;
Data = dat;
delay_us(1);
E = 1;
delay_us(1);
E = 0;
delay_ms(2);
}
void LcdSetCursor(x,y)//设置显示RAM起始地址,就是光标的位置,(x,y)为屏幕上的字符坐标
{
unsigned char addr;
if(y==0)//由输入的屏幕坐标计算显示RAM的地址
addr = 0x00+x;//第一行字符地址从0x00起始
else
addr = 0x40+x;//第二行字符地址从0x40起始
LCD_Write_Cmd(addr|0x80);//设置RAM地址
}
void LCD_Display(unsigned char x,unsigned char y, unsigned char *p)//在液晶屏上显示字符串,(x,y)为对应屏幕上的起始坐标,str为字符串指针
{
LcdSetCursor(x,y);//设置起始地址
while (*p)//连续写入字符串数据,知道检测到结束符
{
LCD_Write_Data(*p++);//先取str指向的数据,然后str自加1
}
}
void LCD_init()//初始化1602液晶屏
{
delay_ms(40);
LCD_Write_Cmd(0x38);
delay_ms(5);
LCD_Write_Cmd(0x38);
delay_ms(1);
LCD_Write_Cmd(0x38);
LCD_Write_Cmd(0x38);
LCD_Write_Cmd(0x01);
LCD_Write_Cmd(0x06);
LCD_Write_Cmd(0x0c);
}
注意编程的模块化思想,有利于程序的维护与修改,初次接触,难免有不足的地方
还请各位斧正。谢谢!
|