【蓝桥杯——单片机学习笔记】十二.LCD1602(STC15F2K60S2)

一.原理图及引脚说明

在这里插入图片描述
可由Rb1电位器控制LCD的对比度

编号引脚名引脚说明编号引脚名引脚说明
1VSS电源地9D2Data I/O
2VDD电源正极10D3Data I/O
3VL对比度调节11D4Data I/O
4RS数据/指令选择段(H/L)12D5Data I/O
5R/W读/写选择段(H/L)13D6Data I/O
6E使能信号14D7Data I/O
7D0Data I/O15BLA背光源正极
8D1Data I/O16BLK背光源负级

二.控制接口说明

1.1602的存储器

DDRAM:作为显示用的RAM,其地址直接和屏幕上的位置相对应,具体可看第4点;
CGROM:字模存储ROM,里面存入了ascall码字符,显示时自动调用,无需修改;
CGRAM:用户自建字模RAM,可自行向其中添加想要的字模,6位地址码,每个字符占8个字节,所以最多存8个字符。

2.基本操作时序
序号基本操作时序
1读状态RS=L,R/W=H,E=H,D0~7=状态字
2写指令RS=L,R/W=L,D0~7=指令码,E=高脉冲
3读数据RS=H,R/W=H,E=H,D0~7=数据
4写数据RS=H,R/W=L,D0~7=数据,E=高脉冲
3.状态字说明

STA7:读写操作使能,1—禁止,0—允许
STA6~0:当前数据地址指针的数值

对应代码:

//读状态
void read_state(void)
{
	unsigned char sta;			//状态读取存储变量
	LCD1602_DB=0xff;	
	LCD1602_RS=0;
	LCD1602_RW=1;
	LCD1602_E=1;
	do
	{
		LCD1602_E=1;
		sta=LCD1602_DB;	//把状态字读取到sta变量中,可通过最高位判断液晶是否处于忙态,1时为忙 
		LCD1602_E=0;	//释放总线,防止影响其他模块
	}while(sta&0x80);	//判断最高位,直到允许读写时跳出循环
}

//写指令
void write_cmd(unsigned char cmd)
{
	read_state();
	LCD1602_RS=0; 	//RS=0->指令
	LCD1602_RW=0;	//R/W=0->写
	LCD1602_DB=cmd;	//写入指令
	LCD1602_E=1;	
	LCD1602_E=0;			
}
 
 //写数据
void write_data(unsigned char date)
{
	read_state();
	LCD1602_RS=1;   //RS=1->数据
	LCD1602_RW=0;	//R/W=0->写
	LCD1602_DB=date;	//写入数据
	LCD1602_E=1;
	LCD1602_E=0;
}
4.DDRAM地址映射图

在这里插入图片描述

5.指令说明
序号指令RSR/WD7D6D5D4D3D2D1D0
1清显示0000000001
2光标返回000000001*
3光标和显示模式设置00000001I/DS
4显示开/关控制0000001DCB
5光标或字符移位000001S/CR/L**
6功能设置00001DLNF**
7设置字符发生存储器地址0001A5A4A3A2A1A0
8设置数据存储器地址001A6A5A4A3A2A1A0
9读忙标志或AC地址01BFA6A5A4A3A2A1A0
10写数据到CGRAM/DDRAM10D7D6D5D4D3D2D1D0
11从CGRAM/DDRAM读数据11D7D6D5D4D3D2D1D0

指令1:清显示
1.清除显示器,将DDRAM全部写入空白的ASCll码20H;
2.地址计数器AC的值设为0;
3.光标复位到地址00H的位置;

指令2:光标复位指令
1.光标复位到地址00H的位置;
2.地址计数器AC的值设为0;
3.DDRAM内容不变

指令3:光标和显示模式设置
1.I/D:光标移动方向。0—左移,1—右移;
2.S:屏幕上所有文字是否移动。0—关闭,1—右移

指令4:显示开关控制
1.D:控制整体显示的开关。0—关,1—开;
2.C:控制光标显示的开关。0—关,1—开;
3.B:控制光标闪烁的开关。0—关,1—开;

指令5:光标或显示移位

S/CR/L功能
00光标左移1格且地址计数器AC减1
01光标右移1格且地址计数器AC加1
10屏幕上所有字符左移1格但光标不变
11屏幕上所有字符右移1格但光标不变

指令6:功能设置
设定数据总线位数、显示的行数及字型
1.DL:数据总线位数。0—4位,1—8位;
2.N:显示行数。0—1行,1—2行;
3. F:显示点阵类型。0—5X10点阵,1— 5X7点阵

指令7:设定CGRAM地址
设定下一个要存入数据的CGRAM的地址,该指令在向CGRAM时数据前使用。

指令8:设定DDRAM地址
设定下一个要存入数据的DDRAM的地址,该指令在向DDRAM写数据(即显示)时使用。

