“高通”字库芯片的使用方法
STM32+字庫
“高通”字庫芯片的使用方法“高通”字庫芯片的使用方法
- STM32+字庫
- 前言
- 一、電路設(shè)計(jì)
- 二、程序設(shè)計(jì)
- 代碼如下:
- 整體代碼部分
- 1.字庫初始化
- 2.字庫頭文件
- 3.主函數(shù)
前言
本文應(yīng)用了這位大神的指導(dǎo)鏈接:https://blog.csdn.net/qq_40102829/article/details/105622434 再通過自己實(shí)踐來的結(jié)果
測試平臺:STM32F103C8T6
字庫芯片型號:GT21L16S2W SPI協(xié)議
顯示方式:0.96寸的OLED SPI協(xié)議
通常在小顯示屏上顯示中文字體需要一個專用的軟件對其漢字進(jìn)行取模,而且需要大量的工作一個一個取出對應(yīng)漢字的數(shù)據(jù),如果是大量的漢字要顯示實(shí)在不方便,不如直接買一個別人已經(jīng)將字庫弄好的直接調(diào)用爽快多了。本次第一次購買掉進(jìn)了一個坑,在此提醒下,注意購買的時候你要根據(jù)你的顯示屏掃描的方式 如0.96寸的OLED掃描方式是從先從 下到上 后 左到右 的順序規(guī)律掃描出來的,那些漢字取模軟件也有類似的選項(xiàng)給你選擇,所以購買時選擇好點(diǎn)陣排列方式是豎置橫排的還是橫
在高通官網(wǎng)站查找不到芯片手冊,只能通過百度文庫中查找或在立創(chuàng)商城中找到。手冊中也坑,在最新版本中要么不給出字體的地址或者是指定的漢字詳細(xì)計(jì)算方法。所以只能在百度文庫中找最早出現(xiàn)的A版本查詢信息
說實(shí)話,我最終還是跟現(xiàn)實(shí)低下頭,直接買別人現(xiàn)成的,真香。程序部分別人已經(jīng)寫好了有SPI和IIC注釋也好看,而我合并了SPI和IIC的功能下次調(diào)用直接使能哪一個通訊方式就行。
改為:
測試平臺:STM32F407系列
字庫芯片型號:GT30L32S4W SPI協(xié)議
顯示方式:2.08寸的OLED SPI協(xié)議
鏈接: “高通”字庫芯片的使用方法
一、電路設(shè)計(jì)
電路設(shè)計(jì):字庫芯片跟SPI FLASH 存儲器連接方式一樣,注意MOSI和MISO與單片機(jī)連接對調(diào)就行了,沒啥好說的
二、程序設(shè)計(jì)
先看看手冊中的指令有哪些
這款芯片比較簡單只有兩個指令 Read Data Bytes(一般讀取)和 Read Data Bytes at Higher Speed(快速讀取點(diǎn)陣數(shù)據(jù))
以最簡單的方式 Read Data Bytes(一般讀取) 來講解
1個字節(jié)的命令字(03H)和 3個字節(jié)的地址(通過給出的公式計(jì)算出來傳遞給其)
1個字節(jié) = 8位 —> 0000 0000 一共要發(fā)送24位數(shù)據(jù)給到字庫芯片中去
從圖象中可以看出高位先進(jìn)去(MSB),發(fā)送完24位數(shù)據(jù)后 字庫芯片會發(fā)送數(shù)據(jù)出來 (Data Out1)
代碼如下:
//****************************************************************************** // 函數(shù)說明:向字庫芯片發(fā)送指令 // 入口數(shù)據(jù):AddrHigh 寫地址高字節(jié) // AddrMid 寫地址中字節(jié) // AddrLow 寫地址低字節(jié) // *pBuff 讀到的數(shù)據(jù) // DataLen 讀取的長度 // 返回值: 無 //****************************************************************************** void get_n_bytes_data_from_ROM(u8 AddrHigh,u8 AddrMid,u8 AddrLow,u8 *pBuff,u8 DataLen ) {u8 i;ZK_CS_Clr(); //字庫片選ZK_command(0x03);//寫指令ZK_command(AddrHigh);//寫地址高字節(jié)ZK_command(AddrMid);//寫地址中字節(jié)ZK_command(AddrLow);//寫地址低字節(jié)for(i = 0; i < DataLen; i++ ){*(pBuff+i) =get_data_from_ROM();//讀一個字節(jié)數(shù)據(jù)}ZK_CS_Set();//取消字庫片選 }整體代碼部分
1.字庫初始化
OLED_IIC_MODE 和 LED_SPI_MODE 該定義即可更改為SPI模式或IIC模式通訊
代碼如下(示例):
以上SPI用到的是STM32的SPI2當(dāng)中,時鐘掛接在36M的PCLK1分頻得到,預(yù)分頻設(shè)置為最大值256(36M/256 = 0.14M)
SCLK的頻率為140KHz,Tsclk:14.0us
2.字庫頭文件
代碼如下(示例):
#ifndef __OLED_H #define __OLED_H #include "sys.h"#define USE_HORIZONTAL 0 //設(shè)置顯示方向 0:正向顯示;1:旋轉(zhuǎn)180度顯示#define OLED_SPI_MODE 0 //設(shè)置硬件SPI或軟件IIC 0:硬件SPI; 1:軟件IIC #define OLED_IIC_MODE 1 //設(shè)置硬件SPI或軟件IIC 0:硬件SPI; 1:軟件IIC//SCL=SCLK //SDA=MOSI //RES=RES //DC=DC //CS=CS1 //FS0=MOSI //CS2=CS2 //-----------------OLED端口定義---------------- #define OLED_GPIO_ClockCmd RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB #define OLED_GPIO_SCL_PORT GPIOA #define OLED_GPIO_SCL_PIN GPIO_Pin_8 #define OLED_GPIO_SCL_CLK RCC_AHB1Periph_GPIOA #define OLED_GPIO_SDA_PORT GPIOA #define OLED_GPIO_SDA_PIN GPIO_Pin_5 #define OLED_GPIO_SDA_CLK RCC_AHB1Periph_GPIOA #define OLED_GPIO_RES_PORT GPIOA #define OLED_GPIO_RES_PIN GPIO_Pin_15 #define OLED_GPIO_RES_CLK RCC_APB1Periph_GPIOA #define OLED_GPIO_DC_PORT GPIOB #define OLED_GPIO_DC_PIN GPIO_Pin_6 #define OLED_GPIO_DC_CLK RCC_APB1Periph_GPIOB #define OLED_GPIO_CS_PORT GPIOB #define OLED_GPIO_CS_PIN GPIO_Pin_7 #define OLED_GPIO_CS_CLK RCC_APB1Periph_GPIOB #define ZK_GPIO_CS_PORT GPIOA #define ZK_GPIO_CS_PIN GPIO_Pin_0 #define ZK_GPIO_CS_CLK RCC_APB1Periph_GPIOA#define ZK_GPIO_FS0_PORT GPIOA #define ZK_GPIO_FS0_PIN GPIO_Pin_4 #define ZK_GPIO_FS0_CLK RCC_APB1Periph_GPIOA#define ZK_SPIx SPI1 #define ZK_SPI_APBxClock_FUN RCC_APB2PeriphClockCmd #define ZK_SPI_CLK RCC_APB2Periph_SPI1 #define ZK_SPI_GPIO_AF GPIO_AF_SPI1 #define ZK_GPIO_PinSource_SCL GPIO_PinSource3 #define ZK_GPIO_PinSource_SDA GPIO_PinSource5 #define ZK_GPIO_PinSource_FS0 GPIO_PinSource4#define OLED_SCL_Clr() GPIO_ResetBits(OLED_GPIO_SCL_PORT,OLED_GPIO_SCL_PIN)//SCL #define OLED_SCL_Set() GPIO_SetBits(OLED_GPIO_SCL_PORT,OLED_GPIO_SCL_PIN)#define OLED_SDA_Clr() GPIO_ResetBits(OLED_GPIO_SDA_PORT,OLED_GPIO_SDA_PIN)//SDA #define OLED_SDA_Set() GPIO_SetBits(OLED_GPIO_SDA_PORT,OLED_GPIO_SDA_PIN)#define OLED_RES_Clr() GPIO_ResetBits(OLED_GPIO_RES_PORT,OLED_GPIO_RES_PIN)//RES #define OLED_RES_Set() GPIO_SetBits(OLED_GPIO_RES_PORT,OLED_GPIO_RES_PIN)#define OLED_DC_Clr() GPIO_ResetBits(OLED_GPIO_DC_PORT,OLED_GPIO_DC_PIN)//DC #define OLED_DC_Set() GPIO_SetBits(OLED_GPIO_DC_PORT,OLED_GPIO_DC_PIN)#define OLED_CS_Clr() GPIO_ResetBits(OLED_GPIO_CS_PORT,OLED_GPIO_CS_PIN)//CS1 #define OLED_CS_Set() GPIO_SetBits(OLED_GPIO_CS_PORT,OLED_GPIO_CS_PIN)#define ZK_CS_Clr() GPIO_ResetBits(ZK_GPIO_CS_PORT,ZK_GPIO_CS_PIN)//CS2 #define ZK_CS_Set() GPIO_SetBits(ZK_GPIO_CS_PORT,ZK_GPIO_CS_PIN)#define ZK_READ_FS0() GPIO_ReadInputDataBit(ZK_GPIO_FS0_PORT,ZK_GPIO_FS0_PIN)//FS0u8 SPI1_ReadWriteByte(u8 TxData);//顯示屏功能函數(shù) void OLED_WR_REG(u8 reg); //寫入一個指令 void OLED_WR_Byte(u8 dat); //寫入一個數(shù)據(jù) void OLED_AddressSet(u8 x,u8 y); //設(shè)置起始坐標(biāo)函數(shù) void OLED_Clear(void); //清平函數(shù) void OLED_Fill(u16 x1,u8 y1,u16 x2,u8 y2,u8 color); //填充函數(shù) void OLED_ShowChinese(u8 x,u8 y,u8 *s,u8 sizey,u8 mode); //顯示漢字串 void OLED_ShowChinese16x16(u8 x,u8 y,u8 *s,u8 sizey,u8 mode);//顯示16x16漢字 void OLED_ShowChinese24x24(u8 x,u8 y,u8 *s,u8 sizey,u8 mode);//顯示24x24漢字 void OLED_ShowChinese32x32(u8 x,u8 y,u8 *s,u8 sizey,u8 mode);//顯示32x32漢字 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 sizey,u8 mode); //顯示單個字符 void OLED_ShowString(u8 x,u8 y,u8 *dp,u8 sizey,u8 mode); //顯示字符串 void OLED_ShowNum(u8 x,u8 y,u32 num,u16 len,u8 sizey,u8 mode);//顯示整數(shù)變量 void OLED_DrawBMP(u8 x,u8 y,u16 length,u8 width,const u8 BMP[],u8 mode); //顯示灰度圖片 void OLED_DrawSingleBMP(u8 x,u8 y,u16 length,u8 width,const u8 BMP[],u8 mode);//顯示單色圖片 void OLED_Init(void);//字庫函數(shù) void ZK_command(u8 dat); //向字庫發(fā)送命令 u8 get_data_from_ROM(void); //從字庫度一個數(shù)據(jù) void get_n_bytes_data_from_ROM(u8 AddrHigh,u8 AddrMid,u8 AddrLow,u8 *pBuff,u8 DataLen );//從字庫讀DataLen個數(shù)據(jù) void Display_GB2312_String(u16 x,u8 y,u8 text[],u8 zk_num,u8 mode); //顯示漢字字符串 void Display_GB2312(u16 x,u8 y,u8 zk_num,u8 mode); //顯示漢字 void Display_Asc_String(u16 x,u8 y,u8 text[],u8 zk_num,u8 mode); //顯示ASCII 字符串 void Display_Asc(u16 x,u8 y,u8 zk_num,u8 mode); //顯示ASCII void Display_GBasc_String(u16 x,u8 y,u8 text[],u8 zk_num,u8 mode); //顯示GB2312 ascii 字符串 void Display_GBasc(u16 x,u8 y,u8 zk_num,u8 mode); //顯示GB2312 ascii void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler); u8 SPI1_ReadWriteByte(u8 TxData); void SPI1_Init(void); void OLED1_Init(void); #endif3.主函數(shù)
// GND 電源地 // VCC 3.3v電源 // D0 PB3(SCL) // D1 PB5(SDA) // RES PD6 // DC PD7 // CS1 PF9 // FS0 PB4 // CS2 PF10 #include "sys.h" #include "delay.h" #include "led.h" #include "oled.h" #include "bmp.h"int main(void) {delay_init(168); // uart_init(115200); //初始化USARTOLED_Init();while(1){GPIO_ResetBits(GPIOA, GPIO_Pin_15);delay_ms(1000);GPIO_SetBits(GPIOA, GPIO_Pin_15);delay_ms(1000);OLED_DrawBMP(0,0,256,64,gImage_1,0);//灰度圖片顯示delay_ms(1000);OLED_Clear();OLED_DrawSingleBMP(0,0,256,64,gImage_2,0);//單色圖片顯示delay_ms(1000);OLED_Clear();Display_GB2312_String(0,26,"中",12,0);//GB2312_12*12Display_GB2312_String(12,24,"景",16,0);//GB2312_15*16Display_GB2312_String(28,20,"園",24,0);//GB2312_24*24Display_GB2312_String(52,16,"電",32,0);//GB2312_32*32Display_GB2312_String(84,16,"子",32,0);//GB2312_32*32Display_GB2312_String(128,16,"中",32,1);//GB2312_12*12Display_GB2312_String(160,16,"景",32,1);//GB2312_15*16Display_GB2312_String(192,20,"園",24,1);//GB2312_24*24Display_GB2312_String(216,24,"電",16,1);//GB2312_32*32Display_GB2312_String(232,26,"子",12,1);//GB2312_32*32delay_ms(1000);OLED_Clear();Display_Asc_String(0,0,"ASCII:5x7",7,0);//5x7 ASCIIDisplay_Asc_String(0,13,"ASCII:7x8",8,0);//7x8 ASCIIDisplay_Asc_String(0,26,"ASCII:6x12",12,0);//6x12 ASCIIDisplay_Asc_String(0,43,"ASCII:8x16",16,0);//8x16 ASCIIdelay_ms(1000);OLED_Clear();Display_Asc_String(0,0,"ASCII:5x7",7,1);//5x7 ASCIIDisplay_Asc_String(0,13,"ASCII:7x8",8,1);//7x8 ASCIIDisplay_Asc_String(0,26,"ASCII:6x12",12,1);//6x12 ASCIIDisplay_Asc_String(0,43,"ASCII:8x16",16,1);//8x16 ASCIIdelay_ms(1000);OLED_Clear();Display_Asc_String(0,0,"ASC12x24",24,0);//12x24 ASCIIDisplay_Asc_String(0,30,"ASC16x32",32,0);//16x32 ASCIIdelay_ms(1000);OLED_Clear();Display_Asc_String(0,0,"ASC12x24",24,1);//12x24 ASCIIDisplay_Asc_String(0,30,"ASC16x32",32,1);//16x32 ASCIIdelay_ms(1000);// Display_GB2312_String(16*0,0,"當(dāng)",16,0);//GB2312_32*32 // Display_GB2312_String(16*1,0,"前",16,0);//GB2312_32*32 // Display_GB2312_String(16*2,0,"距",16,0);//GB2312_32*32 // Display_GB2312_String(16*3,0,"離",16,0);//GB2312_32*32 // Display_GB2312_String(16*4,0,":",16,0);//GB2312_32*32 // Display_Asc_String(16*5,0,"32",16,0);//16x32 ASCII// Display_GB2312_String(16*0,16,"設(shè)",16,0);//GB2312_32*32 // Display_GB2312_String(16*1,16,"置",16,0);//GB2312_32*32 // Display_GB2312_String(16*2,16,"距",16,0);//GB2312_32*32 // Display_GB2312_String(16*3,16,"離",16,0);//GB2312_32*32 // Display_GB2312_String(16*4,16,":",16,0);//GB2312_32*32 // Display_Asc_String(16*5,16,"32",16,0);//16x32 ASCII// Display_GB2312_String((12*0)+34,52,"設(shè)",12,0);//GB2312_32*32 // Display_GB2312_String((12*1)+34,52,"置",12,0);//GB2312_32*32 // Display_GB2312_String((12*2)+34,52,"距",12,0);//GB2312_32*32 // Display_GB2312_String((12*3)+34,52,"離",12,0);//GB2312_32*32 // Display_GB2312_String((12*4)+34,52,":",12,0);//GB2312_32*32// Display_GB2312_String((12*0)+34,52,"設(shè)置",12,0);//GB2312_32*32 // delay_ms(2000);OLED_Clear();} }總結(jié)
以上是生活随笔為你收集整理的“高通”字库芯片的使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WEB项目优化:雅虎优化网站的34条法则
- 下一篇: 前端优化方案