12864c5.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. /**********************************************************
  2. * @ File name -> lcd12864.h
  3. * @ Version -> V1.1.2
  4. * @ Date -> 11-30-2013
  5. * @ Brief -> LCD12864驱动函数头文件
  6. * 适用于ST7920驱动芯片
  7. V1.1
  8. * @ Revise -> A、修正操作命令宏定义。
  9. * @ -> B、增加串口、并口转换宏定义,增加对高速度MCU控制通讯频率延时函数
  10. * @ -> C、显示字符串函数增加显示长度选择,即显示多少个ASCII可显示字符,汉字x2即可
  11. * @ -> D、去掉显示数组函数,合并在字符串显示里
  12. V1.1.1
  13. * @ Revise -> 增加字符串显示函数,可以从要显示的数组中任意位置显示一定长度字符串
  14. V1.1.2
  15. * @ Revise -> A、增加对低速晶振系统的MCU通讯频率是否使用的宏定义
  16. * @ -> B、增加在检测液晶忙超时退出,预防死循环
  17. **********************************************************/
  18. #ifndef _lcd12864_h_
  19. #define _lcd12864_h_
  20. /**********************************************************
  21. 外部函数头文件
  22. 应用到不同的外设头文件请在这里修改即可
  23. **********************************************************/
  24. //#include "config.h"
  25. #include "sys.h"
  26. /**********************************************************
  27. LCD工作模式选择
  28. LCD并口和串口选择请修改此参数和硬件电路即可
  29. **********************************************************/
  30. #define LCD_Work_Mode 0 //0:为串口工作模式
  31. //1:为并口工作模式
  32. #define LCD_USE_DELAY 1 //0: 为不使用延时调整通讯频率,对于12MHz以内的晶振
  33. //1: 为使用延时调整通讯频率,对于12MHz以上的晶振
  34. #define Soft_PSB 0 //0:使用硬件控制串口--->并口模式
  35. //1:使用软件控制串口--->并口模式
  36. /**********************************************************
  37. 延时调整通讯频率参数
  38. 需要使用不同频率的请修改此延时函数值
  39. **********************************************************/
  40. #define LCD_Delay() delay_us(5);
  41. /**********************************************************
  42. 定义接口信息
  43. **********************************************************/
  44. #ifdef Soft_PSB //定义了则使用软件控制
  45. #define LCD_PSB PAout->b1//P1_6 //LCD并口和串口通讯选择口
  46. #endif
  47. #define LCD_RST PAout->b4//P1_4 //LCD复位脚
  48. //=========================================================
  49. #ifdef LCD_Work_Mode /* 并口工作模式 */
  50. //=========================================================
  51. #define ktdata PAout//P0 //8位数据接口
  52. #define LCD_EN PAout->b5//P1_0
  53. #define LCD_RW PAout->b6//P1_1
  54. #define LCD_RS PAout->b7//P1_5
  55. //=========================================================
  56. #else /* 串口工作模式 */
  57. //=========================================================
  58. /***********串口模式时接口定义***********/
  59. #define LCD_SCL PAout->b5//P1_0 //对应管脚为EN
  60. #define LCD_SDA PAout->b6//P1_1 //对应管脚为RW
  61. #define LCD_CS PAout->b7//P1_5 //对应管脚为RS
  62. //=========================================================
  63. #endif //结束串口、并口模式选择
  64. //=========================================================
  65. /**********************************************************
  66. 参数宏定义
  67. **********************************************************/
  68. #define LCD_Busy 0x80 //LCD忙标志
  69. #define Graph_BassADD 0x00 //显示GRAM基地址
  70. //CGRAM显示地址单元
  71. #define ANT_Graph 0x00
  72. //#define Temperature_Graph 0x02
  73. #define Bluetooth_Graph 0x02
  74. #define CD_Graph 0x04
  75. #define Hand_Graph 0x06
  76. //////////////////////////////////////////////////////
  77. //LCD12864指令集
  78. //////////////////////////////////////////////////////
  79. #define One_LineAddress 0x80 //第一行基地址
  80. #define Two_LineAddress 0x90 //第二行基地址
  81. #define Three_LineAddress 0x88 //第三行基地址
  82. #define Four_LineAddress 0x98 //第四行基地址
  83. //基本指令宏定义
  84. #define MPU_Busy 0x80 //LCD忙,同时也读出了地址计数器(AC)数值
  85. #define Clear_Display 0x01 //清屏指令
  86. #define Zero_Address 0x02 //显示地址归零,AC = 0
  87. //扩充指令宏定义
  88. #define LCD_Standby 0x01 //待机指令,先设置RE = 1(功能设定寄存器),在送此命令即进入待机模式
  89. //退出待机,写入任意指令可以退出,再将RE = 0即可
  90. /***********基本指令***********/
  91. //进入设定点(entry mode set)
  92. // b7 b6 b5 b4 b3 b2 b1 b0
  93. // 0 0 0 0 0 1 I/D S
  94. #define Entry_ModeSet 0x04 //基数
  95. #define Vernier_ShiftRight (Entry_ModeSet | (1<<1)) //游标右移,AC+1
  96. #define Vernier_ShiftLeft (Entry_ModeSet | (0<<1)) //游标右移,AC-1
  97. #define Frames_ShiftRight (Vernier_ShiftLeft | 0x01) //画面整体右移
  98. #define Frames_ShiftLeft (Vernier_ShiftRight | 0x01) //画面整体左移
  99. //显示开关设置(display status)
  100. // b7 b6 b5 b4 b3 b2 b1 b0
  101. // 0 0 0 0 1 D C B
  102. #define Display_Status 0x08 //基数
  103. #define Open_Display (Display_Status | (1<<2)) //整体显示开
  104. #define Close_Display (Display_Status | (0<<2)) //整体显示关
  105. #define Open_Vernier (Display_Status | (1<<1)) //游标显示开
  106. #define Close_Vernier (Display_Status | (0<<1)) //游标显示关
  107. #define Vernier_White_Open (Display_Status | 0x01) //游标位置显示反白开
  108. #define Vernier_White_Close (Display_Status | 0x00) //游标位置显示反白关,正常显示
  109. //游标或显示移位控制(cursor and display shift control)
  110. // b7 b6 b5 b4 b3 b2 b1 b0
  111. // 0 0 0 1 S/C R/L1 X X
  112. #define Cursor_Display_Control 0x10 //基数
  113. #define Cursor_ShiftLeft (Cursor_Display_Control | (0<<2)) //游标向左移动,AC = AC - 1
  114. #define Cursor_ShiftRight (Cursor_Display_Control | (1<<2)) //游标向右移动,AC = AC + 1
  115. #define Display_ShiftLeft (Cursor_Display_Control | (2<<2)) //显示向左移动,游标跟着移动,AC = AC
  116. #define Display_ShiftRight (Cursor_Display_Control | (3<<2)) //显示向右移动,游标跟着移动,AC = AC
  117. //功能设定(function set)
  118. // b7 b6 b5 b4 b3 b2 b1 b0
  119. // 0 0 1 DL X 0/RE X X
  120. #define Function_SetBasic 0x20 //基数
  121. #define MPU_8bit (Function_SetBasic | (1<<4)) //8bit MPU接口
  122. #define MPU_4bit (Function_SetBasic | (0<<4)) //4bit MPU接口
  123. #define Instruct_Basic4 (MPU_4bit | (0<<2)) //4bit MPU接口,基本指令集
  124. #define Instruct_Basic8 (MPU_8bit | (0<<2)) //8bit MPU接口,基本指令集
  125. #define Instruct_Expansion4 (MPU_4bit | (1<<2)) //4bit MPU接口,扩充指令集
  126. #define Instruct_Expansion8 (MPU_8bit | (1<<2)) //8bit MPU接口,扩充指令集
  127. //设定CGRAM地址
  128. // b7 b6 b5 b4 b3 b2 b1 b0
  129. // 0 1 A5 A4 A3 A2 A1 A0
  130. #define CGRAM_Set 0x40 //基数
  131. //设定CGRAM地址到地址计数器(AC),AC范围为0x00 ~ 0x3f,需确认扩充指令中SR = 0(卷动位置或RAM地址选择)
  132. //设定DDRAM地址
  133. // b7 b6 b5 b4 b3 b2 b1 b0
  134. // 1 0 A5 A4 A3 A2 A1 A0
  135. #define DDRAM_Set 0x80 //基数
  136. //设定CGRAM地址到地址计数器(AC)
  137. //写显示数据到RAM(RS = 1 RW = 0)
  138. // b7 b6 b5 b4 b3 b2 b1 b0
  139. // D7 D6 D5 D4 D3 D2 D1 D0
  140. //写入数据后会使AC改变,每个RAM(CGRAM、DDRAM、IRAM)地址都可以连续写入2字节的显示数据,
  141. //当写入第二个字节时,地址计数器(AC)的值自动加1
  142. //读取显示数据到RAM(RS = 1 RW = 1)
  143. // b7 b6 b5 b4 b3 b2 b1 b0
  144. // D7 D6 D5 D4 D3 D2 D1 D0
  145. //读取数据后会使AC改变,设定RAM(CGRAM、DDRAM、IRAM)地址后,先要Dummy read一次后才能读取到正确的显示数据,
  146. //第二次读取不需要Dummy read,除非重新设定了RAM地址
  147. /***********扩充指令***********/
  148. //卷动位置或RAM地址选择
  149. // b7 b6 b5 b4 b3 b2 b1 b0
  150. // 0 0 0 0 0 0 1 SR
  151. #define Write_Roll_Address_Allow 0x03 //允许输入垂直卷动地址
  152. #define Write_IRAM_Address_Allow 0x02 //允许输入IRAM地址(扩充指令),及允许设定CGRAM地址(基本指令)
  153. //反白显示
  154. // b7 b6 b5 b4 b3 b2 b1 b0
  155. // 0 0 0 0 0 1 0 R0
  156. #define Display_White_One 0x04 //第一行反白显示
  157. #define Display_White_Two 0x05 //第二行反白显示
  158. //睡眠模式
  159. // b7 b6 b5 b4 b3 b2 b1 b0
  160. // 0 0 0 0 1 SL 0 0
  161. #define LCD_Sleep_Open (0x08 | (1<<2)) //进入睡眠模式
  162. #define LCD_Sleep_Close (0x08 | (0<<2)) //退出睡眠模式
  163. //扩充功能设定
  164. // b7 b6 b5 b4 b3 b2 b1 b0
  165. // 0 0 1 DL X RE G X
  166. #define MPU_4bit_Basic_Draw_Open (Instruct_Basic4 | (1<<1)) //4bit MPU接口,基本指令,绘图开
  167. #define MPU_4bit_Basic_Draw_Close (Instruct_Basic4 | (0<<1)) //4bit MPU接口,基本指令,绘图关
  168. #define MPU_8bit_Basic_Draw_Open (Instruct_Basic8 | (1<<1)) //8bit MPU接口,基本指令,绘图开
  169. #define MPU_8bit_Basic_Draw_Close (Instruct_Basic8 | (0<<1)) //8bit MPU接口,基本指令,绘图关
  170. #define MPU_8bit_Expansion_Draw_Open (Instruct_Expansion8 | (1<<1)) //8bit MPU接口,扩充指令,绘图开
  171. #define MPU_8bit_Expansion_Draw_Close (Instruct_Expansion8 | (0<<1)) //8bit MPU接口,扩充指令,绘图关
  172. #define MPU_4bit_Expansion_Draw_Open (Instruct_Expansion4 | (1<<1)) //4bit MPU接口,扩充指令,绘图开
  173. #define MPU_4bit_Expansion_Draw_Close (Instruct_Expansion4 | (0<<1)) //4bit MPU接口,扩充指令,绘图关
  174. //设定IRAM地址或卷动地址
  175. // b7 b6 b5 b4 b3 b2 b1 b0
  176. // 0 1 A5 A4 A3 A2 A1 A0
  177. #define IRAM_Set 0x40 //基数
  178. //SR = 1,A5 ~ A0为垂直卷动地址,SR = 0,A3 ~ A0为IRAM地址
  179. //设定绘图RAM地址
  180. // b7 b6 b5 b4 b3 b2 b1 b0
  181. // 1 0 0 0 A3 A2 A1 A0 --->水平地址范围:A3 ~ A0
  182. // 1 A6 A5 A4 A3 A2 A1 A0 --->垂直地址范围:A6 ~ A0
  183. #define Draw_RAMSet 0x80 //基数
  184. //设定GDRAM地址到地址计数器(AC),先设置垂直位置再设置水平位置(连续写入2字节数据来完成垂直与水平坐标的设置)。
  185. /**********************************************************
  186. 外部功能函数
  187. **********************************************************/
  188. void LCD_Init ( void ); //LCD YB12864ZB初始化
  189. void LCD_Clear ( void ); //LCD YB12864ZB清屏
  190. void LCD_Write_Byte ( u8 dat, u8 ord ); //LCD写入一个字节命令或者数据,判断忙标志
  191. void Display_String ( u8 x, u8 y, u8 *str, u8 len ); //LCD显示字符串
  192. void Display_String1 ( u8 x, u8 y, u8 *str, u8 starsum, u8 len ); //LCD显示字符串
  193. void Display_CGRAM ( u8 x, u8 y, u8 add_h, u8 add_l ); //显示一个CGRAM内容
  194. void Display_GDRAM ( u8 x, u8 y, u8 width, u8 height, u8 *bmp, u8 dis_mode ); //LCD写入GDRAM绘图
  195. #endif
  196. /*********************************************************/
  197. /*
  198. 1、指令表1(RE = 0,基本指令集)
  199. ___________________________________________________________________________
  200. | | 控制信号 | 控 制 代 码 | 执行 |
  201. | |____________|_______________________________________| |
  202. | 指令名称 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 时间 | HEX
  203. |_______________|____|_______|____|____|____|____|____|____|____|____|______|
  204. | 清除显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1.6ms| 0x01
  205. |_______________|____|_______|____|____|____|____|____|____|____|____|______|
  206. | 地址归0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 72us | 0x02 //不改变DDRAM内容
  207. |_______________|____|_______|____|____|____|____|____|____|____|____|______|
  208. | 进入设定点 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D| S | 72us | 0x06 游标右移 0x07 画面整体左移
  209. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x04 游标左移 0x05 画面整体右移
  210. | 显示开关设置 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | S | 72us | D = 1; 整体显示开 D = 0; 整体显示关 // 不改变DDRAM内容
  211. |_______________|____|_______|____|____|____|____|____|____|____|____|______| C = 1; 游标显示开 C = 0; 游标显示关 S = 1; 游标位置显示反白 S = 0; 正常显示
  212. | 移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C| R/L| X | X | 72us | 0x10 游标向左移动 AC = AC - 1 0x14 游标向右移动 AC = AC + 1
  213. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x18 显示向左移动 AC = AC 0x1c 显示向右移动 AC = AC
  214. | 功能设定 | 0 | 0 | 0 | 0 | 1 | DL | X |0/RE| X | X | 72us | 0x30 8bit接口,基本指令 0x34 8bit接口,扩充指令
  215. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x20 4bit接口,基本指令 0x24 4bit接口,扩充指令
  216. | 设定CGRAM地址 | 0 | 0 | 0 | 1 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
  217. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 设定CGRAM地址到地址计数器(AC),AC范围0x00 ~ 0x3f,需确认扩充指令中SR = 0
  218. | 设定DDRAM地址 | 0 | 0 | 1 | 0 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
  219. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 设定DDRAM地址到地址计数器(AC),第一行AC范围 0x80 ~ 0x8f 第二行AC范围 0x90 ~ 0x9f
  220. | 读忙标志和地址| 0 | 1 | BF | A6 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
  221. |_______________|____|_______|____|____|____|____|____|____|____|____|______| BF = 0; //可以接受新数据
  222. | 写显示数据 | 1 | 0 | 显示数据 | 72us |
  223. |_______________|____|_______|_______________________________________|______| 每个RAM(CGRAM、DDRAM、IRAM)地址都可以连续写入2个字节,第二个字节时AC自动增加1
  224. | 读显示数据 | 1 | 1 | 显示数据 | 72us |
  225. |_______________|____|_______|_______________________________________|______| 设定RAM(CGRAM、DDRAM、IRAM)地址后,先要Dummy read(假读)一次后才能读到正确的显示
  226. 数据,第二次读取不需要再Dummy read(假读)一次,除非重新设置了RAM地址
  227. 2、指令表2(RE = 1,扩充指令集)
  228. ___________________________________________________________________________
  229. | | 控制信号 | 控 制 代 码 | 执行 |
  230. | |____________|_______________________________________| |
  231. | 指令名称 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 时间 | HEX
  232. |_______________|____|_______|____|____|____|____|____|____|____|____|______|
  233. | 待命模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 72us | 0x01 该指令不能改变RAM内容
  234. |_______________|____|_______|____|____|____|____|____|____|____|____|______|
  235. | 卷动地址或 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SR | 72us |
  236. | RAM地址选择 | | | | | | | | | | | | 初始值0x02, 0x03 允许输入垂直卷动地址
  237. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x02 允许输入IRAM地址(扩充指令),及允许设定CGRAM地址(基本指令)
  238. | 反白显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | R1 | R0 | 72us |
  239. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 初始值0x04 0x05反白显示
  240. | 睡眠模式 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SL | X | X | 72us |
  241. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 0x0c 脱离睡眠模式 0x08 进入睡眠模式
  242. | 扩充功能设定 | 0 | 0 | 0 | 0 | 1 | DL | X |1/RE| G | 0 | 72us |
  243. |_______________|____|_______|____|____|____|____|____|____|____|____|______|
  244. |设定IRAM地址或 | 0 | 0 | 0 | 1 | A5 | A4 | A3 | A2 | A1 | A0 | 72us |
  245. | 卷动地址 | | | | | | | | | | | | SR = 1; //A5 ~ A0为垂直卷动地址
  246. |_______________|____|_______|____|____|____|____|____|____|____|____|______| SR = 0; //A3 ~ A0为IRAM地址
  247. | | | | | 0 | 0 | 0 | A3 | A2 | A1 | A0 | |
  248. | | | | |____|____|____|____|____|____|____| | 设定GDRAM地址到计数器地址(AC),先设置垂直地址再设置水平地址,
  249. |设定绘图RAM地址| 0 | 0 | 1 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | 72us | (连续写入2个字节数据来完成垂直和水平地址设置)
  250. |_______________|____|_______|____|____|____|____|____|____|____|____|______| 垂直地址范围:AC6 ~ AC0
  251. 水平地址范围:AC3 ~ AC0
  252. 扩充功能设定:
  253. DL = 1; //8bit MPU接口 DL = 0; //4bit MPU接口
  254. RE = 1; //扩充指令 RE = 0; //基本指令
  255. G = 1; //绘图显示开 G = 0; // 绘图显示关
  256. */