一文学会LCD12864显示中文、英文、反显
1、基本原理
驅動LCD其實就是往LCD的顯存寫數據,寫1的地方顯示,寫0的地方不顯示,反顯剛好相反;由于顯存以128列、64行分布,所以也稱12864液晶。
2、基本特性
工作電壓 3.3V,背光電壓 3.0V\45MA 通訊方式;
8 位并行(6800 和 8080 時序),4 線串行通訊 12864;
點陣顯示器內存(DDRAM 為 13265) ;
顯示對比度,內部寄存器調節(軟件調對比度);
占空比 1/64 偏壓比 1/9;
工作溫度 -20 到+70 度。
3、顯存映射
可以看出列定義為0-127,行地址范圍以8個像素為-個單 位定義為(0-7)頁,共64。
4、管腳說明
可以看出,29腳的高低電平決定了使用并口還是串口方式。
5、串行方式驅動時序
從圖中可以看出:
在CSB拉低的時候,進行數據或命令傳輸;
RS為高的時候傳輸數據,RS為低的時候傳輸指令;
SCL為時鐘;
SDA為數據。
6、串行寫流程
首先拉低CSB;
通過設置RS的電平,選擇寫數據或指令;
SCL拉低,bit7傳輸,SCL拉高,依次類推,從bit7到bit0完成一個字節的傳輸;
最后拉高CSB。
7、寫入數據流程
可以看出,寫數據之前,要先設置寫入的地址,這里有列地址(0-127列),頁地址(0-7頁),同時要注意,列地址會自加。
8、指令說明
9、原理設計
10、程序驅動
本文使用GD32驅動LCD。
10.1、io口定義以及初始化
#define LCD_SCL_PORT GPIOB #define LCD_SCL_PIN GPIO_PIN_6#define LCD_SDA_PORT GPIOB #define LCD_SDA_PIN GPIO_PIN_7#define LCD_CSB_PORT GPIOB #define LCD_CSB_PIN GPIO_PIN_11#define LCD_RST_PORT GPIOC #define LCD_RST_PIN GPIO_PIN_11#define LCD_A0_PORT GPIOC #define LCD_A0_PIN GPIO_PIN_13#define LCD_BKLED_PORT GPIOA #define LCD_BKLED_PIN GPIO_PIN_6#define LCD_CMD 1 #define LCD_DATA 0#define PORT(port) LCD_##port##_PORT #define PIN(pin) LCD_##pin##_PIN#define LCD_PIN_OUT(pin,level) { if(level) \{ gpio_bit_set(PORT(pin),PIN(pin));} \else \{ gpio_bit_reset(PORT(pin),PIN(pin));} \} void LcdIoInit(void) {rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_GPIOC);gpio_init(LCD_SCL_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_SCL_PIN);gpio_init(LCD_SDA_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_SDA_PIN);gpio_init(LCD_CSB_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_CSB_PIN);gpio_init(LCD_RST_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_RST_PIN);gpio_init(LCD_A0_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_A0_PIN);gpio_init(LCD_BKLED_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_BKLED_PIN);LCD_PIN_OUT(BKLED,1); }10.2、LCD寫
/* ismcd:高為數據,低為指令 */ static void LcdWrite(uint8_t iscmd ,uint8_t data) {uint8_t i;LCD_PIN_OUT(CSB,0);if(iscmd){LCD_PIN_OUT(A0,0);}else{LCD_PIN_OUT(A0,1);}for(i=0;i<8;i++){LCD_PIN_OUT(SCL,0);DelayUs(10); if(data&0x80){LCD_PIN_OUT(SDA,1);}else{LCD_PIN_OUT(SDA,0);}LCD_PIN_OUT(SCL,1);DelayUs(10);data=data<<1;}LCD_PIN_OUT(CSB,1); }10.3、LCD設置地址
void LcdAddress(uint8_t page,uint8_t column) {LcdWrite(LCD_CMD,0xb0+page); LcdWrite(LCD_CMD,((column>>4)&0x0f)+0x10); //設置列地址的高4 位 LcdWrite(LCD_CMD,((column>>0)&0x0f)+0x00); //設置列地址的低4 位 }10.4、LCD清屏
清屏,就是向顯存寫入0,即不顯示。
/*全屏清屏*/ void LcdClearScreen(void) {uint8_t i,j; for(i=0;i<8;i++) {LcdAddress(i,0); for(j=0;j<128;j++) {LcdWrite(LCD_DATA,0x00); }} }10.5、LCD顯示邊框
void LcdDispBK(void) {uint8_t i;//上框 LcdAddress(0,0); for (i=0;i<128;i++) {LcdWrite(LCD_DATA,0x01); }//下框 LcdAddress(7,0); for (i=0;i<128;i++) {LcdWrite(LCD_DATA,0x80); }//左框 for(i=0;i<8;i++) {LcdAddress(i,0); LcdWrite(LCD_DATA,0xff); }//右框 for(i=0;i<8;i++) {LcdAddress(i,127); LcdWrite(LCD_DATA,0xff); } }10.6、LCD顯示8*16字符串
void LcdDispStr8x16(uint8_t reverse,uint8_t page,uint8_t column,uint8_t *str) {uint16_t i=0,j; uint8_t zk[16];while(str[i]>0x00) {if((str[i]>=0x20)&&(str[i]<=0x7e)) {extern uint8_t GT20L16S1YGetAsciiData( uint8_t ASCIICode, uint32_t BaseAdd, uint8_t* S1YDZ_Data );GT20L16S1YGetAsciiData( str[i], 0x3b7c0, zk);LcdAddress(page,column); //上半部分for(j=0;j<8;j++) {if (reverse==1) {LcdWrite(LCD_DATA,zk[j]);}else {LcdWrite(LCD_DATA,~(zk[j])); }}LcdAddress(page+1,column);//下半部分for(j=0;j<8;j++) {if (reverse==1) {LcdWrite(LCD_DATA,zk[j+8]);}else {LcdWrite(LCD_DATA,~(zk[j+8])); }}i++; column+=8;}} }本文使用的GT20L16S1Y字庫,所以點陣數據直接從字庫讀取。
10.7、LCD顯示16*16漢字
void LcdDispStr16x16(uint8_t reverse,uint8_t page,uint8_t column,uint8_t *str) {uint16_t i=0,j;uint8_t zk[32];while(str[i]>0x00) {extern void GT20L16S1YGetGb2312Data( uint8_t MSB, uint8_t LSB, uint8_t* S1YDZ_Data );GT20L16S1YGetGb2312Data( str[i], str[i+1], zk );LcdAddress(page,column); //上半部分for(j=0;j<16;j++) {if (reverse==1) {LcdWrite(LCD_DATA,zk[j]);}else {LcdWrite(LCD_DATA,~(zk[j])); }}LcdAddress(page+1,column);//下半部分for(j=0;j<16;j++) {if (reverse==1) {LcdWrite(LCD_DATA,zk[j+16]);}else {LcdWrite(LCD_DATA,~(zk[j+16])); }}i++,i++; column+=16;} }本文使用的GT20L16S1Y字庫,所以點陣數據直接從字庫讀取。
10.8、LCD初始化
void LcdInit(void) {LcdIoInit();LCD_PIN_OUT(RST,0);DelayUs(20); LCD_PIN_OUT(RST,1); /*復位完畢*/ DelayUs(20); LcdWrite(LCD_CMD,0xe2); /*軟復位*/ DelayUs(50); LcdWrite(LCD_CMD,0x2c); /*升壓步聚1*/ DelayUs(50); LcdWrite(LCD_CMD,0x2e); /*升壓步聚2*/ DelayUs(50); LcdWrite(LCD_CMD,0x2f); /*升壓步聚3*/ DelayUs(50); LcdWrite(LCD_CMD,0x24); /*粗調對比度,可設置范圍0x20~0x27*/ LcdWrite(LCD_CMD,0x81); /*微調對比度*/ LcdWrite(LCD_CMD,0x1b); /*0x1a,微調對比度的值,可設置范圍0x00~0x3f 1f*/ LcdWrite(LCD_CMD,0xa3); /*偏壓比(bias),0xa2:1/9 0xa3:1=1/7 */ LcdWrite(LCD_CMD,0xc8); /*行掃描順序:從上到下*/ LcdWrite(LCD_CMD,0xa0); /*列掃描順序:從左到右*/ LcdWrite(LCD_CMD,0x40); /*起始行:第一行開始*/ LcdWrite(LCD_CMD,0xaf); /*開顯示*/ LcdClearScreen();LcdDispBK();LcdDispStr8x16(0,2,20,(uint8_t*)"display,test") ;LcdDispStr16x16(1,5,50,(uint8_t*)"你好"); }注:如果顯示不清晰,可以通過偏壓比,對比度來調節。
11、顯示測試
圖中顯示了中文、英文、邊框,還實現了反顯。
總結
以上是生活随笔為你收集整理的一文学会LCD12864显示中文、英文、反显的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab help函数用法,MATL
- 下一篇: 关于STM32、温度传感器论文的参考文献