十:mini2440使用GPIO模擬SPI總線協議實現OLED的顯示

此次的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列;
漢字數據是16
16的就是標準的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
中景園電子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章