ST7920 based Chinese LCD driver

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers chn12864.cpp Source File

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 }