任务4-4 字符型LCD液晶显示广告牌控制 (课件)-《单片机技术与应用》同步教学(电子工业版)
2024-07-11
|
24页
|
33人阅读
|
1人下载
普通
内容正文:
任务4-4 字符型LCD液晶显示广告牌控制
1
一、任务导入
任务要求
用单片机控制LCD1602液晶模块,在第1行正中间显示“SHEN ZHEN”字符串。
硬件电路
二、1602LCD字符显示模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LCD模块
VSS
VDD
VO
DB0
DB1
DB3
DB2
DB5
DB4
DB7
DB6
A
K
RS
R/W
E
数据线
电源接线
背光控制线
读写控制线
6
RS R/W 操作
0 0 写命令操作(初始化、光标定位等)
0 1 读状态操作(读忙标志)
1 0 写数据操作(要显示的内容)
1 1 读数据操作(可以把显示存储区中的数据反读出来)
字符型LCD1602的基本操作
编号 指令名称 控制信号 命令字
D7 D6 D5 D4 D3 D2 D1 D0
1 清屏 0 0 0 0 0 0 0 0 0 1
2 归位home 0 0 0 0 0 0 0 0 1 ×
3 输入方式设置 0 0 0 0 0 0 0 1 I/D S
4 显示状态设置 0 0 0 0 0 0 1 D C B
5 光标画面滚动 0 0 0 0 0 1 S/C R/L × ×
6 工作方式设置 0 0 0 0 1 DL N F × ×
7 CGRAM地址设置 0 0 0 1 A5 A4 A3 A2 A1 A0
8 DDRAM地址设置 0 0 1 A6 A5 A4 A3 A2 A1 A0
9 读BF和AC 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0
1602LCD的命令字
LCD初始化
//lcd初始化
void lcd_init()
{
lcd_w_cmd(0x3c); // 设置工作方式
lcd_w_cmd(0x0e); // 设置光标
lcd_w_cmd(0x01); // 清屏
lcd_w_cmd(0x06); // 设置输入方式
}
RS=0;R/W=1;E:正脉冲
//读状态函数
unsigned char lcd_r_start() //8位数据线连接方式
{
unsigned char s;
RW=1; //RW=1,RS=0,读LCD状态
delayus();
RS=0;
delayus();
E=1; //E端时序
delayus();
s=LCD_DB; //从LCD的数据口读状态
delayus();
E=0;
delayus();
RW=0;
delayus();
return(s); //返回读取的LCD状态字
}
D7 D6 D5 D4 D3 D2 D1 D0
BF
BF=1:表示LCD正在忙
BF=0:表示LCD不忙
i=lcd_r_start(); // 调用读状态函数,读取LCD状态字
//写命令操作函数
void lcd_w_cmd(unsigned char com) //8位数据线连接方式
{
unsigned char i;
do{ // 查LCD忙操作
i=lcd_r_start(); // 调用读状态字函数
i=i&0x80; // 与操作屏蔽掉低7位
delayms(1);
}while(i!=0); //LCD忙,继续查询,否则退出循环
RW=0;
delayus();
RS=0; //RW=0,RS=0,写LCD命令字
delayus();
E=1; //E端时序
delayus();
LCD_DB =com; //将com中的命令字写入LCD数据口
delayus();
E=0;
delayus();
RW=1;
delayms(50);
}
RS=0;R/W=0;E:正脉冲
RS=1;R/W=0;E:正脉冲
//写数据函数
void lcd_w_dat(unsigned char dat) //8位数据线连接方式
{
unsigned char i;
do{ // 查LCD忙操作
i=lcd_r_start(); // 调用读状态字函数
i=i&0x80; // 与操作屏蔽掉低7位
delayms(1);
}while(i!=0); CD忙,继续查询,否则退出循环
RW=0;
delayus();
RS=1; //RW=0,RS=1,写LCD数据
delayus();
E=1; //E端时序
delayus();
LCD_DB =dat; //将com中的命令字写入LCD数据口
delayus();
E=0;
delayus();
RW=1;
delayms(50);
}
列
行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
2 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
光标位置与相应命令字
(1)表中命令字以十六进制形式给出,该命令字就是与LCD显示位置相对应的DDRAM地址。
(2)第一行和第二行的命令字是不连续的。
lcd_w_cmd(0x84); //光标定位在第1行第5列
13
三、程序设计
#include <reg51.h> //包含头文件reg51.h,定义了51单片机的专用寄存器
#include <intrins.h> //包含头文件intrins.h,代码中引用了_nop_()函数
//定义控制信号端口
sbit RS=0xb0; //P3.0
sbit RW=0xb1; //P3.1
sbit E=0xb2; //P3.2
程序预处理
//主函数
void main()
{
unsigned char lcd[]="SHEN ZHEN";
unsigned char i;
P1=0xff; //送全1到P0口
lcd_int(); //初始化LCD
delay(255);
lcd_w_cmd(0x83); //设置显示位置
delay(255);
for(i=0;lcd[i]!='\0';i++) //显示字符串,字符串结束符为’\0’
{
lcd_w_dat(lcd[i]);
delay(200);
}
while(1); //原地踏步,待机命令
}
四、举一反三
在1602LCD的第1行第2列显示“工人”
举一反三
LCD标准字库
1602LCD模块的标准字库表中没有中文字符!
18
利用1602LCD模块字符发生存储器CGRAM可以自编8个5×8字符。
自编字符的命令字:
A7 A6 A5 A4 A3 A2 A1 A0
0 1 AC5 AC4 AC3 AC2 AC1 AC0
(1)A7A6=01:CGRAM地址设置的命令字。
(2)A5A4A3:与自编字符的DDRAM数据相对应的字符代码。若A5A4A3=“000”,则该字符写入DDRAM的代码为00,若A5A4A3=“001”,则该字符写入DDRAM的代码为01,依次类推。
(3)A2A1A0:与CGRAM字模的8行相对应。当A2A1A0=“000”时,写入第1行的字模码,当A2A1A0=“001”时,写入第2行的字模码,依次类推。
按照CGRAM地址和数据自编5x7字模
自编字库
软件设计思路
lcd_w_cmd(0x40); //写入第1行CGRAM地址
lcd_w_dat(0x1f); //写入第1行CGRAM数据
自编5x7的字“工”字模和“人”字模
//在CGRAM中建立“工”字字模
void GONG_ZI()
{
lcd_w_cmd(0x40); //写入第1行CGRAM地址
lcd_w_dat(0x1f); //写入第1行CGRAM数据
lcd_w_cmd(0x41); //写入第2行CGRAM地址
lcd_w_dat(0x1f); //写入第2行CGRAM数据
lcd_w_cmd(0x42); //写入第3行CGRAM地址
lcd_w_dat(0x04); //写入第3行CGRAM数据
lcd_w_cmd(0x43); //写入第4行CGRAM地址
lcd_w_dat(0x04); //写入第4行CGRAM数据
lcd_w_cmd(0x44); //写入第5行CGRAM地址
lcd_w_dat(0x04); //写入第5行CGRAM数据
lcd_w_cmd(0x45); //写入第6行CGRAM地址
lcd_w_dat(0x1f); //写入第6行CGRAM数据
lcd_w_cmd(0x46); //写入第7行CGRAM地址
lcd_w_dat(0x1f); //写入第7行CGRAM数据
lcd_w_cmd(0x47); //写入第8行CGRAM地址
lcd_w_dat(0x00); //写入第8行CGRAM数据
}
//在CGRAM中建立“人”字字模
void REN_ZI()
{
lcd_w_cmd(0x48); //写入第1行CGRAM地址
lcd_w_dat(0x00); //写入第1行CGRAM数据
lcd_w_cmd(0x49); //写入第2行CGRAM地址
lcd_w_dat(0x04); //写入第2行CGRAM数据
lcd_w_cmd(0x4A); //写入第3行CGRAM地址
lcd_w_dat(0x04); //写入第3行CGRAM数据
lcd_w_cmd(0x4B); //写入第4行CGRAM地址
lcd_w_dat(0x0A); //写入第4行CGRAM数据
lcd_w_cmd(0x4C); //写入第5行CGRAM地址
lcd_w_dat(0x0A); //写入第5行CGRAM数据
lcd_w_cmd(0x4D); //写入第6行CGRAM地址
lcd_w_dat(0x11); //写入第6行CGRAM数据
lcd_w_cmd(0x4E); //写入第7行CGRAM地址
lcd_w_dat(0x11); //写入第7行CGRAM数据
lcd_w_cmd(0x4F); //写入第8行CGRAM地址
lcd_w_dat(0x00); //写入第8行CGRAM数据
}
判断按键并累加次数
根据次数进行跳转
判断按键是否弹起
void main() //主函数
{
P1=0xff; //送全1到P0口
lcd_int(); //初始化LCD
delay(255);
GONG_ZI(); //调用“工”字建模函数
REN_ZI(); //调用“人”字建模函数
lcd_w_cmd(0x81); //设置显示位置
lcd_w_dat(0x00); //显示“工”
lcd_w_dat(0x01); //显示“人”
while(1); //待机
}
$$
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。