YX ZHANG
/
ChnLCD12864
ST7920 based Chinese LCD driver
Embed:
(wiki syntax)
Show/hide line numbers
chn12864.cpp
00001 /****************************************************************************************** 00002 * 版权 : 00003 * 模块名称 :st7920驱动的12864液晶的串行工作方式驱动程序 00004 * 作者 : 00005 * 创建日期 :2009-10-15 00006 * 功能概要 : 00007 *----------------------------------------修改历史------------------------------------------ 00008 * 当前版本 : 修改人: 修改日期: 00009 * 修改说明 : 00010 ******************************************************************************************/ 00011 00012 #include "chn12864.h" 00013 #include "mbed.h" 00014 00015 #define x1 0x80 00016 #define x2 0x88 00017 #define y 0x80 00018 #define comm 0 00019 #define dat 1 00020 00021 static uint8_t const num_lcd[] = {"0123456789 :.-"}; 00022 00023 /****************************************************************************************** 00024 * 函数名称 :Lcd_init 00025 * 功能描述 :初始化LCD 00026 * 参数 : 参数名称: 输入/输出? 类型 描述 00027 * 00028 * 返回值 : 00029 * 作者 : 00030 * 创建日期 :2008-12-19 00031 * 全局变量 : 00032 * 全局静态变量: 00033 * 局部静态变量: 00034 *----------------------------------------修改历史------------------------------------------ 00035 * 当前版本 : 修改人: 修改日期: 00036 * 修改说明 : 00037 ******************************************************************************************/ 00038 ChnLCD12864::ChnLCD12864(PinName sid, PinName sck, PinName cs) : _sid(sid),_sck(sck),_cs(cs) 00039 { 00040 wait(1e-3 * 50); //启动等待,等LCM讲入工作状态 00041 _cs=1; 00042 Write_Char(0, 0x30); //8 位介面,基本指令集 00043 wait(1e-3 * 1); 00044 Write_Char(0, 0x30); //8 位介面,基本指令集 00045 Write_Char(0, 0x30); //8 位介面,基本指令集 00046 Write_Char(0, 0x0c); //显示打开,光标关,反白关 00047 Write_Char(0, 0x01); //清屏,将DDRAM的地址计数器归零 00048 locate(0,0); 00049 } 00050 00051 /****************************************************************************************** 00052 * 函数名称 :Write_char 00053 * 功能描述 :写指令或数据 00054 * 参数 : 参数名称: 输入/输出? 类型 描述 00055 * 00056 * 返回值 : 00057 * 作者 : 00058 * 创建日期 :2006-12-19 00059 * 全局变量 : 00060 * 全局静态变量: 00061 * 局部静态变量: 00062 *----------------------------------------修改历史------------------------------------------ 00063 * 当前版本 : 修改人: 修改日期: 00064 * 修改说明 : 00065 ******************************************************************************************/ 00066 void ChnLCD12864::Write_Char(uint8_t start, uint8_t ddata) 00067 { 00068 uint8_t start_data, Hdata, Ldata; 00069 if (start == 0) 00070 start_data = 0xf8; //写指令 00071 else 00072 start_data = 0xfa; //写数据 00073 00074 Hdata = ddata & 0xf0; //取高四位 00075 Ldata = (ddata << 4) & 0xf0; //取低四位 00076 Send_Byte(start_data); //发送起始信号 00077 wait(1e-6 * 10); 00078 Send_Byte(Hdata); //发送高四位 00079 wait(1e-6 * 10); 00080 Send_Byte(Ldata); //发送低四位 00081 wait(1e-6 * 10); 00082 } 00083 00084 /****************************************************************************************** 00085 * 函数名称 :Send_byte 00086 * 功能描述 :发送一个字节 00087 * 参数 : 参数名称: 输入/输出? 类型 描述 00088 * 00089 * 返回值 : 00090 * 作者 : 00091 * 创建日期 :2009-10-19 00092 * 全局变量 : 00093 * 全局静态变量: 00094 * 局部静态变量: 00095 *----------------------------------------修改历史------------------------------------------ 00096 * 当前版本 : 修改人: 修改日期: 00097 * 修改说明 : 00098 ******************************************************************************************/ 00099 void ChnLCD12864::Send_Byte(uint8_t bbyte) 00100 { 00101 volatile uint8_t i; 00102 for (i = 0; i < 8; i++) { 00103 if ((bbyte) & 0x80) 00104 _sid=1; //取出最高位 00105 else 00106 _sid=0; 00107 _sck=1; 00108 wait(1e-6 * 100); //延时 lcd读取数据 00109 _sck=0; 00110 bbyte <<= 1; //左移 00111 } 00112 } 00113 00114 00115 /****************************************************************************************** 00116 * 函数名称 :LCD12864_Clr_Scr 00117 * 功能描述 :清屏函数 00118 * 参数 : 参数名称: 输入/输出? 类型 描述 00119 * 00120 * 返回值 : 00121 * 作者 : 00122 * 创建日期 :2009-10-19 00123 * 全局变量 : 00124 * 全局静态变量: 00125 * 局部静态变量: 00126 *----------------------------------------修改历史------------------------------------------ 00127 * 当前版本 : 修改人: 修改日期: 00128 * 修改说明 : 00129 ******************************************************************************************/ 00130 void ChnLCD12864::cls(void)//清屏函数 00131 { 00132 Write_Char(0, 0x01); 00133 } 00134 00135 /****************************************************************************************** 00136 * 函数名称 : LCD12864_set_xy 00137 * 功能描述 :设置LCD显示的起始位置,X为行,Y为列 00138 * 参数 : 参数名称: 输入/输出? 类型 描述 00139 * 00140 * 返回值 : 00141 * 作者 : 00142 * 创建日期 :2006-12-19 00143 * 全局变量 : 00144 * 全局静态变量: 00145 * 局部静态变量: 00146 *----------------------------------------修改历史------------------------------------------ 00147 * 当前版本 : 修改人: 修改日期: 00148 * 修改说明 : 00149 ******************************************************************************************/ 00150 void ChnLCD12864::locate( uint8_t col, uint8_t row ) 00151 { 00152 uint8_t address; 00153 uint8_t X = row, Y = col; 00154 _row = X; 00155 _column = Y*2; 00156 switch (X) { 00157 case 0: 00158 address = 0x80 + Y; 00159 break; 00160 case 1: 00161 address = 0x90 + Y; 00162 break; 00163 case 2: 00164 address = 0x88 + Y; 00165 break; 00166 case 3: 00167 address = 0x98 + Y; 00168 break; 00169 default: 00170 address = 0x80 + Y; 00171 break; 00172 } 00173 Write_Char(0, address); 00174 } 00175 00176 /****************************************************************************************** 00177 * 函数名称 :LCD12864_Write_string 00178 * 功能描述 :中英文字符串显示函数 00179 * 参数 : 参数名称: 输入/输出? 类型 描述 00180 * 00181 * 返回值 : 00182 * 作者 : 00183 * 创建日期 :2006-12-19 00184 * 全局变量 : 00185 * 全局静态变量: 00186 * 局部静态变量: 00187 *----------------------------------------修改历史------------------------------------------ 00188 * 当前版本 : 修改人: 修改日期: 00189 * 修改说明 : 00190 ******************************************************************************************/ 00191 void ChnLCD12864::Write_String(uint8_t X, uint8_t Y, char *s) 00192 { 00193 locate( Y, X ); 00194 00195 while (*s) { 00196 Write_Char( 1, *s ); 00197 s ++; 00198 wait(1e-3 * 1); 00199 } 00200 } 00201 00202 void ChnLCD12864::Write_String_Length(uint8_t X, uint8_t Y, char *s, int length) 00203 { 00204 locate( Y, X ); 00205 00206 while(length--) { 00207 Write_Char( 1, *s ); 00208 s ++; 00209 wait(1e-3 * 1); 00210 } 00211 } 00212 00213 /****************************************************************************************** 00214 * 函数名称 :LCD12864_Write_number 00215 * 功能描述 :数字显示函数 00216 * 参数 : 参数名称: 输入/输出? 类型 描述 00217 * 00218 * 返回值 : 00219 * 作者 : 00220 * 创建日期 :2006-12-19 00221 * 全局变量 : 00222 * 全局静态变量: 00223 * 局部静态变量: 00224 *----------------------------------------修改历史------------------------------------------ 00225 * 当前版本 : 修改人: 修改日期: 00226 * 修改说明 : 00227 ******************************************************************************************/ 00228 void ChnLCD12864::Write_Number(uint8_t s)// 数字显示函数 00229 { 00230 Write_Char(1, num_lcd[s]); 00231 wait(1e-3 * 1); 00232 } 00233 00234 /****************************************************************************************** 00235 * 函数名称 :img_disp 00236 * 功能描述 :显示图形 00237 * 参数 : 参数名称: 输入/输出? 类型 描述 00238 * 00239 * 返回值 : 00240 * 作者 : 00241 * 创建日期 :2006-12-19 00242 * 全局变量 : 00243 * 全局静态变量: 00244 * 局部静态变量: 00245 *----------------------------------------修改历史------------------------------------------ 00246 * 当前版本 : 修改人: 修改日期: 00247 * 修改说明 : 00248 ******************************************************************************************/ 00249 void ChnLCD12864::Display_Img(uint8_t const *img) 00250 { 00251 uint8_t i, j; 00252 for (j = 0; j < 32; j++) { 00253 for (i = 0; i < 8; i++) { 00254 Write_Char(comm, 0x34); 00255 wait(1e-3 * 10); 00256 Write_Char(comm, y + j); 00257 wait(1e-3 * 10); 00258 Write_Char(comm, x1 + i); 00259 wait(1e-3 * 10); 00260 Write_Char(comm, 0x30); 00261 wait(1e-3 * 10); 00262 Write_Char(dat, img[j * 16 + i * 2]); 00263 wait(1e-3 * 10); 00264 Write_Char(dat, img[j * 16 + i * 2 + 1]); 00265 wait(1e-3 * 10); 00266 } 00267 } 00268 for (j = 32; j < 64; j++) { 00269 for (i = 0; i < 8; i++) { 00270 Write_Char(comm, 0x34); 00271 wait(1e-3 * 10); 00272 Write_Char(comm, y + j - 32); 00273 wait(1e-3 * 10); 00274 Write_Char(comm, x2 + i); 00275 wait(1e-3 * 10); 00276 Write_Char(comm, 0x30); 00277 wait(1e-3 * 10); 00278 Write_Char(dat, img[j * 16 + i * 2]); 00279 wait(1e-3 * 10); 00280 Write_Char(dat, img[j * 16 + i * 2 + 1]); 00281 wait(1e-3 * 10); 00282 } 00283 } 00284 wait(1e-3 * 10); 00285 Write_Char(comm, 0x36); 00286 } 00287 00288 00289 int ChnLCD12864::_putc(int value) { 00290 if (value == '\n') { 00291 _column = 0; 00292 _row++; 00293 if (_row >= 4) { 00294 _row = 0; 00295 } 00296 } else { 00297 Write_Char( 1, value ); 00298 wait(1e-3 * 1); 00299 _column++; 00300 if (_column >= 16) { 00301 _column = 0; 00302 _row++; 00303 if (_row >= 4) { 00304 _row = 0; 00305 } 00306 locate(0, _row); 00307 } 00308 } 00309 return value; 00310 }
Generated on Tue Jul 12 2022 21:51:46 by 1.7.2