| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- /**********************************************************
- * @ File name -> lcd12864.h
- * @ Version -> V1.1.2
- * @ Date -> 11-30-2013
- * @ Brief -> LCD12864驱动函数头文件
- * 适用于ST7920驱动芯片
- V1.1
- * @ Revise -> A、修正操作命令宏定义。
- * @ -> B、增加串口、并口转换宏定义,增加对高速度MCU控制通讯频率延时函数
- * @ -> C、显示字符串函数增加显示长度选择,即显示多少个ASCII可显示字符,汉字x2即可
- * @ -> D、去掉显示数组函数,合并在字符串显示里
- V1.1.1
- * @ Revise -> 增加字符串显示函数,可以从要显示的数组中任意位置显示一定长度字符串
- V1.1.2
- * @ Revise -> A、增加对低速晶振系统的MCU通讯频率是否使用的宏定义
- * @ -> B、增加在检测液晶忙超时退出,预防死循环
- **********************************************************/
- #ifndef _lcd12864_h_
- #define _lcd12864_h_
- /**********************************************************
- 外部函数头文件
- 应用到不同的外设头文件请在这里修改即可
- **********************************************************/
- //#include "config.h"
- #include "sys.h"
- /**********************************************************
- LCD工作模式选择
- LCD并口和串口选择请修改此参数和硬件电路即可
- **********************************************************/
- #define LCD_Work_Mode 0 //0:为串口工作模式
- //1:为并口工作模式
- #define LCD_USE_DELAY 1 //0: 为不使用延时调整通讯频率,对于12MHz以内的晶振
- //1: 为使用延时调整通讯频率,对于12MHz以上的晶振
- #define Soft_PSB 0 //0:使用硬件控制串口--->并口模式
- //1:使用软件控制串口--->并口模式
- /**********************************************************
- 延时调整通讯频率参数
- 需要使用不同频率的请修改此延时函数值
- **********************************************************/
- #define LCD_Delay() delay_us(5);
- /**********************************************************
- 定义接口信息
- **********************************************************/
- #ifdef Soft_PSB //定义了则使用软件控制
- #define LCD_PSB PAout->b1//P1_6 //LCD并口和串口通讯选择口
- #endif
- #define LCD_RST PAout->b4//P1_4 //LCD复位脚
- //=========================================================
- #ifdef LCD_Work_Mode /* 并口工作模式 */
- //=========================================================
- #define ktdata PAout//P0 //8位数据接口
- #define LCD_EN PAout->b5//P1_0
- #define LCD_RW PAout->b6//P1_1
- #define LCD_RS PAout->b7//P1_5
- //=========================================================
- #else /* 串口工作模式 */
- //=========================================================
- /***********串口模式时接口定义***********/
- #define LCD_SCL PAout->b5//P1_0 //对应管脚为EN
- #define LCD_SDA PAout->b6//P1_1 //对应管脚为RW
- #define LCD_CS PAout->b7//P1_5 //对应管脚为RS
- //=========================================================
- #endif //结束串口、并口模式选择
- //=========================================================
- /**********************************************************
- 参数宏定义
- **********************************************************/
- #define LCD_Busy 0x80 //LCD忙标志
- #define Graph_BassADD 0x00 //显示GRAM基地址
- //CGRAM显示地址单元
- #define ANT_Graph 0x00
- //#define Temperature_Graph 0x02
- #define Bluetooth_Graph 0x02
- #define CD_Graph 0x04
- #define Hand_Graph 0x06
- //////////////////////////////////////////////////////
- //LCD12864指令集
- //////////////////////////////////////////////////////
- #define One_LineAddress 0x80 //第一行基地址
- #define Two_LineAddress 0x90 //第二行基地址
- #define Three_LineAddress 0x88 //第三行基地址
- #define Four_LineAddress 0x98 //第四行基地址
- //基本指令宏定义
- #define MPU_Busy 0x80 //LCD忙,同时也读出了地址计数器(AC)数值
- #define Clear_Display 0x01 //清屏指令
- #define Zero_Address 0x02 //显示地址归零,AC = 0
- //扩充指令宏定义
- #define LCD_Standby 0x01 //待机指令,先设置RE = 1(功能设定寄存器),在送此命令即进入待机模式
- //退出待机,写入任意指令可以退出,再将RE = 0即可
- /***********基本指令***********/
- //进入设定点(entry mode set)
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 0 0 0 1 I/D S
- #define Entry_ModeSet 0x04 //基数
- #define Vernier_ShiftRight (Entry_ModeSet | (1<<1)) //游标右移,AC+1
- #define Vernier_ShiftLeft (Entry_ModeSet | (0<<1)) //游标右移,AC-1
- #define Frames_ShiftRight (Vernier_ShiftLeft | 0x01) //画面整体右移
- #define Frames_ShiftLeft (Vernier_ShiftRight | 0x01) //画面整体左移
- //显示开关设置(display status)
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 0 0 1 D C B
- #define Display_Status 0x08 //基数
- #define Open_Display (Display_Status | (1<<2)) //整体显示开
- #define Close_Display (Display_Status | (0<<2)) //整体显示关
- #define Open_Vernier (Display_Status | (1<<1)) //游标显示开
- #define Close_Vernier (Display_Status | (0<<1)) //游标显示关
- #define Vernier_White_Open (Display_Status | 0x01) //游标位置显示反白开
- #define Vernier_White_Close (Display_Status | 0x00) //游标位置显示反白关,正常显示
- //游标或显示移位控制(cursor and display shift control)
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 0 1 S/C R/L1 X X
- #define Cursor_Display_Control 0x10 //基数
- #define Cursor_ShiftLeft (Cursor_Display_Control | (0<<2)) //游标向左移动,AC = AC - 1
- #define Cursor_ShiftRight (Cursor_Display_Control | (1<<2)) //游标向右移动,AC = AC + 1
- #define Display_ShiftLeft (Cursor_Display_Control | (2<<2)) //显示向左移动,游标跟着移动,AC = AC
- #define Display_ShiftRight (Cursor_Display_Control | (3<<2)) //显示向右移动,游标跟着移动,AC = AC
- //功能设定(function set)
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 1 DL X 0/RE X X
- #define Function_SetBasic 0x20 //基数
- #define MPU_8bit (Function_SetBasic | (1<<4)) //8bit MPU接口
- #define MPU_4bit (Function_SetBasic | (0<<4)) //4bit MPU接口
- #define Instruct_Basic4 (MPU_4bit | (0<<2)) //4bit MPU接口,基本指令集
- #define Instruct_Basic8 (MPU_8bit | (0<<2)) //8bit MPU接口,基本指令集
- #define Instruct_Expansion4 (MPU_4bit | (1<<2)) //4bit MPU接口,扩充指令集
- #define Instruct_Expansion8 (MPU_8bit | (1<<2)) //8bit MPU接口,扩充指令集
- //设定CGRAM地址
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 1 A5 A4 A3 A2 A1 A0
- #define CGRAM_Set 0x40 //基数
- //设定CGRAM地址到地址计数器(AC),AC范围为0x00 ~ 0x3f,需确认扩充指令中SR = 0(卷动位置或RAM地址选择)
- //设定DDRAM地址
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 1 0 A5 A4 A3 A2 A1 A0
- #define DDRAM_Set 0x80 //基数
- //设定CGRAM地址到地址计数器(AC)
- //写显示数据到RAM(RS = 1 RW = 0)
- // b7 b6 b5 b4 b3 b2 b1 b0
- // D7 D6 D5 D4 D3 D2 D1 D0
- //写入数据后会使AC改变,每个RAM(CGRAM、DDRAM、IRAM)地址都可以连续写入2字节的显示数据,
- //当写入第二个字节时,地址计数器(AC)的值自动加1
- //读取显示数据到RAM(RS = 1 RW = 1)
- // b7 b6 b5 b4 b3 b2 b1 b0
- // D7 D6 D5 D4 D3 D2 D1 D0
- //读取数据后会使AC改变,设定RAM(CGRAM、DDRAM、IRAM)地址后,先要Dummy read一次后才能读取到正确的显示数据,
- //第二次读取不需要Dummy read,除非重新设定了RAM地址
- /***********扩充指令***********/
- //卷动位置或RAM地址选择
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 0 0 0 0 1 SR
- #define Write_Roll_Address_Allow 0x03 //允许输入垂直卷动地址
- #define Write_IRAM_Address_Allow 0x02 //允许输入IRAM地址(扩充指令),及允许设定CGRAM地址(基本指令)
- //反白显示
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 0 0 0 1 0 R0
- #define Display_White_One 0x04 //第一行反白显示
- #define Display_White_Two 0x05 //第二行反白显示
- //睡眠模式
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 0 0 1 SL 0 0
- #define LCD_Sleep_Open (0x08 | (1<<2)) //进入睡眠模式
- #define LCD_Sleep_Close (0x08 | (0<<2)) //退出睡眠模式
- //扩充功能设定
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 0 1 DL X RE G X
- #define MPU_4bit_Basic_Draw_Open (Instruct_Basic4 | (1<<1)) //4bit MPU接口,基本指令,绘图开
- #define MPU_4bit_Basic_Draw_Close (Instruct_Basic4 | (0<<1)) //4bit MPU接口,基本指令,绘图关
- #define MPU_8bit_Basic_Draw_Open (Instruct_Basic8 | (1<<1)) //8bit MPU接口,基本指令,绘图开
- #define MPU_8bit_Basic_Draw_Close (Instruct_Basic8 | (0<<1)) //8bit MPU接口,基本指令,绘图关
- #define MPU_8bit_Expansion_Draw_Open (Instruct_Expansion8 | (1<<1)) //8bit MPU接口,扩充指令,绘图开
- #define MPU_8bit_Expansion_Draw_Close (Instruct_Expansion8 | (0<<1)) //8bit MPU接口,扩充指令,绘图关
- #define MPU_4bit_Expansion_Draw_Open (Instruct_Expansion4 | (1<<1)) //4bit MPU接口,扩充指令,绘图开
- #define MPU_4bit_Expansion_Draw_Close (Instruct_Expansion4 | (0<<1)) //4bit MPU接口,扩充指令,绘图关
- //设定IRAM地址或卷动地址
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 0 1 A5 A4 A3 A2 A1 A0
- #define IRAM_Set 0x40 //基数
- //SR = 1,A5 ~ A0为垂直卷动地址,SR = 0,A3 ~ A0为IRAM地址
- //设定绘图RAM地址
- // b7 b6 b5 b4 b3 b2 b1 b0
- // 1 0 0 0 A3 A2 A1 A0 --->水平地址范围:A3 ~ A0
- // 1 A6 A5 A4 A3 A2 A1 A0 --->垂直地址范围:A6 ~ A0
- #define Draw_RAMSet 0x80 //基数
- //设定GDRAM地址到地址计数器(AC),先设置垂直位置再设置水平位置(连续写入2字节数据来完成垂直与水平坐标的设置)。
- /**********************************************************
- 外部功能函数
- **********************************************************/
- void LCD_Init ( void ); //LCD YB12864ZB初始化
- void LCD_Clear ( void ); //LCD YB12864ZB清屏
- void LCD_Write_Byte ( u8 dat, u8 ord ); //LCD写入一个字节命令或者数据,判断忙标志
- void Display_String ( u8 x, u8 y, u8 *str, u8 len ); //LCD显示字符串
- void Display_String1 ( u8 x, u8 y, u8 *str, u8 starsum, u8 len ); //LCD显示字符串
- void Display_CGRAM ( u8 x, u8 y, u8 add_h, u8 add_l ); //显示一个CGRAM内容
- void Display_GDRAM ( u8 x, u8 y, u8 width, u8 height, u8 *bmp, u8 dis_mode ); //LCD写入GDRAM绘图
- #endif
- /*********************************************************/
- /*
- 1、指令表1(RE = 0,基本指令集)
- ___________________________________________________________________________
- | | 控制信号 | 控 制 代 码 | 执行 |
- | |____________|_______________________________________| |
- | 指令名称 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 时间 | HEX
- |_______________|____|_______|____|____|____|____|____|____|____|____|______|
- | 清除显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1.6ms| 0x01
- |_______________|____|_______|____|____|____|____|____|____|____|____|______|
- | 地址归0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 72us | 0x02 //不改变DDRAM内容
- |_______________|____|_______|____|____|____|____|____|____|____|____|______|
- | 进入设定点 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D| S | 72us | 0x06 游标右移 0x07 画面整体左移
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x04 游标左移 0x05 画面整体右移
- | 显示开关设置 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | S | 72us | D = 1; 整体显示开 D = 0; 整体显示关 // 不改变DDRAM内容
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| C = 1; 游标显示开 C = 0; 游标显示关 S = 1; 游标位置显示反白 S = 0; 正常显示
- | 移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C| R/L| X | X | 72us | 0x10 游标向左移动 AC = AC - 1 0x14 游标向右移动 AC = AC + 1
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x18 显示向左移动 AC = AC 0x1c 显示向右移动 AC = AC
- | 功能设定 | 0 | 0 | 0 | 0 | 1 | DL | X |0/RE| X | X | 72us | 0x30 8bit接口,基本指令 0x34 8bit接口,扩充指令
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x20 4bit接口,基本指令 0x24 4bit接口,扩充指令
- | 设定CGRAM地址 | 0 | 0 | 0 | 1 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 设定CGRAM地址到地址计数器(AC),AC范围0x00 ~ 0x3f,需确认扩充指令中SR = 0
- | 设定DDRAM地址 | 0 | 0 | 1 | 0 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 设定DDRAM地址到地址计数器(AC),第一行AC范围 0x80 ~ 0x8f 第二行AC范围 0x90 ~ 0x9f
- | 读忙标志和地址| 0 | 1 | BF | A6 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| BF = 0; //可以接受新数据
- | 写显示数据 | 1 | 0 | 显示数据 | 72us |
- |_______________|____|_______|_______________________________________|______| 每个RAM(CGRAM、DDRAM、IRAM)地址都可以连续写入2个字节,第二个字节时AC自动增加1
- | 读显示数据 | 1 | 1 | 显示数据 | 72us |
- |_______________|____|_______|_______________________________________|______| 设定RAM(CGRAM、DDRAM、IRAM)地址后,先要Dummy read(假读)一次后才能读到正确的显示
- 数据,第二次读取不需要再Dummy read(假读)一次,除非重新设置了RAM地址
- 2、指令表2(RE = 1,扩充指令集)
- ___________________________________________________________________________
- | | 控制信号 | 控 制 代 码 | 执行 |
- | |____________|_______________________________________| |
- | 指令名称 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 时间 | HEX
- |_______________|____|_______|____|____|____|____|____|____|____|____|______|
- | 待命模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 72us | 0x01 该指令不能改变RAM内容
- |_______________|____|_______|____|____|____|____|____|____|____|____|______|
- | 卷动地址或 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SR | 72us |
- | RAM地址选择 | | | | | | | | | | | | 初始值0x02, 0x03 允许输入垂直卷动地址
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x02 允许输入IRAM地址(扩充指令),及允许设定CGRAM地址(基本指令)
- | 反白显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | R1 | R0 | 72us |
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 初始值0x04 0x05反白显示
- | 睡眠模式 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SL | X | X | 72us |
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x0c 脱离睡眠模式 0x08 进入睡眠模式
- | 扩充功能设定 | 0 | 0 | 0 | 0 | 1 | DL | X |1/RE| G | 0 | 72us |
- |_______________|____|_______|____|____|____|____|____|____|____|____|______|
- |设定IRAM地址或 | 0 | 0 | 0 | 1 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
- | 卷动地址 | | | | | | | | | | | | SR = 1; //A5 ~ A0为垂直卷动地址
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| SR = 0; //A3 ~ A0为IRAM地址
- | | | | | 0 | 0 | 0 | A3 | A2 | A1 | A0 | |
- | | | | |____|____|____|____|____|____|____| | 设定GDRAM地址到计数器地址(AC),先设置垂直地址再设置水平地址,
- |设定绘图RAM地址| 0 | 0 | 1 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | 72us | (连续写入2个字节数据来完成垂直和水平地址设置)
- |_______________|____|_______|____|____|____|____|____|____|____|____|______| 垂直地址范围:AC6 ~ AC0
- 水平地址范围:AC3 ~ AC0
- 扩充功能设定:
- DL = 1; //8bit MPU接口 DL = 0; //4bit MPU接口
- RE = 1; //扩充指令 RE = 0; //基本指令
- G = 1; //绘图显示开 G = 0; // 绘图显示关
- */
|