生活随笔
收集整理的這篇文章主要介紹了
LCD 12864B V2.0的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
內置ST7920控制器和中文字庫的LCD12864的使用
前言
大家好,我是小灬賤。今天我給大家帶來LCD12864的使用方法以及我的一些經驗。
文章里面如有不妥之處或者表達不清晰的地方還請各位多多指教。可以在文下評論或者私信我。
軟件環境
1.系統:Windows 10
2.單片機:Atmega16
3.軟件環境:Atmel studio 7.0
頭文件
#define F_CPU 8000000
#include <avr/io.h>
#include<util/delay.h>
#include <avr/pgmspace.h>
首先我們先來了解屏幕的那么多個引腳分別是干什么的
到這里可能很多人都會有一個問題:一腳究竟是哪個腳?
好,問題不大,我這就告訴你
好,知道引腳對應的是什么功能那我們就繼續了解他的控制指令
基本指令表(RE=0)
擴充指令表(RE=1)
指令詳解
知道這些指令會讓屏幕發什么變化還不夠,最重要的就是MCU跟LCD的通信方式和通信要求;
什么是通信呢? 可以理解為MCU跟LCD之間語言(就像我跟你之間有個"普通話"),只有共同的通信方式才能傳達我想傳達的指令;不然就會可能出現"對牛彈琴"這種無奈又可笑的尷尬;
并行時序圖
通過以上時序圖,我們可以得知LCD的并行是一個跟6800一樣的的通信方式
這個12864的并行通信可以分為兩種
- 使用8位數據線外加三根控制線的標準6800通信
- 使用4位數據線外加三根控制線的半6800通信
下面是并行8位數據線的驅動代碼
void LCD_WriteOneByte(unsigned char data
,unsigned char cmd
)
{RW_0
; if (cmd
) RS_1
;else RS_0
;EN_1
;PORTB
= data
;_delay_us(10);EN_0
;_delay_us(100);
}
void LCD_Init()
{LCD_WriteOneByte(0x30,0);_delay_ms(40);LCD_WriteOneByte(0x30,0);_delay_ms(40);LCD_WriteOneByte(0x0c,0);_delay_ms(40);LCD_WriteOneByte(0x02,0);_delay_ms(40);LCD_WriteOneByte(0x01,0);_delay_ms(40);
}
下面是并行4位數據線的驅動代碼
void LCD_WriteOneByte(unsigned char data
,unsigned char cmd
)
{RW_0
;if (cmd
) RS_1
;else RS_0
;EN_1
;PORTB
= data
; _delay_us(10);EN_0
;_delay_us(100);EN_1
;PORTB
= (data
<< 4);_delay_us(10);EN_0
;_delay_us(100);}
void LCD_Init()
{LCD_WriteOneByte(0x20,0);_delay_ms(40);LCD_WriteOneByte(0x20,0);_delay_ms(40);LCD_WriteOneByte(0x0c,0);_delay_ms(40);LCD_WriteOneByte(0x02,0);_delay_ms(40);LCD_WriteOneByte(0x01,0);_delay_ms(40);
}
串行時序圖
這個串行通信是一個類似3線SPI的通信方式;
他這個串行通信對應的是一個控制字節和一個用戶數據(指令)字節;
首先把控制字(第一字節)寫入到LCD(告訴LCD我接下來要干什么)
然后把用戶數據(指令)分成兩個字節寫入到LCD,時序的第二字節的高四位是用戶數據的高4位,低四為必須為零;第三個字節的高四位是用戶數據的低4位,低四位必須為零;
void SID(unsigned char x
)
{if (x
) PORTC
|= 0x02;else PORTC
&= ~0x02;
}
void LCD_writeOneByte(unsigned char data
,unsigned char cmd
)
{CLK_0
;CS_1
;for(unsigned char i
=0;i
<8;i
++){CLK_0
;SID(cmd
& (1 << (7-i
)));CLK_1
;}for(unsigned char i
=0;i
<8;i
++){CLK_0
;SID((data
& 0xf0) & (1 << (7-i
)));CLK_1
;}for(unsigned char i
=0;i
<8;i
++){CLK_0
;SID(((data
<<4) & 0xf0) & (1 << (7-i
)));CLK_1
; }CS_0
;
}
void LCD_Init()
{LCD_WriteOneByte(0x30,0xf8);_delay_ms(40);LCD_WriteOneByte(0x30,0xf8);_delay_ms(40);LCD_WriteOneByte(0x0c,0xf8);_delay_ms(40);LCD_WriteOneByte(0x02,0xf8);_delay_ms(40);LCD_WriteOneByte(0x01,0xf8);_delay_ms(40);
}
以上是三個通信方式的驅動代碼和初始化。
注意:使用8線或者4線并口通信時,12864的PSB要接到高電平;使用3線串口時PSB接低電平;
好啦,準備的差不多啦.PS(這里又有一個不怕死的12864,嘿嘿.肘子,給它上一課(2333))
void LCD_Writehanzi(unsigned char x
,unsigned char y
,unsigned char *data
)
{switch(y
){case 1 : LCD_writeOneByte(0x80+x
,0);break;case 2 : LCD_writeOneByte(0x90+x
,0);break;case 3 : LCD_writeOneByte(0x88+x
,0);break;case 4 : LCD_writeOneByte(0x98+x
,0);break;}while(*data
!='\0')LCD_writeOneByte(*data
++,1);
}
int main(void)
{DDRB
= 0XFF;PORTB
= 0X00;DDRC
= 0XFF;PORTC
= 0X00;_delay_ms(100);LCD_Init();while (1) {LCD_writehanzi(0,2,"祖國母親70");LCD_writehanzi(1,3,"周年快樂!!");}
}
然后顯示圖片。
void LCD_Drawing(unsigned char *data
)
{for(unsigned char i
=0;i
<32;i
++){LCD_writeOneByte(0x80+i
,0);LCD_writeOneByte(0x80,0);for (unsigned char q
=0;q
<16;q
++){LCD_writeOneByte(pgm_read_byte(&*data
++),1);}} for(unsigned char i
=0;i
<32;i
++){LCD_writeOneByte(0x80+i
,0);LCD_writeOneByte(0x88,0);for (unsigned char q
=0;q
<16;q
++){LCD_writeOneByte(pgm_read_byte(&*data
++),1);}}
}
PROGMEM
const unsigned char QR
[1024]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xE0,0x00,0x00,0x00,0x00,0x01,0xF7,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0xC0,0x00,0x00,0x00,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x03,0xBE,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC6,0x00,0x00,0x00,0x00,0x00,0x03,0x08,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0xE0,0x00,0x00,0x00,0x01,0x83,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x03,0x81,0xE0,0x00,0x00,0x00,0x01,0x83,0x00,0x1C,0x60,0x00,0x00,0x00,0x00,0x00,0x01,0xC3,0x80,0x00,0x1F,0xFE,0x01,0x87,0xF0,0x18,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x01,0x00,0x1F,0xFE,0x01,0x8F,0xF8,0x18,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0x80,0x0C,0x06,0x01,0xC3,0x18,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x1D,0x98,0x0C,0x06,0x07,0xE3,0x1F,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x3F,0xFC,0x0C,0x06,0x0F,0x8F,0xFF,0x09,0x3A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x0C,0x06,0x0D,0x9F,0xF8,0x03,0xBF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0F,0xF6,0x0D,0x83,0x38,0x03,0xBB,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xE1,0x80,0x0F,0xF6,0x01,0x83,0x3C,0x03,0xB9,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0xE1,0xF8,0x0C,0x06,0x01,0x87,0x1E,0x03,0x79,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0xDF,0xFC,0x0C,0x06,0x01,0x87,0x0E,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x0C,0x06,0x01,0x8E,0x06,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x0C,0x06,0x01,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x0F,0xFE,0x00,0x00,0x00,0x3B,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x0F,0xFE,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x0C,0x00,0x00,0x00,0x00,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFC,0x00,0xF9,0xE0,0x00,0x00,0x01,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x83,0xE0,0xE0,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x9F,0xE7,0x80,0x70,0x00,0x00,0x3C,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x03,0xFF,0x00,0x70,0x00,0x00,0x7F,0xBF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0xFC,0x00,0x70,0x00,0x00,0x73,0xFC,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x38,0x00,0x70,0x00,0x00,0x7C,0xF9,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xE0,0x00,0x00,0x1F,0x7D,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x01,0xE0,0x00,0x00,0x0F,0xDF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0xCF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xFB,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x07,0x80,0x00,0x00,0x01,0xFC,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x0F,0x00,0x00,0x00,0x07,0xBF,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x00,0x1E,0x00,0x00,0x00,0x0F,0xCF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x3C,0x00,0x00,0x00,0x0F,0xF7,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x38,0x00,0x00,0x00,0x1C,0xFC,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x78,0x00,0x00,0x00,0x7C,0x7E,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0xF0,0x00,0x00,0x00,0x7F,0x9E,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE1,0xE0,0x00,0x00,0x00,0x7F,0xCE,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFB,0xC0,0x00,0x00,0x00,0x3B,0xF0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x18,0xF8,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x0E,0x3C,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x03,0x9C,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00};
int main(void)
{DDRB
= 0XFF;PORTB
= 0X00;DDRC
= 0XFF;PORTC
= 0X00;LCD_Init();while (1) {LCD_Drawing(QR
);}
}
注意事項
注意!本文中的指令集有個別地方有按照我的理解稍加修改過!文末有原版資料
- LCD_writeOneByte(x,y):這個子程序在并行通信方式時y=1是代表寫入數據,y=0代表寫入指令;在串行通信時按照資料給的控制字寫入即可
- 當模塊在接受指令前,微處理器必須先確認模塊內部處于非忙碌狀態,即讀取BF 標志時BF需為0,方可接受新的指令;如果在送出一個指令前并不檢查BF 標志,那么在前一個指令和這個指令中間必須延遲一段較長的時間,即是等待前一個指令確實執行完成,指令執行的時間請參考指令表中的個別指令說明。
- “RE”為基本指令集與擴充指令集的選擇控制位元,當變更“RE”位元后,往后的指令集將維持在最后的狀態,除非再次變更“RE”位元,否則使用相同指令集時,不需每次重設“RE”位元。
- 文本顯示RAM(DDRAM)
文本顯示RAM 提供8 個×4行的漢字空間,當寫入文本顯示RAM時,可以分別顯示CGROM、HCGROM與CGRAM
的字型;KM12864可以顯示三種字型,分別是半寬的HCGROM 字型、自定義字符CGRAM字型及中文庫CGROM
字型。三種字型的選擇,由在DDRAM中寫入的編碼選擇,各種字型詳細編碼如下:
顯示半寬字型:將一位字節寫入DDRAM 中,范圍為02H-7FH 的編碼。
顯示CGRAM字型:將兩字節編碼寫入DDRAM中,總共有0000H,0002H,0004H,0006H四種編碼
顯示中文字型:將兩字節編碼寫入DDRAM ,范圍為A1A0H-F7FFH(GB碼)或A140H-D75FH(BIG5碼)的編碼。 - 繪圖RAM(GDRAM)
繪圖顯示RAM 提供128×8個字節的記憶空間,在更改繪圖RAM 時,先連續寫入水平與垂直的坐標值,再寫
入兩個字節的數據到繪圖RAM,而地址計數器(AC)會自動加一;整個寫入繪圖RAM的步驟如下:
1、開啟繪圖顯示功能。
2、先將水平坐標(X)寫入繪圖RAM地址,再將垂直坐標(Y)寫入繪圖RAM 地址;
總結
通過這次學習讓我學會了什么
- 通過這次學習我學會了怎么往Atmega16的flash里存放超過內存的常量和讀取我存放進去的數據;
- 通過這次學習,大概了解了SPI通信方式的時序;
- 通過這次學習,進一步熟悉了6800通信;
- 通過這次學習,更加深入的了解了數據類型;
在這次學習中遇到了很多問題
- 比如數據類型中Signed char和char的區別:其區別在于Signed char是一個變量類型,而char是一個字符類型,所以在編譯的時候因為這個的區別導致編譯器警告"類型不同";這個問題也多虧馬先生給我講解;非常感謝!
- 比如Switch語句中的case,在調試過程中遇到了Switch語句不起作用的情況,看了一下警告,提示case1以定義但未使用,然后發現原來case跟1之間必須要有一個空格,代表這個是分支1的意思.也是這個語句的一個標準吧.主要是還是因為C語言的各種語句不夠熟練導致的這個錯誤.
- 比如在使用4線通信時,啟用不了繪圖功能,原來是資料上的拓展指令的功能選擇缺失了一個DL,所以一直以為是0x36是開啟繪圖,導致其用不了繪圖,到后面叫馬先生幫忙查看程序何處有問題,馬先生找了一會發現4線的開啟繪圖要0x26…(寫程序也不能完全相信資料,要根據上下文勇敢的去推測寄存器設定的其他可能);感謝馬先生!
當然這一篇文章還有程序等等還有很多我未發現的問題,希望看到的網友不惜賜教.感謝!
總結一下這個工程的思路
先了解12864的引腳了解12864的通信協議根據引腳和通信協議時序圖編寫驅動代碼根據自身要求編寫需要的功能子程序
好啦,12864就講到這里
資料附上https://download.csdn.net/download/qq_35227168/11830646
明天就是新中國成立70周年的日子.祝祖國母親70周年生日快樂!
2019/09/30
總結
以上是生活随笔為你收集整理的LCD 12864B V2.0的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。