LCD12864支持两种模式驱动,分别是并行模式和串行模式,通过PSB引脚进行选择模式,并行数据传输速度快,但是占用引脚多,反之串行模式,传输速度相对并行模式而言比较慢,但是省引脚。
串行模式驱动LCD12864
说明:
GND——GND
VCC——VCC(5V or 3.3V)
V0 ——空(或者接一个可变电阻到VCC)
RS ——接PB14 RS = 0 命令 RS = 1 数据
RW ——接PB13 RW = 0 写 RW = 1 读
E ——接PB15
DB0-DB7 ——空
PSB——接GND,PSB = 0 串行模式 PSB = 1 并行模式
RST——接PB12
BLA——VCC(5V or 3.3V)
BLK——接GND
剩余引脚不接,留空
注意:ST7920在PSB为低电平时选择串行模式,在串行模式下,一个完整的串行传输周期由以下组成:
首先送入启动字节,送入连续的5个“1”来启动一个周期此时传输计数器被重置,并且串行传输被同步。紧接的两个位指定传输方向(RW,1是读数据,0是写数据)
以及传输性质(RS,0是命令寄存器,1是数据寄存器),最后第八位是固定的“0”
所以写指令之前,必须先传输 11111 000 (即0xF8)
写数据之前 必须先传输 11111 010 (即0xFA)
传输完启动字节后,开始传输指令或者数据,指令或者数据都是以字节为单位,一个字节8bit,在传输过程中会进行拆分处理,如传输0x35(二进制为 0011 0101)时
将0x35的高4位放在第一个字节的高4位,低4位补0,如 0011 0000
将0x35的低4位放在第二个字节的高4位,低4位补0,如 0101 0000
所以在传输指令或者数据时,会将一个字节拆分为两个字节进行传输 0011 0000 0101 0000
假设此时传输的0x35是数据而非指令,由于在代码中将启动字节与数据进行合并,所以传输的数据为:0x00FA3050
单片机源程序如下:
- //////////////////////////////////////////////////////////////////////////////////
- // 文 件 名 : main.c
- // 版 本 号 : v1.0
- // 作 者 :
- // 生成日期 : 2019-0707
- // 最近修改 :
- // 功能描述 : 串行方式驱动LCD12864
- //
- // 说明:
- // ----------------------------------------------------------------
- // GND——GND
- // VCC——VCC(5V or 3.3V)
- // V0 ——空(或者接一个可变电阻到VCC)
- // RS ——接PB14
- // RW ——接PB13
- // E ——接PB15
- // DB0-DB7 ——空
- // PSB——接GND 串行模式
- // RST——接PB12
- // BLA——VCC(5V or 3.3V)
- // BLK——接GND
- // 剩余引脚不接,留空
- // ----------------------------------------------------------------
- //
- //All rights reserved
- //////////////////////////////////////////////////////////////////////////////////
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "iic.h"
- #include "oled.h"
- #include "bmp.h"
- #include "lcd12864.h"
- static float Data = 9876.65; //在12864显示
- char Table[] = {"0000.00"};
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- InitDelay();
- InitUart(115200);
- InitLcd();
-
- ClearLcdDisplay();
-
- Table[0] = ((int)(Data * 100)/100000 + '0'); //千
- Table[1] = ((int)(Data * 100)/10000%10 + '0'); //百
- Table[2] = ((int)(Data * 100)/1000%10 + '0'); //十
- Table[3] = ((int)(Data * 100)/100%10 + '0'); //个
- Table[4] = '.'; //小数点
- Table[5] = ((int)(Data * 100)/10%10+'0'); //小数点后一位
- Table[6] = ((int)(Data * 100)%10+'0'); //小数点后两位
- while(1)
- {
- LcdDisplayString(0,0,"清时明月汉时关");
- LcdDisplayString(1,0,"万里长征人未还");
- LcdDisplayString(2,0,"但使龙城飞将在");
- LcdDisplayString(3,0,"不教胡马度阴山");
- DelayMs(1800); //最大延时不能超过2000
- ClearLcdDisplay();
- DelayMs(100);
- LcdDisplayString(0,2,"显示浮点数"); //第0行
- LcdDisplayString(1,10,Table);
- DelayMs(1800);
- // ClearLcdDisplay(); //可不要,文字会覆盖掉
- // DelayMs(100);
- }
- }
复制代码
所有资料51hei提供下载:
STM32串行模式驱动LCD12864.7z
(191.21 KB, 下载次数: 236)
|