指令9:读取忙信号或AC地址
1.BF:液晶显示器是否忙。0—不忙,可接收,1—忙,暂时无法接收;
2.读取计数器AC的地址;

指令10:写数据到CGRAM或DDRAM
1.将字符码写入DDRAM,以使液晶显示屏显示出相对于的字符;
2.使用者自己设计的图形存入CGRAM;

指令11:从CGRAM或DDRAM读出数据
读取CGRAM或DDRAM中的内容。

初始化代码:

//LCD初始化设置
void lcd_init()
{		
	LCD1602_E=0;		 //使能关(操作前关使能使用时打开)
	write_cmd(0x3c);     //设置16*2显示,5*7点阵,8位数据口
	write_cmd(0x0c);     //设置开显示,不显示光标
	write_cmd(0x06);     //设置写一个字符后地址指针自动加1
	write_cmd(0x01);     //显示清0,数据指针清0
}

//x为列,范围0~39
//y为行,0——第1行,1——第2行
//将坐标转换为对应的RAM地址,实际指针地址为0x80+RAM映射地址,0x80为指令固定位
void LCD1602_SetRAM(unsigned char x,unsigned char y)
{
    unsigned char addr;
    if(y == 0)
        addr = 0x80 + x;
    else
        addr = 0xc0 + x;
    write_cmd(addr);
}

//对应位置显示字符串
void LCD1602_Show(unsigned char x,unsigned y,unsigned char *str)
{
    LCD1602_SetRAM(x,y);
    while(*str != '\0')
    {
        write_data(*str++);
    }
}
#define LCD1602_DB P0

sbit LCD1602_RS=P2^0;  //RS,数据/命令选择端(H/L)
sbit LCD1602_RW=P2^1;  //R/W,读/写选择端(H/L)
sbit LCD1602_E=P1^2;  // E,使能信号

void read_state(void);//读状态,直到lcd不忙才继续执行其他操作
void write_cmd(unsigned char com);//写指令
void write_data(unsigned char date);//写数据
void lcd_init();//LCD初始化
void LCD1602_SetRAM(unsigned char x,unsigned char y);//设置显示RAM起始地址(x,y对应屏上字符坐标)
void LCD1602_Show(unsigned char x,unsigned y,unsigned char *str);//显示字符串

void main()
{
	lcd_init();
	LCD1602_Show(0,0,"Hello everyone!");	//第一行显示Hello everyone!
	//向CGRAM中存入字符:write_cmd(0X40+num);num为8的倍数(0~56)
	//然后用write_data(data);循环写入8个字节,即一个字符对应的8行
	//如果要将CGRAM中自己存入的字符显示到屏幕上
	//可先write_cmd(addr);addr为DDRAM的地址
	//然后write_data(num);num=1~8,即CGRAM中的8个字符
	//注意首先要保证CGRAM中已经存入字符
 	while(1)
	{	
//		write_cmd(0x18);	//显示器字符左移
		//添加适当的延时函数		
	}					 
}

注意:用此开发板时,如果插上LCD1602,可能会对其他模块产生影响,例如数码管无法正常显示等。

  • 15
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
下面是STC15F2K60S2单片机LCD1602显示的代码,您可以参考一下: ``` #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit RS=P3^5; sbit RW=P3^6; sbit EN=P3^4; void delay_ms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void Write_Command(uchar Command) { RS=0; RW=0; P0=Command; EN=1; _nop_(); _nop_(); EN=0; } void Write_Data(uchar Data) { RS=1; RW=0; P0=Data; EN=1; _nop_(); _nop_(); EN=0; } void Init_Lcd1602() { Write_Command(0x38); delay_ms(5); Write_Command(0x38); delay_ms(5); Write_Command(0x38); delay_ms(5); Write_Command(0x0c); delay_ms(5); Write_Command(0x01); delay_ms(5); Write_Command(0x06); delay_ms(5); } void Display_Lcd1602(uchar x,uchar y,uchar *String) { uchar i; if(x==0) Write_Command(0x80+y); else Write_Command(0xc0+y); for(i=0;String[i]!='\0';i++) Write_Data(String[i]); } void main() { Init_Lcd1602(); Display_Lcd1602(0,0,"Hello,World!"); Display_Lcd1602(1,3,"Goodbye!"); while(1); } ``` 在此代码中,我们使用了P3.4、P3.5和P3.6三个引脚来控制LCD1602屏幕的显示。其中,RS接在P3.5上,RW接在P3.6上,EN接在P3.4上。 在主函数中,我们首先调用Init_Lcd1602()函数来初始化LCD1602屏幕。然后,我们使用Display_Lcd1602()函数来在屏幕上显示"Hello,World!"和"Goodbye!"两个字符串。 请注意,此代码中的delay_ms()函数是用来延时的,它的作用是等待一段时间,以确保LCD1602屏幕的操作被执行。在实际应用中,您可以根据需要调整延时的时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默默无闻小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值