此次的SPI協議是基於mini2440開發板上的GPIO,並未使用SPI控制器,所以跟單片機一致,但是這裏有個問題就是OLED的復位腳一定要接在2440的復位腳上面,而不用定義一個復位腳給高低電平。
1. 介紹一下SPI協議的OLED。
市面上的開發板很少接有SPI設備,但是SPI協議在工作中經常用到。我們開發了SPI模塊,上面有SPI Flash和SPI OLED。OLED就是一塊顯示器。
此次使用的OLED是購買的中景園的0.96寸OLED,所用的驅動 IC 爲 SSD1306;其具有內部升壓功能;所以在設計的時候不需要再專一設計升壓電路;當然了本屏也可以選用外部升壓,具體的請詳查數據手冊。
SSD1306 的每頁包含了128 個字節,總共 8 頁,這樣剛好是 12864 的點陣大小。我們的數據是按照8位來傳輸的,8位在點陣上面顯示是1列8行,就是1列1頁的寬度。所以顯示的時候就要按照這樣的格式進行傳輸數據。(一列是1bit,一頁是8bits)
我們的字符數據是8 * 16的就是標準的8行(1頁) * 16列的寬度。所以傳輸數據的時候要先傳第一個8位前8列,再傳後8列;
漢字數據是1616的就是標準的16行(2頁)寬度。所以傳輸數據的時候要先傳第一個16位,依然是前8列,再傳後8列;
這樣數據的傳輸格式處理就完成了。
2. 實物圖
3. OLED一共是7個外接引腳,使用SPI時,7個腳的定義如下所示:
我是用mini2440的GPIO來模擬所以引腳的功能要定義一致,然後用杜邦線進行連接。
4.定義的mini2440的引腳功能
因此初始化的時候,將對應的寄存器的該位設置爲輸出模式,然後往對應的數據寄存器裏面寫入1和0,則輸出高低電平。
5.接下來就是SPI的時序問題,借用韋老師的圖
可以看見2440與OLED的連接方式,這裏補充了DC,復位,和3.3/5V電壓與地。並且DI並不需要,因爲OLED不會返回數據。
SCK:提供時鐘
DO:作爲數據輸出
DI:作爲數據輸入
CS0/CS1:作爲片選
程序框架如下所示:
首先初始化,就是初始化作爲GPIO控制SPI時序的引腳,代碼如下所示:
/*this is gpio moni SPI
*use SPI OLED
*
**/
#define GPECON (*(volatile unsigned long *)0x56000040)//GPIOE控制寄存器
#define GPEDAT (*(volatile unsigned long *)0x56000044)//GPIOE數據寄存器
#define GPGCON (*(volatile unsigned long *)0x56000060)//GPIOG控制寄存器
#define GPGDAT (*(volatile unsigned long *)0x56000064)//GPIOG控制寄存器
#define GPFCON (*(volatile unsigned long *)0x56000050)//GPIOB控制寄存器
#define GPFDAT (*(volatile unsigned long *)0x56000054)//GPIOG控制寄存器
/*用GPIO 引腳來模擬SPI*/
static void SPI_GPIO_Init(void)
{
/*將GPIO引腳設置爲輸出和輸入*/
/*由原理圖可以知道
*SPIMISO /GPE11 OLED只輸入不輸出,此腳不用
*SPIMOSI /GPE12 OLED的輸入引腳,CPU output
*SPICLK /GPE13 OLED的時鐘引腳,CPU output
*OLED_CSn /GPG1 OLED的片選信號,CPU output
*DC /GPF3 OLED的數據/命令引腳,CPU output
*對應2440引出來的GPIO的第25,26,27,17,12腳
*2440的電源和地分別是2,3腳
*復位腳是第4腳,直接連接/
/* GPG1 OLED_CSn output */
GPGCON &= ~(3<<(1*2)); //清零
GPGCON |= (1<<(1*2)); //置位OLED_CSn
/*
* GPF3 OLED_DC output
* GPE11 SPIMISO input
* GPE12 SPIMOSI output
* GPE13 SPICLK output
*/
GPFCON &= ~(3<<(3*2)); //清零
GPFCON |= (1<<(3*2)); //置位OLED_DC
GPECON &= ~((3<<(12*2)) | (3<<(13*2))); //清零
GPECON |= ((1<<(12*2)) | (1<<(13*2))); //置位
}
void SPIInit(void)
{
/*初始化2440的SPI引腳*/
SPI_GPIO_Init();
}
做完初始化之後,就開始實現SPI的時序,代碼如下所示:
#define GPECON (*(volatile unsigned long *)0x56000040)//GPIOE控制寄存器
#define GPEDAT (*(volatile unsigned long *)0x56000044)//GPIOE數據寄存器
#define GPGCON (*(volatile unsigned long *)0x56000060)//GPIOG控制寄存器
#define GPGDAT (*(volatile unsigned long *)0x56000064)//GPIOG控制寄存器
#define GPFCON (*(volatile unsigned long *)0x56000050)//GPIOB控制寄存器
#define GPFDAT (*(volatile unsigned long *)0x56000054)//GPIOG控制寄存器
/*將GPIO引腳設置爲輸出和輸入*/
/*由原理圖可以知道
*SPIMISO /GPE11 OLED只輸入不輸出,此腳不用
*SPIMOSI /GPE12 OLED的輸入引腳,CPU output
*SPICLK /GPE13 OLED的時鐘引腳,CPU output
*OLED_CSn /GPG1 OLED的片選信號,CPU output
*DC /GPF3 OLED的數據/命令引腳,CPU output
*對應2440引出來的GPIO的第25,26,27,17,12腳
*2440的電源和地分別是2,3腳*/
/**********************************************************/
/**********下面是GPIO模擬SPI需要用到的函數*****************/
/**********************************************************/
/*
*設置SPI片選信號
*1--未選中,0--選中;
*/
static void OLED_Set_CS(char val)
{
if (val)
GPGDAT |= (1<<1); /*高電平--未選中OLED*/
else
GPGDAT &= ~(1<<1); /*低電平--選中OLED*/
}
/*
*設置SPI發到OLED的數據/命令通道;
*1--數據通道;0--命令通道;
*/
static void OLED_Set_DC(char val)
{
if(val)
GPFDAT |= (1<<3); /*1--數據通道*/
else
GPFDAT &= ~(1<<3); /*0--命令通道*/
}
/*
*設置SPI時鐘電平,val;
*高電平--1,低電平--0;
*時鐘位在GPIOE的第13位;
*/
static void SPI_Set_CLK(char val)
{
if(val)
GPEDAT |= (1<<13); /*時鐘高電平*/
else
GPEDAT &= ~(1<<13); /*時鐘低電平*/
}
/******************************/
/*
*2440往SPI數據線上寫入1bit的數據(MOSI)
*val的值爲0/1
*val爲0的時候,就是寫低電平
*val爲1的時候,就是寫高電平
*/
/*設置CPU輸出高低電平-MOSI*/
static void SPI_Set_MOSI(char val)
{
if (val)
GPEDAT |= (1<<12);
else
GPEDAT &= ~(1<<12);
}
/*2440向OLED發送8bit的數據/命令*/
void SPISendByte(unsigned char dat)
{
int i;
for (i = 0; i < 8; i++)
{
/*拉低時鐘線*/
SPI_Set_CLK(0);
/*往數據線上寫入1位數據---最高位*/
SPI_Set_MOSI(dat&0x80);
/*拉高時鐘,在時鐘的上升沿,OLED讀走1bit數據*/
SPI_Set_CLK(1);
dat<<=1;
}
}
/************************************************/
/************************************************/
/************************************************/
/*
*2440通過SPI引腳將數據/命令發到OLED;
*2440向OLED寫入一個字節;
*dat:要寫入的數據/命令;
*val:數據/命令標誌 0--表示命令;1--表示數據;
*/
void OLEDWriteCmd(unsigned char dat, unsigned char val)
{
if(val)
{
OLED_Set_DC(1); /*data*/
OLED_Set_CS(0); /*選中CS,由OLED的時序可以看到,CS拉低爲選中*/
/*選中之後,進行數據的發送*/
SPISendByte(dat);
OLED_Set_CS(1); /*取消選中CS*/
OLED_Set_DC(1); /*data*/
}
else
{
OLED_Set_DC(0); /*cmd*/
OLED_Set_CS(0); /*選中CS,由OLED的時序可以看到,CS拉低爲選中*/
/*選中之後,進行命令的發送*/
SPISendByte(dat);
OLED_Set_CS(1); /*取消選中CS*/
OLED_Set_DC(1); /*data*/
}
}
SPI時序程序裏面實現了發送數據或命令到SPI設備的函數(包括了選中SPI設備,發送之前拉低時鐘線,然後往數據線寫0或者1,然後拉高時鐘線,讓SPI設備讀走數據,再取消選中SPI設備;),接下來要在SPI時序程序裏面補充OLED的顯示函數,也就是前面提到的數據格式。
#include "oledfont.h"
#include"gpio_spi.h"
#include"oledfont.h"
#include"led_on.h"
#define GPECON (*(volatile unsigned long *)0x56000040)//GPIOE控制寄存器
#define GPEDAT (*(volatile unsigned long *)0x56000044)//GPIOE數據寄存器
#define GPGCON (*(volatile unsigned long *)0x56000060)//GPIOG控制寄存器
#define GPGDAT (*(volatile unsigned long *)0x56000064)//GPIOG控制寄存器
#define GPFCON (*(volatile unsigned long *)0x56000050)//GPIOB控制寄存器
#define GPFDAT (*(volatile unsigned long *)0x56000054)//GPIOG控制寄存器
#define SIZE 16
#define XLevelL 0x02
#define XLevelH 0x10
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xFF
#define X_WIDTH 128
#define Y_WIDTH 64
/*將GPIO引腳設置爲輸出和輸入*/
/*由原理圖可以知道
*SPIMISO /GPE11 OLED只輸入不輸出,此腳不用
*SPIMOSI /GPE12 OLED的輸入引腳,CPU output
*SPICLK /GPE13 OLED的時鐘引腳,CPU output
*OLED_CSn /GPG1 OLED的片選信號,CPU output
*DC /GPF3 OLED的數據/命令引腳,CPU output
*對應2440引出來的GPIO的第25,26,27,17,12腳
*2440的電源和地分別是2,3腳*/
/**********************************************************/
/**********下面是GPIO模擬SPI需要用到的函數*****************/
/**********************************************************/
/*
*設置SPI片選信號
*1--未選中,0--選中;
*/
static void OLED_Set_CS(char val)
{
if (val)
GPGDAT |= (1<<1); /*高電平--未選中OLED*/
else
GPGDAT &= ~(1<<1); /*低電平--選中OLED*/
}
/*
*設置SPI發到OLED的數據/命令通道;
*1--數據通道;0--命令通道;
*/
static void OLED_Set_DC(char val)
{
if(val)
GPFDAT |= (1<<3); /*1--數據通道*/
else
GPFDAT &= ~(1<<3); /*0--命令通道*/
}
/*
*設置SPI時鐘電平,val;
*高電平--1,低電平--0;
*時鐘位在GPIOE的第13位;
*/
static void SPI_Set_CLK(char val)
{
if(val)
GPEDAT |= (1<<13); /*時鐘高電平*/
else
GPEDAT &= ~(1<<13); /*時鐘低電平*/
}
/******************************/
/*
*2440往SPI數據線上寫入1bit的數據(MOSI)
*val的值爲0/1
*val爲0的時候,就是寫低電平
*val爲1的時候,就是寫高電平
*/
/*設置CPU輸出高低電平-MOSI*/
static void SPI_Set_MOSI(char val)
{
if (val)
GPEDAT |= (1<<12);
else
GPEDAT &= ~(1<<12);
}
/*2440向OLED發送8bit的數據/命令*/
void SPISendByte(unsigned char dat)
{
int i;
for (i = 0; i < 8; i++)
{
/*拉低時鐘線*/
SPI_Set_CLK(0);
/*往數據線上寫入1位數據---最高位*/
SPI_Set_MOSI(dat&0x80);
/*拉高時鐘,在時鐘的上升沿,OLED讀走1bit數據*/
SPI_Set_CLK(1);
dat<<=1;
}
}
/************************************************/
/************************************************/
/************************************************/
/*
*2440通過SPI引腳將數據/命令發到OLED;
*2440向OLED寫入一個字節;
*dat:要寫入的數據/命令;
*val:數據/命令標誌 0--表示命令;1--表示數據;
*/
void OLEDWriteCmd(unsigned char dat, unsigned char val)
{
if(val)
{
OLED_Set_DC(1); /*data*/
OLED_Set_CS(0); /*選中CS,由OLED的時序可以看到,CS拉低爲選中*/
/*選中之後,進行數據的發送*/
SPISendByte(dat);
OLED_Set_CS(1); /*取消選中CS*/
OLED_Set_DC(1); /*data*/
}
else
{
OLED_Set_DC(0); /*cmd*/
OLED_Set_CS(0); /*選中CS,由OLED的時序可以看到,CS拉低爲選中*/
/*選中之後,進行命令的發送*/
SPISendByte(dat);
OLED_Set_CS(1); /*取消選中CS*/
OLED_Set_DC(1); /*data*/
}
}
/****************************************/
/****************************************/
/****************************************/
/****OLED功能函數--顯示/清除*************/
/****************************************/
/****************************************/
/****************************************/
static void OLEDSetPageAddrMode(void)
{
OLEDWriteCmd(0x20,0);
OLEDWriteCmd(0x02,0);
}
static void OLEDSetPos(int page, int col)
{
OLEDWriteCmd(0xB0 + page,0); /* page address */
OLEDWriteCmd(col & 0xf,0); /* Lower Column Start Address */
OLEDWriteCmd(0x10 + (col >> 4),0); /* Lower Higher Start Address */
}
void OLEDClear(void)
{
int page, i;
for (page = 0; page < 8; page ++)
{
OLEDSetPos(page, 0);
for (i = 0; i < 128; i++)
OLEDWriteCmd(0,1);
}
}
/* page: 0-7
* col : 0-127
* 字符: 8x16象素
* 數據是佔8列16行的,在頁地址模式下,page爲8行,因此先寫前一頁的8個col,
* 再寫下一頁的8個col的數據
*/
void OLEDPutChar(int page, int col, char c)
{
int i = 0;
/* 得到字模 */
const unsigned char *dots = F8X16[c - ' '];
/* 發給OLED */
OLEDSetPos(page, col);
/* 發出8字節數據 */
for (i = 0; i < 8; i++)
OLEDWriteCmd(dots[i],1);
OLEDSetPos(page+1, col);
/* 發出8字節數據 */
for (i = 0; i < 8; i++)
OLEDWriteCmd(dots[i+8],1);
}
/* page: 0-7
* col : 0-127
* 字符: 8x16象素
*/
void OLEDPrint(int page, int col, char *str)
{
int i = 0;
while (str[i])
{
OLEDPutChar(page, col, str[i]);
col += 8;
if (col > 127)
{
col = 0;
page += 2;
}
i++;
}
}
/* 顯示漢字的函數
* 漢字佔16列16行的,在頁地址模式下,page爲8行,因此先寫前一頁的16個col,
* 再寫下一頁的16個col的數據
*/
void OLED_ShowCHinese(int page,int col,int no)
{
int t,adder=0;
OLEDSetPos(page,col);
for(t=0;t<16;t++)
{
OLEDWriteCmd(Chinese[2*no][t],1);
adder+=1;
}
OLEDSetPos(page+1,col);
for(t=0;t<16;t++)
{
OLEDWriteCmd(Chinese[2*no+1][t],1);
adder+=1;
}
}
/**********************/
void OLEDInit(void)
{
delay(1000);
#if 1
/* 向OLED發命令以初始化 */
OLEDWriteCmd(0xAE,0); /*display off*/
OLEDWriteCmd(0x00,0); /*set lower column address*/
OLEDWriteCmd(0x10,0); /*set higher column address*/
OLEDWriteCmd(0x40,0); /*set display start line*/
OLEDWriteCmd(0xB0,0); /*set page address*/
OLEDWriteCmd(0x81,0); /*contract control*/
OLEDWriteCmd(0xcf,0); /*128*/
OLEDWriteCmd(0xA1,0); /*set segment remap*/
OLEDWriteCmd(0xA6,0); /*normal / reverse*/
OLEDWriteCmd(0xA8,0); /*multiplex ratio*/
OLEDWriteCmd(0x3F,0); /*duty = 1/64*/
OLEDWriteCmd(0xC8,0); /*Com scan direction*/
OLEDWriteCmd(0xD3,0); /*set display offset*/
OLEDWriteCmd(0x00,0);
OLEDWriteCmd(0xD5,0); /*set osc division*/
OLEDWriteCmd(0x80,0);
OLEDWriteCmd(0xD9,0); /*set pre-charge period*/
OLEDWriteCmd(0xf1,0);
OLEDWriteCmd(0xDA,0); /*set COM pins*/
OLEDWriteCmd(0x12,0);
OLEDWriteCmd(0xdb,0); /*set vcomh*/
OLEDWriteCmd(0x30,0);
OLEDWriteCmd(0x8d,0); /*set charge pump enable*/
OLEDWriteCmd(0x14,0);
OLEDSetPageAddrMode();
OLEDClear();
OLEDSetPos(0,0);
OLEDWriteCmd(0xAF,0); /*display ON*/
#endif
}
這樣基本的mini2440的GPIO初始化,SPI時序的構建,OLED初始化,以及OLED的打印函數都寫好了,這裏打印的數據,我們寫到頭文件裏,存在數組裏面,一次發送數組裏面的8位數據,數組是unsigned char類型的。頭文件代碼如下:頭文件的數組可以根據我們想要輸出的漢字來修改。
#ifndef __OLEDFONT_H
#define __OLEDFONT_H
//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:12*6
/************************************6*8的點陣************************************/
/****************************************8*16的點陣************************************/
#if 1
const unsigned char F8X16[][16]=
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},// 0
{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00},//! 1
{0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//" 2
{0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00},//# 3
{0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00},//$ 4
{0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00},//% 5
{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10},//& 6
{0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//' 7
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},//( 8
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},//) 9
{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},//* 10
{0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00},//+ 11
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00},//, 12
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},//- 13
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},//. 14
{0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00},/// 15
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0 16
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1 17
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},//2 18
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},//3 19
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//4 20
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5 21
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6 22
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7 23
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8 24
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},//9 25
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},//: 26
{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00},//; 27
{0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00},//< 28
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00},//= 29
{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00},//> 30
{0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00},//? 31
{0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00},//@ 32
{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},//A 33
{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},//B 34
{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},//C 35
{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},//D 36
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},//E 37
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},//F 38
{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00},//G 39
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20},//H 40
{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//I 41
{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00},//J 42
{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00},//K 43
{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00},//L 44
{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00},//M 45
{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00},//N 46
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00},//O 47
{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00},//P 48
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00},//Q 49
{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20},//R 50
{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00},//S 51
{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},//T 52
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},//U 53
{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00},//V 54
{0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00},//W 55
{0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20},//X 56
{0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},//Y 57
{0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00},//Z 58
{0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00},//[ 59
{0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00},//\ 60
{0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00},//] 61
{0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//^ 62
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},//_ 63
{0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//` 64
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20},//a 65
{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00},//b 66
{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00},//c 67
{0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20},//d 68
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00},//e 69
{0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//f 70
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00},//g 71
{0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},//h 72
{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//i 73
{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00},//j 74
{0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00},//k 75
{0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//l 76
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F},//m 77
{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},//n 78
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},//o 79
{0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00},//p 80
{0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80},//q 81
{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},//r 82
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},//s 83
{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00},//t 84
{0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20},//u 85
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00},//v 86
{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},//w 87
{0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00},//x 88
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00},//y 89
{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00},//z 90
{0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40},//{ 91
{0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},//| 92
{0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00},//} 93
{0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//~ 94
};
#endif
#if 1
const unsigned char Chinese[][16]=
{
{0x80,0x84,0x44,0x44,0x24,0x14,0x0C,0xFF,0x0C,0x14,0x24,0x44,0x44,0x84,0x80,0x00},
{0x08,0x08,0x08,0x08,0x09,0x49,0x89,0x79,0x0D,0x0B,0x09,0x08,0x08,0x08,0x08,0x00},
/* (16 X 16 , 宋體 )*/
{0x20,0x10,0x2C,0xE7,0x24,0x24,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},
{0x01,0x01,0x01,0x7F,0x21,0x11,0x00,0xFF,0x40,0x23,0x0C,0x14,0x22,0x41,0x40,0x00},
/* (16 X 16 , 宋體 )*/
{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},
{0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00},
/* (16 X 16 , 宋體 )*/
{0x00,0xFC,0x00,0x00,0xFF,0x00,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00},
{0x00,0x87,0x40,0x30,0x0F,0x00,0x00,0x1F,0x00,0x00,0xFF,0x08,0x10,0x0F,0x00,0x00},
/* (16 X 16 , 宋體 )*/
{0x00,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x02,0x7E,0x02,0x02,0x00,0x00},
{0x01,0x01,0x01,0x3D,0x25,0x25,0x25,0x25,0x3D,0x41,0x81,0x7F,0x01,0x01,0x01,0x00},
/* (16 X 16 , 宋體 )*/
{0x10,0x88,0xC4,0x33,0x00,0x20,0x10,0x28,0x24,0xE3,0x24,0x28,0x10,0x20,0x20,0x00},
{0x01,0x00,0xFF,0x00,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x09,0x31,0x00,0x00},
/* (16 X 16 , 宋體 )*/
{0x08,0x04,0xC3,0x12,0x26,0x8A,0xA2,0xAA,0xA4,0xA3,0x22,0x26,0xEA,0x02,0x02,0x00},
{0x00,0x00,0xFF,0x00,0x00,0x3F,0x24,0x24,0x24,0x3F,0x00,0x80,0xFF,0x00,0x00,0x00},
/* (16 X 16 , 宋體 )*/
{0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0xFE,0x12,0xD2,0x5E,0x52,0x52,0xDE,0x00,0x00},
{0x40,0x22,0x15,0x08,0x16,0xA1,0x60,0x1F,0x00,0xFF,0x4A,0x4A,0x4A,0xFF,0x00,0x00},
/* (16 X 16 , 宋體 )*/
{0x40,0x40,0xC0,0x5F,0x55,0x55,0xD5,0x55,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00},
{0x20,0x60,0x3F,0x25,0x15,0x15,0xFF,0x90,0x47,0x29,0x11,0x2D,0x43,0x80,0x80,0x00},
/* (16 X 16 , 宋體 )*/
{0x10,0x10,0x10,0x12,0xD2,0x12,0x12,0xFE,0x12,0x11,0xD1,0x11,0x10,0x90,0x10,0x00},
{0x10,0x11,0x11,0x09,0x1F,0x00,0x00,0xFF,0x00,0x00,0x0F,0x12,0x11,0x10,0x1C,0x00},
/* (16 X 16 , 宋體 )*/
};
#endif
#endif
6.整體的完成效果圖如下所示:
7.注意
這裏有一個問題就是,可能換掉顯示的數據的時候,進行編譯會出現亂碼的情況,這是因爲輸出的混疊,我們需要先make clean,再make重新編譯,就可以了。
參考文檔:https://blog.csdn.net/thisway_diy/article/details/79398789
中景園電子。