此处我用的是正点原子F3的精英板,去驱动普中51开发板带的配件1602液晶屏,由于没有直接对应的接口,于是只能用飞线大法了…
连接实物图如下:
1602液晶屏引脚说明:
32对应引脚连接:
PDout(6) //读/写选择-----------------------------R/W
PGout(14) //数据/命令选择---------------------R/S
PGout(15) //使能端-------------------------------E
PCout(0-7) //输出端------------------------------D0->D7
(VL接了GND)
利用模板我们先再HARDWARE里创建一个文件1602_show.c和1602_show.h
在.c文件中,首先先把我们用到的I/O口都使能一下
//32端口初始化
void GPIOX_Init(void) {
RCC->APB2ENR |= 1<<5; // IO端口D时钟使能
RCC->APB2ENR |= 1<<8; // IO端口G时钟使能
RCC->APB2ENR |= 1<<4; // IO端口C时钟使能
GPIOD->CRL &= 0xF0FFFFFF; //GPIOD 6 设为通用推挽输出 读/写选择
GPIOD->CRL |= 0x03000000;
GPIOG->CRH &= 0x00FFFFFF; //GPIOG 14 设为通用推挽输出 数据/命令选择
GPIOG->CRH |= 0x33000000; //GPOIG 15 设为通用推挽输出 液晶屏使能端
GPIOC->CRL &= 0x00000000; //GPIOC 0-7 设为通用推挽输出 用于数据命令传输
GPIOC->CRL |= 0x33333333;
}
然后调用命令写入函数把1602液晶屏初始化一下
//1602液晶屏驱动初始化 (初始化可有多种选择)
void Lcd_Init(void) {
LcdWriteCom(0x38); //开显示 显示两行 5*10点阵
delay_ms(1);
LcdWriteCom(0x0f); //开显示显示 0x0e光标不闪烁 0x0f光标闪烁
delay_ms(1);
LcdWriteCom(0x06); //写一个指针加1 光标右移
delay_ms(1);
LcdWriteCom(0x01); //清屏 0x01
delay_ms(1);
LcdWriteCom(0x80); //设置数据指针起点 0x80 1000 0000 + 0000 0000 初始光标在左上角
delay_ms(1);
}
命令写入函数实现如下:
//写入命令
void LcdWriteCom(unsigned char com) {
//放入缓存
GE = 0; //使能清零
GRS = 0; //选择输入命令
DRW = 0; //选择写入
GPIOC->ODR &= 0xFFFFFF00;
GPIOC->ODR |= com;
delay_ms(1);
//写入 检测到GE位为高(0->1上升沿)时会自动写入
GE = 1;
delay_ms(2); //等待写入完成
GE = 0;
}
数据写入函数如下:
//数据写入函数 (同命令写入一样,只改了一下数据/命令选择而已)
void LcdWriteData(unsigned char dat) {
GE = 0; //使能清零
GRS = 1; //选择输入数据
DRW = 0; //选择写入
GPIOC->ODR &= 0xFFFFFF00;
GPIOC->ODR |= dat;
delay_ms(1);
GE = 1;
delay_ms(2);
GE = 0;
}
在1602_show.h 中将函数都声明一下并定义各个I/O口
代码如下:
#ifndef _1602_H
#define _1602_H
#include <sys.h>
#define DRW PDout(6) //读/写选择
#define GRS PGout(14) //数据/命令选择
#define GE PGout(15) //使能端
#define C0 PCout(0) //输出端
#define C1 PCout(1)
#define C2 PCout(2)
#define C3 PCout(3)
#define C4 PCout(4)
#define C5 PCout(5)
#define C6 PCout(6)
#define C7 PCout(7)
#define DRW PDout(6) //读/写选择
#define GRS PGout(14) //数据/命令选择
#define GE PGout(15) //使能端
void GPIOX_Init(void);
void Lcd_Init(void);
void LcdWriteCom(u8 com);
void LcdWriteData(u8 dat);
#endif
在了解一下命令含义就可以在主函数中随意发挥了。
常用命令:
1、清屏指令
功能:
<1> 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII码 20H;
<2> 光标归位,即将光标撤回液晶显示屏的左上方;
<3> 将地址计数器(AC)的值设为 0。
|
|
2、进入模式设置指令
功能 : 设定每次定入 1 位数据后光标的移位方向 , 并且设定每次写入的一个字符是否移动。
参数设定的情况如下所示:
I/D 0=写入新数据后光标左移 1=写入新数据后光标移
S 0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右
移 1 个字符
|
|
3、显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
D 0=显示功能关 1=显示功能开
C 0=无光标 1=有光标
B 0=光标闪烁 1=光标不闪烁
|
|
4、功能设定指令
功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:
DL 0=数据总线为 4 位 1=数据总线为 8 位
N 0=显示 1 行 1=显示 2 行
F 0=5×7 点阵/每字符 1=5×10 点阵/每字符
|
|
5、具体显示位置
在设置完成之后我们就要明白具体是在哪显示,在哪个位置显示?在对液晶模块的初始化中要先设置其显示模式, 在液晶模块显示字符时光标是自动右移的, 无需人工干预。 每次输入指令前都要判断液晶模块是否处于忙的状态。DDRAM 就是显示数据 RAM ,用来寄存待显示的字符代码。共 80 个字节,其地址和屏幕的对应关系如下表:
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,例如第二行第一个字符的地址是 40H, 那么是否直接写入 40H 就可以将光标定位
在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7
恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H)
可用字码:
(注:以上命令摘自普中LCD1206液晶PPT)
小弟初学,如有错误,还请指正,万分感谢~^o^