【51单片机快速入门指南】6.2:SPI 、八线、四线控制 LCD12864 屏幕及Proteus的仿真(支持中文汉字)
目錄
- 硬知識
- LCD12864簡介
- 主控芯片ST7920的功能是:
- 驅動芯片ST7921的功能是:
- 引腳功能
- 時序
- 并行通信
- 串行通信
- 指令
- 存儲結構
- 操作
- 取模軟件的配置
- 示例程序
- st7920.c
- st7920.h
- 測試程序
- 顯示圖片
- 圖片1
- 實驗現象
- 圖片2
- 實驗現象
- 顯示字符
- 英文
- 實驗現象
- 中文
- 實驗現象
- Proteus的仿真
普中51-單核-A2
STC89C52
Windows 10 20H2
Proteus 8 Frofessional v8.9 SP2
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
???????移植自發布一個ST7920的LCD12864 Proteus仿真模型,支持串口和4bit模式通訊 —— cdhigh
???????參考資料:《LCD12864液晶顯示模塊數據手冊(帶字庫)》
硬知識
LCD12864簡介
???????LCD12864液晶屏,背面3個COB牛屎堆,一個主控芯片ST7920,另外兩個是移位芯片ST7921.
主控芯片ST7920的功能是:
驅動芯片ST7921的功能是:
???????LCD12864它本質上是256x32點的矩陣屏,32行掃描是COM0-COM31,列字節是SEG0-SEG255總共32字節,每個字節8bit,總共256位。.
???????原本左右拼接的256x32點,變成了上下拼接的128x64點。如下圖所示:
引腳功能
時序
并行通信
串行通信
如圖,所用SPI應為模式0,其中RW口為MOSI,E口為SCLK,RS口為CS,PSB應接地。
指令
存儲結構
操作
uint8_t code LCD12864_Write_CGRAM[]= { 0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04, 0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00, 0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00, 0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00 };//溫度符號的 32 個字節字模取模軟件的配置
示例程序
VSS —— GND VDD —— VCC(5V or 3.3V) V0 亮度調節 CS(RS) —— 接VCC,持續高電平,一直選通。 MOSI(R/W)—— 接MOSI SCLK(E) —— 接SCLK PSB —— 接GND 串行模式 BLA —— VCC(5V or 3.3V) BLK —— 接GND 剩余引腳不接,留空???????stdint.h見【51單片機快速入門指南】1:基礎知識和工程創建
???????軟件SPI程序見【51單片機快速入門指南】5:軟件SPI
???????SPI選擇模式0。
根據電路修改Soft_SPI.h
模式選擇在st7920.h內
st7920.c
//ST7920 LCD 驅動 #include "st7920.h" #include "./Soft_SPI/Soft_SPI.h"void delay_ms(int i);void st7920_delay() {}void LCD12864_CS_H() //若SPI總線上只有屏幕,則可接VCC {LCD12864_CS = 1; }void LCD12864_CS_L() {LCD12864_CS = 0; }void LCD12864_PSB_L() //接GND或給低電平以實現SPI通訊 {LCD12864_PSB = 0; }void LCD12864_RS_H() {RS_Pin = 1; }void LCD12864_RS_L() {RS_Pin = 0; }void LCD12864_WR_H() {WR_Pin = 1; }void LCD12864_WR_L() {WR_Pin = 0; }void LCD12864_EN_H() {EN_Pin = 1; }void LCD12864_EN_L() {EN_Pin = 0; }uint8_t LCD12864_Port_Read() {return LCD12864_Port; }//并口模式下寫八位 void LCD12864_Port_Write_8B(uint8_t Data) {LCD12864_Port = Data; }//4位模式下寫半個字節(高4位) void LCD12864_Port_Write_4B(uint8_t Data) {LCD12864_Port &= 0x0F;LCD12864_Port |= Data; }//初始化 void LCD_init(void) { #if LCD_INTERFACE == MODE_SPILCD12864_PSB_L(); #endifdelay_ms(50);LCD_write_command(0x33);delay_ms(1);LCD_write_command(0x32);delay_ms(1); #if LCD_INTERFACE == MODE_4BITLCD_write_command(0x28);delay_ms(1);LCD_write_command(0x28);delay_ms(1); #endifLCD_write_command(0x08); //顯示關delay_ms(1); //大于100uS的延時程序LCD_write_command(0x10); //光標設置delay_ms(1); //大于100uS的延時程序LCD_write_command(0x0C); //顯示開delay_ms(1); //大于100uS的延時程序LCD_write_command(0x01); //Display Cleardelay_ms(10); //大于10mS的延時程序LCD_write_command(0x06); //光標從右向左加1位移動delay_ms(10); //大于10mS的延時程序 }//寫命令 void LCD_write_command(unsigned char command) { #if LCD_INTERFACE == MODE_SPILCD2_spi_write_byte(0xf8);st7920_delay();LCD2_spi_write_byte_standard(command); #elseLCD12864_RS_L(); //RS=0LCD_write_byte(command);delay_ms(1); #endif }//寫數據 void LCD_write_data(unsigned char Data) { #if LCD_INTERFACE == MODE_SPILCD2_spi_write_byte(0xfa);st7920_delay();LCD2_spi_write_byte_standard(Data); #elseLCD12864_RS_H(); //RS=1LCD_write_byte(Data); #endif }//并口模式寫一個字節到控制器 void LCD_write_byte(unsigned char Data) { #if LCD_INTERFACE == MODE_4BITLCD_write_half_byte(Data);Data <<= 4;LCD_write_half_byte(Data); #elseLCD12864_Port_Write_8B(Data);LCD12864_WR_L();LCD12864_EN_H(); //EN端產生一個由低電平變高電平,寫LCDst7920_delay();LCD12864_EN_L(); //EN端產生一個由高電平變低電平,寫LCDst7920_delay();LCD12864_WR_H(); #endif }//4位模式下寫半個字節(高4位) void LCD_write_half_byte(unsigned char half_byte) {LCD12864_Port_Write_4B(half_byte);LCD12864_WR_L();LCD12864_EN_H(); //EN端產生一個由低電平變高電平,寫LCDst7920_delay();LCD12864_EN_L(); //EN端產生一個由高電平變低電平,寫LCDst7920_delay(); LCD12864_WR_H(); }//串行模式下寫一個字節 void LCD2_spi_write_byte(unsigned char Data) {LCD12864_CS_H();SOFT_SPI_RW_MODE0(Data);LCD12864_CS_L(); }//標準處理,一個字節要拆成兩個字節發送 void LCD2_spi_write_byte_standard(unsigned char Data) {LCD2_spi_write_byte(Data & 0xf0);LCD2_spi_write_byte((Data << 4) & 0xf0); }//并口模式下讀數據 unsigned char LCD_read_data(void) {unsigned char Data;LCD12864_RS_H();Data = LCD_read_byte();#if LCD_INTERFACE == MODE_4BITData = (Data & 0xf0) | ((LCD_read_byte() >> 4) & 0x0f); #endifreturn Data; }//并口模式下讀狀態 unsigned char LCD_read_status(void) {unsigned char Data;LCD12864_RS_L();Data = LCD_read_byte(); #if LCD_INTERFACE == MODE_4BITData = (Data & 0xf0) | ((LCD_read_byte() >> 4) & 0x0f); #endifreturn Data; }//并口模式下讀一個字節,如果是4bit模式,則只有高4位是有效的 unsigned char LCD_read_byte(void) {unsigned char Data;LCD12864_WR_H();LCD12864_EN_L(); //EN端產生上升沿,ST7920開始輸出數據st7920_delay();LCD12864_EN_H();st7920_delay();Data = LCD12864_Port_Read();LCD12864_EN_L();return Data; }//設置字符模式的地址 //第一行首地址:0x80 //第二行首地址:0x80+0x10 (0x90) //第三行首地址:0x80+0x08 (0x88) //第四行首地址:0x80+0x10+0x08 (0x98) void LCD_set_text_address(unsigned int rowCol) {unsigned char start = 0x80;unsigned char row = (rowCol >> 8) & 0xff;unsigned char col = rowCol & 0xff;if (row == 1) {start = 0x90;}if (row == 2) {start = 0x88;}if (row == 3) {start = 0x98;}LCD_write_command(start + col); }//將字符模式的行列號轉換為內部的XY坐標,返回的高字節為X,低字節為Y //row (HIGH_BYTE(rowCol)): 行號,0-3 //col (LOW_BYTE(rowCol)): 列號,0-7 unsigned int LCD_rowCol_to_inter_Xy(unsigned int rowCol) {unsigned char row = (rowCol >> 8) & 0x03;unsigned char col = rowCol & 0x07;unsigned char x = col + 8 * (unsigned char)(row / 2);unsigned char y = (row * 16) & 0x1f;return (x << 8) | y; }//設置繪圖模式的地址 //x: 0-127 (注意x必須為16的整數倍) //y:0-63 void LCD_set_graphic_address(unsigned char x, unsigned char y) {unsigned char xWord, downPage, yInter;x &= 0x7f;y &= 0x3f;xWord = x / 16; //內部X地址,一個地址管16位downPage = y / 32; //0:上半屏 1:下半屏yInter = y & 0x1f; //內部Y坐標LCD_write_command(0x80 + yInter); //先設置Y地址LCD_write_command(0x80 + xWord + 8 * downPage); }//顯示清屏函數 void LCD_clear(void) {unsigned char x, y;LCD_write_command(0x08); //避免清屏過程中閃爍,先關顯示st7920_delay();LCD_write_command(0x01); //清DDRAM//清GDRAM,12864僅用了一半的GDRAM,清一半即可//如果沒有使用到繪圖GDRAM,也可以不清GDRAM,省點時間和代碼空間LCD_startGraphic();for (y = 0; y < 32; y++){LCD_write_command(0x80 + y); //yLCD_write_command(0x80 + 0); //xfor (x = 0; x < 16; x++){LCD_write_data(0x00);LCD_write_data(0x00);}}LCD_endGraphic();LCD_write_command(0x0C); //顯示開delay_ms(10); }//開啟擴展命令的繪圖指令 void LCD_startGraphic(void) { #if LCD_INTERFACE == MODE_4BITLCD_write_command(0x24); //擴展指令集LCD_write_command(0x26); //繪圖命令開啟 #elseLCD_write_command(0x34); //擴展指令集LCD_write_command(0x36); //繪圖命令開啟 #endif }//結束擴展命令的繪圖指令(可選) void LCD_endGraphic(void) { #if LCD_INTERFACE == MODE_4BITLCD_write_command(0x26); //繪圖命令關閉LCD_write_command(0x20); //回到基本指令 #elseLCD_write_command(0x36); //繪圖命令關閉LCD_write_command(0x30); //回到基本指令 #endif }//反白或取消反白對應16X16區域,一般用于菜單選擇 //row (HIGH_BYTE(rowCol)): 行號,0-3 //col (LOW_BYTE(rowCol)): 列號,0-7 //charNum: 要反白的字符數量,注意不要超過行末 //ST7920內置的反白作用不大,它只能整行反白,而且反白第一行,第三行也會一起反白 //所以此函數使用另外的方法實現:繪圖區對應的位全部寫0xff,異或后即可反白 void LCD_Inverse_16X16(unsigned int rowCol, unsigned char charNum, unsigned char reverse) {unsigned char i, ch;unsigned int xy = LCD_rowCol_to_inter_Xy(rowCol);unsigned char x = (xy >> 8) & 0xff;unsigned char y = xy & 0x3f;LCD_startGraphic();for (i = 0; i < 16; i++) //把對應字符的GDRAM全部寫成0xff,異或后就是反白{LCD_write_command(0x80 + y + i); //先寫垂直地址yLCD_write_command(0x80 + x); //xfor (ch = 0; ch < charNum; ch++){LCD_write_data(reverse ? 0xff : 0x00);LCD_write_data(reverse ? 0xff : 0x00);}}LCD_endGraphic(); }//顯示一個字符,12864可以顯示4行,每行8個漢字或每行16個字母 //col: 列號,0-15 //row: 行號,0-3 //字符編碼:小于0x80的為ASCII,否則為漢字,漢字編碼高字節在左邊 void LCD_write_char(unsigned int rowCol, unsigned int Code) {unsigned char high = (Code >> 8) & 0xff;unsigned char low = Code & 0xff;LCD_set_text_address(rowCol);if (Code > 0x80){LCD_write_data(high);}LCD_write_data(low); }//顯示一個字符串,注意不要超過一行的長度(8個漢字或16個字母) //rowCol: 左8位為行(0-3),右8位為列(0-15) void LCD_write_string(unsigned int rowCol, const char * p) {LCD_set_text_address(rowCol);while (*p != 0){LCD_write_data(*p);p++;} }void LCD_Draw_Bmp(unsigned char *pImage, unsigned char col, unsigned char row, unsigned char x0, unsigned char y0) {unsigned char i, y;LCD_startGraphic();for (y = y0; y < row + y0; y++){LCD_set_graphic_address(x0, y);for (i = 0; i < col/8; i++){LCD_write_data(*pImage);pImage++;}}LCD_endGraphic(); }//只有并行接口能讀ST7920,如果串行接口需要打點,則需要開辟RAM緩沖區 #if LCD_INTERFACE != MODE_SPI //在對應X/Y位置顯示一個點 void LCD_write_dot(unsigned char x, unsigned char y) {unsigned char xBit, high, low;xBit = x & 0x0f;LCD_startGraphic();LCD_set_graphic_address(x, y);LCD_read_data(); //根據手冊,設置完地址后的第一次讀操作返回的數據無效high = LCD_read_data();low = LCD_read_data();//回寫LCD_set_graphic_address(x, y);if (xBit < 8) //低8位{LCD_write_data(high | (0x01 << (7 - xBit)));LCD_write_data(low);}else{LCD_write_data(high);LCD_write_data(low | (0x01 << (15 - xBit)));}LCD_endGraphic(); } #endifst7920.h
//ST7920 LCD 驅動 //Author: cdhigh <2021-09-22> //ST7920的繪圖結構:左上角為坐標原點,寫入的字節表示從某個坐標開始的8個橫向像素, //每行 128/8=16 個字節,每個字節左邊為最低位,右邊為最高位,縱向64行。 //DDRAM地址 //0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 //第一行漢字位置 //0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97 //第二行漢字位置 //0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f //第三行漢字位置 //0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e 0x9f //第四行漢字位置 #ifndef __ST7290_H_ #define __ST7290_H_#include <STC89C5xRC.H>#define LCD12864_Port P0sbit LCD12864_CS = P2^6; sbit LCD12864_PSB = P3^2; sbit RS_Pin = P2 ^ 6; //寄存器選擇位,RS位 sbit WR_Pin = P2 ^ 5; //讀寫選擇位,RW sbit EN_Pin = P2 ^ 7; //使能信號位,E位#define MODE_8BIT 8 //8bit并行模式 #define MODE_4BIT 4 //4bit并行模式 #define MODE_SPI 1 //串行-PSB接地//定義使用的接口模式,MODE_8BIT, MODE_4BIT, MODE_SPI #define LCD_INTERFACE MODE_SPIvoid LCD_clear(void); void LCD_init(void); void LCD_write_command(unsigned char command); void LCD_write_data(unsigned char Data); void LCD_write_byte(unsigned char byte); void LCD_write_half_byte(unsigned char half_byte); void LCD2_spi_write_byte(unsigned char Data); void LCD2_spi_write_byte_standard(unsigned char Data); unsigned char LCD_read_data(void); unsigned char LCD_read_status(void); unsigned char LCD_read_byte(void); void LCD_startGraphic(void); void LCD_endGraphic(void); void LCD_Inverse_16X16(unsigned int rowCol, unsigned char charNum, unsigned char reverse); unsigned int LCD_rowCol_to_inter_Xy(unsigned int rowCol); void LCD_set_text_address(unsigned int rowCol); void LCD_set_graphic_address(unsigned char x, unsigned char y); void LCD_write_char(unsigned int rowCol, unsigned int Code); void LCD_write_string(unsigned int rowCol, const char * p); void LCD_Draw_Bmp(unsigned char *pImage, unsigned char col, unsigned char row, unsigned char x0, unsigned char y0);#if LCD_INTERFACE != MODE_SPI void LCD_write_dot(unsigned char x, unsigned char y); #endif#define BYTE_BIT(bitno) (1 << (bitno)) #define TEST_BIT(value, bitno) ((1 << (bitno)) & (value)) #define SET_BIT(value, bitno) ((value) |= (1 << (bitno))) #define CLR_BIT(value, bitno) ((value) &= ~(1 << (bitno)))//兩個字節湊成行列整型 //為了更好的區分使用X/Y和ROW/COL,使用ROW/COL的都是一個整型參數,X/Y為兩個字節參數 #define ROW_COL(r, c) (((r) << 8) | (c & 0xff))#endif測試程序
顯示圖片
圖片1
#include <STC89C5xRC.H> #include "intrins.h" #include "stdint.h" #include "st7920.h"void Delay1ms() //@11.0592MHz {unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i); }void delay_ms(int i) {while(i--)Delay1ms(); }code uint8_t LCD12864_Pic[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x0D,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x04,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xB0,0x00,0x02,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x60,0x00,0x02,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x40,0x00,0x01,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x00,0x01,0x05,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x80,0x00,0x00,0x82,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x80,0x00,0x00,0x82,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x00,0x00,0x02,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x81,0x80,0x00,0x41,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x03,0xE0,0x00,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x07,0xF0,0x00,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x0C,0x3C,0x00,0x20,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x11,0xDE,0x00,0x10,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x12,0x1F,0x00,0x10,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x24,0xC3,0x80,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x29,0x01,0xC0,0x08,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x28,0x00,0xE0,0x04,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x3F,0xFF,0xF0,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xF8,0x00,0x3C,0x02,0x2C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x1C,0x02,0x2C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x0E,0x01,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x07,0x01,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x03,0x80,0x8B,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x01,0xC0,0x41,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xC0,0x32,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x1D,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x30,0x07,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x00,0x00,0x0C,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x00,0x00,0x06,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7C,0x00,0x00,0x7F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0xE4,0x00,0x00,0xC8,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xEC,0x00,0x00,0xCE,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFC,0x00,0x00,0xFE,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x7C,0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x60,0x38,0x00,0x00,0x78,0x1B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x60,0x58,0x00,0x00,0x48,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x60,0x00,0x00,0x00,0x00,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x60,0x00,0x00,0x00,0x00,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x20,0x1F,0xFF,0xFF,0xE0,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x20,0x10,0x41,0x04,0x20,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x30,0x1C,0x41,0x04,0x60,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x0C,0x41,0x02,0x40,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x0C,0x01,0x02,0xC0,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x81,0x03,0x80,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0x81,0x03,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x01,0xE1,0x0E,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x7F,0xF8,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };void main(void) {LCD_init();LCD_clear();LCD_Draw_Bmp(LCD12864_Pic, 128, 64, 0, 0);while(1){ } }實驗現象
???????圖片打印較慢,請耐心等待。
圖片2
//liberty.bmp //48x64 code unsigned char bmpData[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x01,0xE1,0x80,0x00,0x00,0x00,0x01,0xF1,0x84,0x00,0x00,0x00,0x01,0xF9,0x9C,0x00,0x00,0x00,0x00,0xFF,0xB8,0x00,0x00,0x00,0x00,0xBF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xDF,0xFC,0x00,0x00,0x00,0x00,0xDF,0xFF,0x80,0x00,0x00,0x00,0xDC,0x7F,0x00,0x00,0x00,0x00,0xDE,0xFC,0x00,0x00,0x00,0x00,0xDC,0xF0,0x00,0x00,0x00,0x01,0xFF,0x70,0x00,0x00,0x00,0x01,0xE7,0xD8,0x00,0x00,0x00,0x01,0xB3,0xD8,0x00,0x00,0x00,0x00,0xE1,0xF0,0x00,0x00,0x00,0x00,0xC1,0xF8,0x00,0x00,0x00,0x00,0x47,0xB8,0x00,0x00,0x00,0x00,0x4F,0xBC,0x00,0x00,0x00,0x00,0x4B,0x1D,0xC0,0x00,0x00,0x00,0x7A,0x7F,0xE0,0x00,0x00,0x00,0x36,0x6E,0x70,0x00,0x00,0x00,0x6C,0x6C,0xE0,0x00,0x00,0x00,0x6C,0x4C,0xE0,0x00,0x00,0x00,0xD8,0xCC,0xC0,0x00,0x00,0x00,0xD8,0xC5,0xC0,0x00,0x00,0x00,0x70,0xC7,0xC0,0x00,0x00,0x00,0x3C,0xC7,0x80,0x00,0x00,0x00,0x38,0xC7,0x80,0x00,0x00,0x00,0x78,0xC7,0x00,0x00,0x00,0x00,0x70,0xC6,0x00,0x00,0x00,0x00,0x70,0xC6,0x00,0x00,0x00,0x00,0x70,0xC6,0x00,0x00,0x00,0x00,0x30,0xC2,0x00,0x00,0x00,0x00,0x20,0xC2,0x00,0x00,0x00,0x00,0x60,0xC2,0x00,0x00,0x00,0x00,0x60,0xC6,0x00,0x00,0x00,0x00,0x60,0xFE,0x00,0x00,0x00,0x00,0x60,0xFE,0x00,0x00,0x00,0x00,0x60,0x7E,0x00,0x00,0x00,0x00,0x60,0x7E,0x00,0x00,0x00,0x00,0x60,0xFE,0x00,0x00,0x00,0x00,0x63,0xFE,0x00,0x00,0x00,0x00,0x67,0x7E,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x7F,0xDF,0x00,0x00,0x00,0x00,0x5F,0xDF,0x00,0x00,0x00,0x01,0xFF,0xFF,0x00,0x00,0x00,0x01,0x80,0x01,0x00,0x00,0x00,0x07,0xFF,0xFF,0xC0,0x00,0x00,0x06,0xFF,0xFE,0xE0,0x00,0x00,0x04,0x00,0x00,0x60,0x00,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x07,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };void main(void) {LCD_init();LCD_clear();LCD_Draw_Bmp(bmpData, 48, 64, 32, 0);while(1){ } }實驗現象
顯示字符
英文
void main(void) {LCD_init();LCD_clear();LCD_write_string(0x0000, "0123456789abcdef");LCD_write_string(0x0100, "~`!@#$%^&*()_-+=");LCD_write_string(0x0200, "ABCDEFGHIJKLMNOP");LCD_write_string(0x0300, "QRSTUVWXYZ");while(1){ } }實驗現象
中文
void main(void) {LCD_init();LCD_clear();LCD_write_string(0x0000, "祥瑞不在鳳凰麒麟");LCD_write_string(0x0100, "太平須得邊將忠臣");LCD_write_string(0x0200, "仁得百僚師長肝膽");LCD_write_string(0x0300, "不用三\xfd軍羅綺金銀");while(1){ } }實驗現象
Proteus的仿真
???????需添加LCD12864的模型:發布一個ST7920的LCD12864 Proteus仿真模型,支持串口和4bit模式通訊 —— cdhigh
???????下載后將LIBRARY、MODELS文件夾與Proteus安裝目錄下DATA文件夾內的同名文件夾合并
總結
以上是生活随笔為你收集整理的【51单片机快速入门指南】6.2:SPI 、八线、四线控制 LCD12864 屏幕及Proteus的仿真(支持中文汉字)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: A69G-HDMI问题解决集锦
- 下一篇: Android Storage Mana