ST7920 based Chinese LCD driver

Dependencies:   mbed

Committer:
zhangyx
Date:
Sat Jul 22 04:17:18 2017 +0000
Revision:
1:426eea211d41
Parent:
0:7749526f3bdf
link to text2hex converter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zhangyx 0:7749526f3bdf 1 /******************************************************************************************
zhangyx 0:7749526f3bdf 2 * 版权 :
zhangyx 0:7749526f3bdf 3 * 模块名称 :st7920驱动的12864液晶的串行工作方式驱动程序
zhangyx 0:7749526f3bdf 4 * 作者 :
zhangyx 0:7749526f3bdf 5 * 创建日期 :2009-10-15
zhangyx 0:7749526f3bdf 6 * 功能概要 :
zhangyx 0:7749526f3bdf 7 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 8 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 9 * 修改说明 :
zhangyx 0:7749526f3bdf 10 ******************************************************************************************/
zhangyx 0:7749526f3bdf 11
zhangyx 0:7749526f3bdf 12 #include "chn12864.h"
zhangyx 0:7749526f3bdf 13 #include "mbed.h"
zhangyx 0:7749526f3bdf 14
zhangyx 0:7749526f3bdf 15 #define x1 0x80
zhangyx 0:7749526f3bdf 16 #define x2 0x88
zhangyx 0:7749526f3bdf 17 #define y 0x80
zhangyx 0:7749526f3bdf 18 #define comm 0
zhangyx 0:7749526f3bdf 19 #define dat 1
zhangyx 0:7749526f3bdf 20
zhangyx 0:7749526f3bdf 21 static uint8_t const num_lcd[] = {"0123456789 :.-"};
zhangyx 0:7749526f3bdf 22
zhangyx 0:7749526f3bdf 23 /******************************************************************************************
zhangyx 0:7749526f3bdf 24 * 函数名称 :Lcd_init
zhangyx 0:7749526f3bdf 25 * 功能描述 :初始化LCD
zhangyx 0:7749526f3bdf 26 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 27 *
zhangyx 0:7749526f3bdf 28 * 返回值 :
zhangyx 0:7749526f3bdf 29 * 作者 :
zhangyx 0:7749526f3bdf 30 * 创建日期 :2008-12-19
zhangyx 0:7749526f3bdf 31 * 全局变量 :
zhangyx 0:7749526f3bdf 32 * 全局静态变量:
zhangyx 0:7749526f3bdf 33 * 局部静态变量:
zhangyx 0:7749526f3bdf 34 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 35 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 36 * 修改说明 :
zhangyx 0:7749526f3bdf 37 ******************************************************************************************/
zhangyx 0:7749526f3bdf 38 ChnLCD12864::ChnLCD12864(PinName sid, PinName sck, PinName cs) : _sid(sid),_sck(sck),_cs(cs)
zhangyx 0:7749526f3bdf 39 {
zhangyx 0:7749526f3bdf 40 wait(1e-3 * 50); //启动等待,等LCM讲入工作状态
zhangyx 0:7749526f3bdf 41 _cs=1;
zhangyx 0:7749526f3bdf 42 Write_Char(0, 0x30); //8 位介面,基本指令集
zhangyx 0:7749526f3bdf 43 wait(1e-3 * 1);
zhangyx 0:7749526f3bdf 44 Write_Char(0, 0x30); //8 位介面,基本指令集
zhangyx 0:7749526f3bdf 45 Write_Char(0, 0x30); //8 位介面,基本指令集
zhangyx 0:7749526f3bdf 46 Write_Char(0, 0x0c); //显示打开,光标关,反白关
zhangyx 0:7749526f3bdf 47 Write_Char(0, 0x01); //清屏,将DDRAM的地址计数器归零
zhangyx 0:7749526f3bdf 48 locate(0,0);
zhangyx 0:7749526f3bdf 49 }
zhangyx 0:7749526f3bdf 50
zhangyx 0:7749526f3bdf 51 /******************************************************************************************
zhangyx 0:7749526f3bdf 52 * 函数名称 :Write_char
zhangyx 0:7749526f3bdf 53 * 功能描述 :写指令或数据
zhangyx 0:7749526f3bdf 54 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 55 *
zhangyx 0:7749526f3bdf 56 * 返回值 :
zhangyx 0:7749526f3bdf 57 * 作者 :
zhangyx 0:7749526f3bdf 58 * 创建日期 :2006-12-19
zhangyx 0:7749526f3bdf 59 * 全局变量 :
zhangyx 0:7749526f3bdf 60 * 全局静态变量:
zhangyx 0:7749526f3bdf 61 * 局部静态变量:
zhangyx 0:7749526f3bdf 62 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 63 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 64 * 修改说明 :
zhangyx 0:7749526f3bdf 65 ******************************************************************************************/
zhangyx 0:7749526f3bdf 66 void ChnLCD12864::Write_Char(uint8_t start, uint8_t ddata)
zhangyx 0:7749526f3bdf 67 {
zhangyx 0:7749526f3bdf 68 uint8_t start_data, Hdata, Ldata;
zhangyx 0:7749526f3bdf 69 if (start == 0)
zhangyx 0:7749526f3bdf 70 start_data = 0xf8; //写指令
zhangyx 0:7749526f3bdf 71 else
zhangyx 0:7749526f3bdf 72 start_data = 0xfa; //写数据
zhangyx 0:7749526f3bdf 73
zhangyx 0:7749526f3bdf 74 Hdata = ddata & 0xf0; //取高四位
zhangyx 0:7749526f3bdf 75 Ldata = (ddata << 4) & 0xf0; //取低四位
zhangyx 0:7749526f3bdf 76 Send_Byte(start_data); //发送起始信号
zhangyx 0:7749526f3bdf 77 wait(1e-6 * 10);
zhangyx 0:7749526f3bdf 78 Send_Byte(Hdata); //发送高四位
zhangyx 0:7749526f3bdf 79 wait(1e-6 * 10);
zhangyx 0:7749526f3bdf 80 Send_Byte(Ldata); //发送低四位
zhangyx 0:7749526f3bdf 81 wait(1e-6 * 10);
zhangyx 0:7749526f3bdf 82 }
zhangyx 0:7749526f3bdf 83
zhangyx 0:7749526f3bdf 84 /******************************************************************************************
zhangyx 0:7749526f3bdf 85 * 函数名称 :Send_byte
zhangyx 0:7749526f3bdf 86 * 功能描述 :发送一个字节
zhangyx 0:7749526f3bdf 87 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 88 *
zhangyx 0:7749526f3bdf 89 * 返回值 :
zhangyx 0:7749526f3bdf 90 * 作者 :
zhangyx 0:7749526f3bdf 91 * 创建日期 :2009-10-19
zhangyx 0:7749526f3bdf 92 * 全局变量 :
zhangyx 0:7749526f3bdf 93 * 全局静态变量:
zhangyx 0:7749526f3bdf 94 * 局部静态变量:
zhangyx 0:7749526f3bdf 95 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 96 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 97 * 修改说明 :
zhangyx 0:7749526f3bdf 98 ******************************************************************************************/
zhangyx 0:7749526f3bdf 99 void ChnLCD12864::Send_Byte(uint8_t bbyte)
zhangyx 0:7749526f3bdf 100 {
zhangyx 0:7749526f3bdf 101 volatile uint8_t i;
zhangyx 0:7749526f3bdf 102 for (i = 0; i < 8; i++) {
zhangyx 0:7749526f3bdf 103 if ((bbyte) & 0x80)
zhangyx 0:7749526f3bdf 104 _sid=1; //取出最高位
zhangyx 0:7749526f3bdf 105 else
zhangyx 0:7749526f3bdf 106 _sid=0;
zhangyx 0:7749526f3bdf 107 _sck=1;
zhangyx 0:7749526f3bdf 108 wait(1e-6 * 100); //延时 lcd读取数据
zhangyx 0:7749526f3bdf 109 _sck=0;
zhangyx 0:7749526f3bdf 110 bbyte <<= 1; //左移
zhangyx 0:7749526f3bdf 111 }
zhangyx 0:7749526f3bdf 112 }
zhangyx 0:7749526f3bdf 113
zhangyx 0:7749526f3bdf 114
zhangyx 0:7749526f3bdf 115 /******************************************************************************************
zhangyx 0:7749526f3bdf 116 * 函数名称 :LCD12864_Clr_Scr
zhangyx 0:7749526f3bdf 117 * 功能描述 :清屏函数
zhangyx 0:7749526f3bdf 118 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 119 *
zhangyx 0:7749526f3bdf 120 * 返回值 :
zhangyx 0:7749526f3bdf 121 * 作者 :
zhangyx 0:7749526f3bdf 122 * 创建日期 :2009-10-19
zhangyx 0:7749526f3bdf 123 * 全局变量 :
zhangyx 0:7749526f3bdf 124 * 全局静态变量:
zhangyx 0:7749526f3bdf 125 * 局部静态变量:
zhangyx 0:7749526f3bdf 126 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 127 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 128 * 修改说明 :
zhangyx 0:7749526f3bdf 129 ******************************************************************************************/
zhangyx 0:7749526f3bdf 130 void ChnLCD12864::cls(void)//清屏函数
zhangyx 0:7749526f3bdf 131 {
zhangyx 0:7749526f3bdf 132 Write_Char(0, 0x01);
zhangyx 0:7749526f3bdf 133 }
zhangyx 0:7749526f3bdf 134
zhangyx 0:7749526f3bdf 135 /******************************************************************************************
zhangyx 0:7749526f3bdf 136 * 函数名称 : LCD12864_set_xy
zhangyx 0:7749526f3bdf 137 * 功能描述 :设置LCD显示的起始位置,X为行,Y为列
zhangyx 0:7749526f3bdf 138 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 139 *
zhangyx 0:7749526f3bdf 140 * 返回值 :
zhangyx 0:7749526f3bdf 141 * 作者 :
zhangyx 0:7749526f3bdf 142 * 创建日期 :2006-12-19
zhangyx 0:7749526f3bdf 143 * 全局变量 :
zhangyx 0:7749526f3bdf 144 * 全局静态变量:
zhangyx 0:7749526f3bdf 145 * 局部静态变量:
zhangyx 0:7749526f3bdf 146 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 147 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 148 * 修改说明 :
zhangyx 0:7749526f3bdf 149 ******************************************************************************************/
zhangyx 0:7749526f3bdf 150 void ChnLCD12864::locate( uint8_t col, uint8_t row )
zhangyx 0:7749526f3bdf 151 {
zhangyx 0:7749526f3bdf 152 uint8_t address;
zhangyx 0:7749526f3bdf 153 uint8_t X = row, Y = col;
zhangyx 0:7749526f3bdf 154 _row = X;
zhangyx 0:7749526f3bdf 155 _column = Y*2;
zhangyx 0:7749526f3bdf 156 switch (X) {
zhangyx 0:7749526f3bdf 157 case 0:
zhangyx 0:7749526f3bdf 158 address = 0x80 + Y;
zhangyx 0:7749526f3bdf 159 break;
zhangyx 0:7749526f3bdf 160 case 1:
zhangyx 0:7749526f3bdf 161 address = 0x90 + Y;
zhangyx 0:7749526f3bdf 162 break;
zhangyx 0:7749526f3bdf 163 case 2:
zhangyx 0:7749526f3bdf 164 address = 0x88 + Y;
zhangyx 0:7749526f3bdf 165 break;
zhangyx 0:7749526f3bdf 166 case 3:
zhangyx 0:7749526f3bdf 167 address = 0x98 + Y;
zhangyx 0:7749526f3bdf 168 break;
zhangyx 0:7749526f3bdf 169 default:
zhangyx 0:7749526f3bdf 170 address = 0x80 + Y;
zhangyx 0:7749526f3bdf 171 break;
zhangyx 0:7749526f3bdf 172 }
zhangyx 0:7749526f3bdf 173 Write_Char(0, address);
zhangyx 0:7749526f3bdf 174 }
zhangyx 0:7749526f3bdf 175
zhangyx 0:7749526f3bdf 176 /******************************************************************************************
zhangyx 0:7749526f3bdf 177 * 函数名称 :LCD12864_Write_string
zhangyx 0:7749526f3bdf 178 * 功能描述 :中英文字符串显示函数
zhangyx 0:7749526f3bdf 179 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 180 *
zhangyx 0:7749526f3bdf 181 * 返回值 :
zhangyx 0:7749526f3bdf 182 * 作者 :
zhangyx 0:7749526f3bdf 183 * 创建日期 :2006-12-19
zhangyx 0:7749526f3bdf 184 * 全局变量 :
zhangyx 0:7749526f3bdf 185 * 全局静态变量:
zhangyx 0:7749526f3bdf 186 * 局部静态变量:
zhangyx 0:7749526f3bdf 187 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 188 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 189 * 修改说明 :
zhangyx 0:7749526f3bdf 190 ******************************************************************************************/
zhangyx 0:7749526f3bdf 191 void ChnLCD12864::Write_String(uint8_t X, uint8_t Y, char *s)
zhangyx 0:7749526f3bdf 192 {
zhangyx 0:7749526f3bdf 193 locate( Y, X );
zhangyx 0:7749526f3bdf 194
zhangyx 0:7749526f3bdf 195 while (*s) {
zhangyx 0:7749526f3bdf 196 Write_Char( 1, *s );
zhangyx 0:7749526f3bdf 197 s ++;
zhangyx 0:7749526f3bdf 198 wait(1e-3 * 1);
zhangyx 0:7749526f3bdf 199 }
zhangyx 0:7749526f3bdf 200 }
zhangyx 0:7749526f3bdf 201
zhangyx 0:7749526f3bdf 202 void ChnLCD12864::Write_String_Length(uint8_t X, uint8_t Y, char *s, int length)
zhangyx 0:7749526f3bdf 203 {
zhangyx 0:7749526f3bdf 204 locate( Y, X );
zhangyx 0:7749526f3bdf 205
zhangyx 0:7749526f3bdf 206 while(length--) {
zhangyx 0:7749526f3bdf 207 Write_Char( 1, *s );
zhangyx 0:7749526f3bdf 208 s ++;
zhangyx 0:7749526f3bdf 209 wait(1e-3 * 1);
zhangyx 0:7749526f3bdf 210 }
zhangyx 0:7749526f3bdf 211 }
zhangyx 0:7749526f3bdf 212
zhangyx 0:7749526f3bdf 213 /******************************************************************************************
zhangyx 0:7749526f3bdf 214 * 函数名称 :LCD12864_Write_number
zhangyx 0:7749526f3bdf 215 * 功能描述 :数字显示函数
zhangyx 0:7749526f3bdf 216 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 217 *
zhangyx 0:7749526f3bdf 218 * 返回值 :
zhangyx 0:7749526f3bdf 219 * 作者 :
zhangyx 0:7749526f3bdf 220 * 创建日期 :2006-12-19
zhangyx 0:7749526f3bdf 221 * 全局变量 :
zhangyx 0:7749526f3bdf 222 * 全局静态变量:
zhangyx 0:7749526f3bdf 223 * 局部静态变量:
zhangyx 0:7749526f3bdf 224 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 225 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 226 * 修改说明 :
zhangyx 0:7749526f3bdf 227 ******************************************************************************************/
zhangyx 0:7749526f3bdf 228 void ChnLCD12864::Write_Number(uint8_t s)// 数字显示函数
zhangyx 0:7749526f3bdf 229 {
zhangyx 0:7749526f3bdf 230 Write_Char(1, num_lcd[s]);
zhangyx 0:7749526f3bdf 231 wait(1e-3 * 1);
zhangyx 0:7749526f3bdf 232 }
zhangyx 0:7749526f3bdf 233
zhangyx 0:7749526f3bdf 234 /******************************************************************************************
zhangyx 0:7749526f3bdf 235 * 函数名称 :img_disp
zhangyx 0:7749526f3bdf 236 * 功能描述 :显示图形
zhangyx 0:7749526f3bdf 237 * 参数 : 参数名称: 输入/输出? 类型 描述
zhangyx 0:7749526f3bdf 238 *
zhangyx 0:7749526f3bdf 239 * 返回值 :
zhangyx 0:7749526f3bdf 240 * 作者 :
zhangyx 0:7749526f3bdf 241 * 创建日期 :2006-12-19
zhangyx 0:7749526f3bdf 242 * 全局变量 :
zhangyx 0:7749526f3bdf 243 * 全局静态变量:
zhangyx 0:7749526f3bdf 244 * 局部静态变量:
zhangyx 0:7749526f3bdf 245 *----------------------------------------修改历史------------------------------------------
zhangyx 0:7749526f3bdf 246 * 当前版本 : 修改人: 修改日期:
zhangyx 0:7749526f3bdf 247 * 修改说明 :
zhangyx 0:7749526f3bdf 248 ******************************************************************************************/
zhangyx 0:7749526f3bdf 249 void ChnLCD12864::Display_Img(uint8_t const *img)
zhangyx 0:7749526f3bdf 250 {
zhangyx 0:7749526f3bdf 251 uint8_t i, j;
zhangyx 0:7749526f3bdf 252 for (j = 0; j < 32; j++) {
zhangyx 0:7749526f3bdf 253 for (i = 0; i < 8; i++) {
zhangyx 0:7749526f3bdf 254 Write_Char(comm, 0x34);
zhangyx 0:7749526f3bdf 255 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 256 Write_Char(comm, y + j);
zhangyx 0:7749526f3bdf 257 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 258 Write_Char(comm, x1 + i);
zhangyx 0:7749526f3bdf 259 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 260 Write_Char(comm, 0x30);
zhangyx 0:7749526f3bdf 261 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 262 Write_Char(dat, img[j * 16 + i * 2]);
zhangyx 0:7749526f3bdf 263 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 264 Write_Char(dat, img[j * 16 + i * 2 + 1]);
zhangyx 0:7749526f3bdf 265 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 266 }
zhangyx 0:7749526f3bdf 267 }
zhangyx 0:7749526f3bdf 268 for (j = 32; j < 64; j++) {
zhangyx 0:7749526f3bdf 269 for (i = 0; i < 8; i++) {
zhangyx 0:7749526f3bdf 270 Write_Char(comm, 0x34);
zhangyx 0:7749526f3bdf 271 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 272 Write_Char(comm, y + j - 32);
zhangyx 0:7749526f3bdf 273 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 274 Write_Char(comm, x2 + i);
zhangyx 0:7749526f3bdf 275 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 276 Write_Char(comm, 0x30);
zhangyx 0:7749526f3bdf 277 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 278 Write_Char(dat, img[j * 16 + i * 2]);
zhangyx 0:7749526f3bdf 279 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 280 Write_Char(dat, img[j * 16 + i * 2 + 1]);
zhangyx 0:7749526f3bdf 281 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 282 }
zhangyx 0:7749526f3bdf 283 }
zhangyx 0:7749526f3bdf 284 wait(1e-3 * 10);
zhangyx 0:7749526f3bdf 285 Write_Char(comm, 0x36);
zhangyx 0:7749526f3bdf 286 }
zhangyx 0:7749526f3bdf 287
zhangyx 0:7749526f3bdf 288
zhangyx 0:7749526f3bdf 289 int ChnLCD12864::_putc(int value) {
zhangyx 0:7749526f3bdf 290 if (value == '\n') {
zhangyx 0:7749526f3bdf 291 _column = 0;
zhangyx 0:7749526f3bdf 292 _row++;
zhangyx 0:7749526f3bdf 293 if (_row >= 4) {
zhangyx 0:7749526f3bdf 294 _row = 0;
zhangyx 0:7749526f3bdf 295 }
zhangyx 0:7749526f3bdf 296 } else {
zhangyx 0:7749526f3bdf 297 Write_Char( 1, value );
zhangyx 0:7749526f3bdf 298 wait(1e-3 * 1);
zhangyx 0:7749526f3bdf 299 _column++;
zhangyx 0:7749526f3bdf 300 if (_column >= 16) {
zhangyx 0:7749526f3bdf 301 _column = 0;
zhangyx 0:7749526f3bdf 302 _row++;
zhangyx 0:7749526f3bdf 303 if (_row >= 4) {
zhangyx 0:7749526f3bdf 304 _row = 0;
zhangyx 0:7749526f3bdf 305 }
zhangyx 0:7749526f3bdf 306 locate(0, _row);
zhangyx 0:7749526f3bdf 307 }
zhangyx 0:7749526f3bdf 308 }
zhangyx 0:7749526f3bdf 309 return value;
zhangyx 0:7749526f3bdf 310 }