日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

“高通”字库芯片的使用方法

發布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “高通”字库芯片的使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32+字庫

“高通”字庫芯片的使用方法

“高通”字庫芯片的使用方法

  • STM32+字庫
  • 前言
  • 一、電路設計
  • 二、程序設計
    • 代碼如下:
  • 整體代碼部分
    • 1.字庫初始化
    • 2.字庫頭文件
    • 3.主函數


前言

本文應用了這位大神的指導鏈接:https://blog.csdn.net/qq_40102829/article/details/105622434 再通過自己實踐來的結果

測試平臺:STM32F103C8T6
字庫芯片型號:GT21L16S2W SPI協議
顯示方式:0.96寸的OLED SPI協議

通常在小顯示屏上顯示中文字體需要一個專用的軟件對其漢字進行取模,而且需要大量的工作一個一個取出對應漢字的數據,如果是大量的漢字要顯示實在不方便,不如直接買一個別人已經將字庫弄好的直接調用爽快多了。本次第一次購買掉進了一個坑,在此提醒下,注意購買的時候你要根據你的顯示屏掃描的方式 如0.96寸的OLED掃描方式是從先從 下到上 后 左到右 的順序規律掃描出來的,那些漢字取模軟件也有類似的選項給你選擇,所以購買時選擇好點陣排列方式是豎置橫排的還是橫

在高通官網站查找不到芯片手冊,只能通過百度文庫中查找或在立創商城中找到。手冊中也坑,在最新版本中要么不給出字體的地址或者是指定的漢字詳細計算方法。所以只能在百度文庫中找最早出現的A版本查詢信息

說實話,我最終還是跟現實低下頭,直接買別人現成的,真香。程序部分別人已經寫好了有SPI和IIC注釋也好看,而我合并了SPI和IIC的功能下次調用直接使能哪一個通訊方式就行。

改為:
測試平臺:STM32F407系列
字庫芯片型號:GT30L32S4W SPI協議
顯示方式:2.08寸的OLED SPI協議

鏈接: “高通”字庫芯片的使用方法


一、電路設計

電路設計:字庫芯片跟SPI FLASH 存儲器連接方式一樣,注意MOSI和MISO與單片機連接對調就行了,沒啥好說的

二、程序設計

先看看手冊中的指令有哪些

這款芯片比較簡單只有兩個指令 Read Data Bytes(一般讀取)和 Read Data Bytes at Higher Speed(快速讀取點陣數據)

以最簡單的方式 Read Data Bytes(一般讀取) 來講解


1個字節的命令字(03H)和 3個字節的地址(通過給出的公式計算出來傳遞給其)
1個字節 = 8位 —> 0000 0000 一共要發送24位數據給到字庫芯片中去
從圖象中可以看出高位先進去(MSB),發送完24位數據后 字庫芯片會發送數據出來 (Data Out1)

代碼如下:

//****************************************************************************** // 函數說明:向字庫芯片發送指令 // 入口數據:AddrHigh 寫地址高字節 // AddrMid 寫地址中字節 // AddrLow 寫地址低字節 // *pBuff 讀到的數據 // 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);//寫地址高字節ZK_command(AddrMid);//寫地址中字節ZK_command(AddrLow);//寫地址低字節for(i = 0; i < DataLen; i++ ){*(pBuff+i) =get_data_from_ROM();//讀一個字節數據}ZK_CS_Set();//取消字庫片選 }

整體代碼部分

1.字庫初始化

OLED_IIC_MODE 和 LED_SPI_MODE 該定義即可更改為SPI模式或IIC模式通訊
代碼如下(示例):

#include "oled.h" #include "stdlib.h" #include "oledfont.h" #include "delay.h" #include "stm32f4xx_spi.h" //************************************硬件連接線******************************** // GND 電源地 // VCC 3.3v電源 // D0 PB3(SCL) // D1 PB5(SDA) // RES PD6 // DC PD7 // CS1 PF9 // FS0 PB4 // CS2 PF10 //******************************************************************************void OLED_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_AHB1PeriphClockCmd(OLED_GPIO_ClockCmd, ENABLE);//使能GPIO時鐘#if OLED_IIC_MODE //RES、DCGPIO_InitStructure.GPIO_Pin = OLED_GPIO_RES_PIN|OLED_GPIO_DC_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通輸出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(OLED_GPIO_RES_PORT, &GPIO_InitStructure); //初始化GPIO_Init(OLED_GPIO_DC_PORT, &GPIO_InitStructure); //初始化//CS1、CS2GPIO_InitStructure.GPIO_Pin = OLED_GPIO_CS_PIN|ZK_GPIO_CS_PIN; GPIO_Init(OLED_GPIO_CS_PORT, &GPIO_InitStructure); //初始化GPIO_Init(ZK_GPIO_CS_PORT, &GPIO_InitStructure); //初始化 //SCL、SDAGPIO_InitStructure.GPIO_Pin = OLED_GPIO_SCL_PIN|OLED_GPIO_SDA_PIN; GPIO_Init(OLED_GPIO_SCL_PORT, &GPIO_InitStructure); //初始化 GPIO_Init(OLED_GPIO_SDA_PORT, &GPIO_InitStructure); //初始化 //FS0GPIO_InitStructure.GPIO_Pin = ZK_GPIO_FS0_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通輸入模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉輸入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOE8GPIO_SetBits(ZK_GPIO_FS0_PORT,ZK_GPIO_CS_PIN);#endif#if OLED_SPI_MODERCC_APB2PeriphClockCmd(ZK_SPI_CLK, ENABLE); //使能SPI1時鐘//RES、DCGPIO_InitStructure.GPIO_Pin = OLED_GPIO_RES_PIN|OLED_GPIO_DC_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通輸出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(OLED_GPIO_RES_PORT, &GPIO_InitStructure); //初始化GPIO_Init(OLED_GPIO_DC_PORT, &GPIO_InitStructure); //初始化//CS1、CS2GPIO_InitStructure.GPIO_Pin = OLED_GPIO_CS_PIN|ZK_GPIO_CS_PIN; GPIO_Init(OLED_GPIO_CS_PORT, &GPIO_InitStructure); //初始化GPIO_Init(ZK_GPIO_CS_PORT, &GPIO_InitStructure); //初始化 //MOSI、MISO、SCKGPIO_InitStructure.GPIO_Pin = OLED_GPIO_SCL_PIN|OLED_GPIO_SDA_PIN|ZK_GPIO_FS0_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(ZK_GPIO_FS0_PORT, &GPIO_InitStructure); GPIO_Init(OLED_GPIO_SCL_PORT, &GPIO_InitStructure); GPIO_Init(OLED_GPIO_SDA_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(ZK_GPIO_FS0_PORT,ZK_GPIO_PinSource_SCL,ZK_SPI_GPIO_AF); //PB3復用為 SPI1GPIO_PinAFConfig(ZK_GPIO_FS0_PORT,ZK_GPIO_PinSource_FS0,ZK_SPI_GPIO_AF); //PB4復用為 SPI1GPIO_PinAFConfig(ZK_GPIO_FS0_PORT,ZK_GPIO_PinSource_SDA,ZK_SPI_GPIO_AF); //PB5復用為 SPI1//這里只針對SPI口初始化RCC_APB2PeriphResetCmd(ZK_SPI_CLK,ENABLE); //復位SPI1RCC_APB2PeriphResetCmd(ZK_SPI_CLK,DISABLE); //停止復位SPI1SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //設置SPI單向或者雙向的數據模式:SPI設置為雙線雙向全雙工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設置SPI工作模式:設置為主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //設置SPI的數據大小:SPI發送接收8位幀結構SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步時鐘的空閑狀態為高電平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步時鐘的第二個跳變沿(上升或下降)數據被采樣SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //定義波特率預分頻的值:波特率預分頻值為256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定數據傳輸從MSB位還是LSB位開始:數據傳輸從MSB位開始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式SPI_Init(ZK_SPIx, &SPI_InitStructure); //根據SPI_InitStruct中指定的參數初始化外設SPIx寄存器SPI_Cmd(ZK_SPIx, ENABLE); //使能SPI外設SPI1_ReadWriteByte(0xff);//啟動傳輸 #endifOLED_RES_Clr(); //復位delay_ms(10);OLED_RES_Set();OLED_WR_REG(0xAE);//Set display offOLED_WR_REG(0xB0); //Row address Mode SettingOLED_WR_REG(0x00);OLED_WR_REG(0x10); //Set Higher Column Address of display RAMOLED_WR_REG(0x00); //Set Lower Column Address of display RAMOLED_WR_REG(0xD5); //Set Display Clock Divide Ratio/Oscillator FrequencyOLED_WR_REG(0x50); //50 125hzOLED_WR_REG(0xD9); //Set Discharge/Precharge PeriodOLED_WR_REG(0x22);OLED_WR_REG(0x40); //Set Display Start LineOLED_WR_REG(0x81); //The Contrast Control Mode SetOLED_WR_REG(0xFF);if(USE_HORIZONTAL){OLED_WR_REG(0xA1); //Set Segment Re-mapOLED_WR_REG(0xC8); //Set Common Output Scan DirectionOLED_WR_REG(0xD3); //Set Display OffsetOLED_WR_REG(0x20);}else{OLED_WR_REG(0xA0); //Set Segment Re-mapOLED_WR_REG(0xC0); //Set Common Output Scan DirectionOLED_WR_REG(0xD3); //Set Display OffsetOLED_WR_REG(0x00);}OLED_WR_REG(0xA4); //Set Entire Display OFF/ONOLED_WR_REG(0xA6); //Set Normal/Reverse DisplayOLED_WR_REG(0xA8); //Set Multiplex RationOLED_WR_REG(0x3F);OLED_WR_REG(0xAD); //DC-DC SettingOLED_WR_REG(0x80); //DC-DC is disableOLED_WR_REG(0xDB); //Set VCOM Deselect LevelOLED_WR_REG(0x30);OLED_WR_REG(0xDC); //Set VSEGM LevelOLED_WR_REG(0x30);OLED_WR_REG(0x33); //Set Discharge VSL Level 1.8VOLED_Clear();OLED_WR_REG(0xAF); //Set Display On } //****************************************************************************** // 函數說明:硬件SPI讀寫一個字節 // 入口數據:要寫入的字節 // 返回值: 讀取到的字節 //******************************************************************************#if OLED_SPI_MODE u8 SPI1_ReadWriteByte(u8 TxData) { while (SPI_I2S_GetFlagStatus(ZK_SPIx, SPI_I2S_FLAG_TXE) == RESET){}//等待發送區空 SPI_I2S_SendData(ZK_SPIx, TxData); //通過外設SPIx發送一個byte 數據while (SPI_I2S_GetFlagStatus(ZK_SPIx, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一個byte return SPI_I2S_ReceiveData(ZK_SPIx); //返回通過SPIx最近接收的數據 }#endif//****************************************************************************** // 函數說明:OLED寫入一個指令 // 入口數據:dat 數據 // 返回值: 無 //****************************************************************************** void OLED_WR_Bus(u8 dat) {u8 i;OLED_CS_Clr();#if OLED_IIC_MODEfor(i=0;i<8;i++){ OLED_SCL_Clr();if(dat&0x80){OLED_SDA_Set();}else {OLED_SDA_Clr();}OLED_SCL_Set();dat<<=1; } // printf("IIC\r");#endif#if OLED_SPI_MODESPI1_ReadWriteByte(dat); // printf("SPI\r");#endifOLED_CS_Set(); }//****************************************************************************** // 函數說明:OLED寫入一個指令 // 入口數據:reg 指令 // 返回值: 無 //****************************************************************************** void OLED_WR_REG(u8 reg) { OLED_DC_Clr(); OLED_WR_Bus(reg);OLED_DC_Set(); }//****************************************************************************** // 函數說明:OLED寫入一個數據 // 入口數據:dat 數據 // 返回值: 無 //****************************************************************************** void OLED_WR_Byte(u8 dat) { OLED_WR_Bus(dat); }//****************************************************************************** // 函數說明:OLED顯示列的起始終止地址 // 入口數據:a 列的起始地址 // b 列的終止地址 // 返回值: 無 //****************************************************************************** void OLED_AddressSet(u8 x,u8 y) {OLED_WR_REG(0xB0);OLED_WR_REG(y);OLED_WR_REG(((x&0xf0)>>4)|0x10);OLED_WR_REG((x&0x0f)); }//****************************************************************************** // 函數說明:OLED清屏顯示 // 入口數據:無 // 返回值: 無 //****************************************************************************** void OLED_Clear(void) {u16 j,i;OLED_AddressSet(0,0);OLED_CS_Clr();for(i=0;i<64;i++){#if OLED_IIC_MODEOLED_AddressSet(0,i);#endif for(j=0;j<128;j++){#if OLED_IIC_MODEOLED_WR_Byte(0x00);#endif #if OLED_SPI_MODESPI1_ReadWriteByte(0x00); #endif }}OLED_CS_Set(); }//****************************************************************************** // 函數說明:OLED清屏顯示 // 入口數據:x1,y1 起點坐標 // x2,y2 結束坐標 // color 填充的顏色值 // 返回值: 無 //****************************************************************************** void OLED_Fill(u16 x1,u8 y1,u16 x2,u8 y2,u8 color) {u16 j,i;x1/=2;x2/=2;for(i=y1;i<y2;i++){OLED_AddressSet(x1,i);for(j=x1;j<x2;j++){OLED_WR_Byte(color);}} }//****************************************************************************** // 函數說明:OLED顯示漢字 // 入口數據:x,y :起點坐標 // *s :要顯示的漢字串 // sizey 字符高度 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_ShowChinese(u8 x,u8 y,u8 *s,u8 sizey,u8 mode) {while(*s!=0){if(sizey==16) OLED_ShowChinese16x16(x,y,s,sizey,mode);else if(sizey==24) OLED_ShowChinese24x24(x,y,s,sizey,mode);else if(sizey==32) OLED_ShowChinese32x32(x,y,s,sizey,mode);else return;s+=2;x+=sizey;} }//****************************************************************************** // 函數說明:OLED顯示漢字 // 入口數據:x,y :起點坐標 // *s :要顯示的漢字 // sizey 字符高度 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_ShowChinese16x16(u8 x,u8 y,u8 *s,u8 sizey,u8 mode) {u8 i,j,k,t,DATA=0,HZnum;u16 TypefaceNum;x/=2;TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;//字符所占字節數HZnum=sizeof(tfont16)/sizeof(typFNT_GB16); //統計漢字庫數目t=sizey/8;for(k=0;k<HZnum;k++){if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1))){ for(i=0;i<TypefaceNum;i++){if(i%t==0){OLED_AddressSet(x,y);y++;}for(j=0;j<4;j++){if(tfont16[k].Msk[i]&(0x01<<(j*2+0))){DATA=0xf0;}if(tfont16[k].Msk[i]&(0x01<<(j*2+1))){DATA|=0x0f;}if(mode){OLED_WR_Byte(~DATA);}else{OLED_WR_Byte(DATA);}DATA=0;}}} continue; //查找到對應點陣字庫立即退出,防止多個漢字重復取模帶來影響} }//****************************************************************************** // 函數說明:OLED顯示漢字 // 入口數據:x,y :起點坐標 // *s :要顯示的漢字 // sizey 字符高度 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_ShowChinese24x24(u8 x,u8 y,u8 *s,u8 sizey,u8 mode) {u8 i,j,k,t,DATA=0,HZnum;u16 TypefaceNum;x/=2;TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;//字符所占字節數HZnum=sizeof(tfont24)/sizeof(typFNT_GB24); //統計漢字庫數目t=sizey/8;for(k=0;k<HZnum;k++){if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1))){ for(i=0;i<TypefaceNum;i++){if(i%t==0){OLED_AddressSet(x,y);y++;}for(j=0;j<4;j++){if(tfont24[k].Msk[i]&(0x01<<(j*2+0))){DATA=0xf0;}if(tfont24[k].Msk[i]&(0x01<<(j*2+1))){DATA|=0x0f;}if(mode){OLED_WR_Byte(~DATA);}else{OLED_WR_Byte(DATA);}DATA=0;}}} continue; //查找到對應點陣字庫立即退出,防止多個漢字重復取模帶來影響} }//****************************************************************************** // 函數說明:OLED顯示漢字 // 入口數據:x,y :起點坐標 // *s :要顯示的漢字 // sizey 字符高度 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_ShowChinese32x32(u8 x,u8 y,u8 *s,u8 sizey,u8 mode) {u8 i,j,k,t,DATA=0,HZnum;u16 TypefaceNum;x/=2;TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;//字符所占字節數HZnum=sizeof(tfont32)/sizeof(typFNT_GB32); //統計漢字庫數目t=sizey/8;for(k=0;k<HZnum;k++){if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1))){ for(i=0;i<TypefaceNum;i++){if(i%t==0){OLED_AddressSet(x,y);y++;}for(j=0;j<4;j++){if(tfont32[k].Msk[i]&(0x01<<(j*2+0))){DATA=0xf0;}if(tfont32[k].Msk[i]&(0x01<<(j*2+1))){DATA|=0x0f;}if(mode){OLED_WR_Byte(~DATA);}else{OLED_WR_Byte(DATA);}DATA=0;}}} continue; //查找到對應點陣字庫立即退出,防止多個漢字重復取模帶來影響} }//****************************************************************************** // 函數說明:OLED顯示字符函數 // 此函數適用范圍:字符寬度是2的倍數 字符高度是寬度的2倍 // 入口數據:x,y 起始坐標 // chr 要寫入的字符 // sizey 字符高度 // 返回值: 無 //****************************************************************************** void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 sizey,u8 mode) {u8 i,j,c,k,t=4,temp,DATA=0;u16 num;x/=2;c=chr-' ';num=(sizey/16+((sizey%16)?1:0))*sizey;k=sizey/16;for(i=0;i<num;i++){if(sizey==16)temp=ascii_1608[c][i];//調用8x16字符else if(sizey==24)temp=ascii_2412[c][i];//調用12x24字符else if(sizey==32)temp=ascii_3216[c][i];//調用16x32字符 // else if(sizey==48)temp=ascii_4824[c][i];//調用24x48字符else return;if(sizey%16){k=sizey/16+1;if(i%k) t=2;else t=4;}if(i%k==0){OLED_AddressSet(x,y);y++;}for(j=0;j<t;j++){if(temp&(0x01<<(j*2+0))){DATA=0xf0;}if(temp&(0x01<<(j*2+1))){DATA|=0x0f;}if(mode){OLED_WR_Byte(~DATA);}else{OLED_WR_Byte(DATA);}DATA=0;}} }//****************************************************************************** // 函數說明:OLED顯示字符串 // 入口數據:x,y 起始坐標 // *dp 要寫入的字符 // sizey 字符高度 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_ShowString(u8 x,u8 y,u8 *dp,u8 sizey,u8 mode) {while(*dp!='\0'){OLED_ShowChar(x,y,*dp,sizey,mode);dp++;x+=sizey/2;} }//****************************************************************************** // 函數說明:m^n // 入口數據:m:底數 n:指數 // 返回值: result //****************************************************************************** u32 oled_pow(u16 m,u16 n) {u32 result=1;while(n--)result*=m; return result; }//****************************************************************************** // 函數說明:OLED顯示變量 // 入口數據:x,y :起點坐標 // num :要顯示的變量 // len :數字的位數 // sizey 字符高度 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_ShowNum(u8 x,u8 y,u32 num,u16 len,u8 sizey,u8 mode) { u8 t,temp;u8 enshow=0;for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){OLED_ShowChar(x+(sizey/2)*t,y,' ',sizey,mode);continue;}else enshow=1; }OLED_ShowChar(x+(sizey/2)*t,y,temp+'0',sizey,mode); } }//****************************************************************************** // 函數說明:顯示灰度圖片 // 入口數據:x,y :起點坐標 // length 圖片長度 // width 圖片寬度 // BMP[] :要顯示圖片 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_DrawBMP(u8 x,u8 y,u16 length,u8 width,const u8 BMP[],u8 mode) {u8 i,j;u16 k=0;x/=2;length=length/2+((length%2)?1:0);for(i=0;i<width;i++){OLED_AddressSet(x,y+i);for(j=0;j<length;j++){if(mode){OLED_WR_Byte(~BMP[k++]);}else{OLED_WR_Byte(BMP[k++]);}}} }//****************************************************************************** // 函數說明:顯示灰度圖片 // 入口數據:x,y :起點坐標 // length 圖片長度 // width 圖片寬度 // BMP[] :要顯示圖片 // mode 0:正常顯示;1:反色顯示 // 返回值: 無 //****************************************************************************** void OLED_DrawSingleBMP(u8 x,u8 y,u16 length,u8 width,const u8 BMP[],u8 mode) {u8 i,j,k,DATA=0;u16 m=0;length=length/8+((length%8)?1:0);x/=2;for(i=0;i<width;i++){OLED_AddressSet(x,y+i);for(j=0;j<length;j++){for(k=0;k<4;k++){if(BMP[m]&(0x01<<(k*2+0))){DATA=0xf0;}if(BMP[m]&(0x01<<(k*2+1))){DATA|=0x0f;}if(mode){OLED_WR_Byte(~DATA);}else{OLED_WR_Byte(DATA);}DATA=0;}m++;}} }

以上SPI用到的是STM32的SPI2當中,時鐘掛接在36M的PCLK1分頻得到,預分頻設置為最大值256(36M/256 = 0.14M)
SCLK的頻率為140KHz,Tsclk:14.0us

2.字庫頭文件

代碼如下(示例):

#ifndef __OLED_H #define __OLED_H #include "sys.h"#define USE_HORIZONTAL 0 //設置顯示方向 0:正向顯示;1:旋轉180度顯示#define OLED_SPI_MODE 0 //設置硬件SPI或軟件IIC 0:硬件SPI; 1:軟件IIC #define OLED_IIC_MODE 1 //設置硬件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);//顯示屏功能函數 void OLED_WR_REG(u8 reg); //寫入一個指令 void OLED_WR_Byte(u8 dat); //寫入一個數據 void OLED_AddressSet(u8 x,u8 y); //設置起始坐標函數 void OLED_Clear(void); //清平函數 void OLED_Fill(u16 x1,u8 y1,u16 x2,u8 y2,u8 color); //填充函數 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);//顯示整數變量 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);//字庫函數 void ZK_command(u8 dat); //向字庫發送命令 u8 get_data_from_ROM(void); //從字庫度一個數據 void get_n_bytes_data_from_ROM(u8 AddrHigh,u8 AddrMid,u8 AddrLow,u8 *pBuff,u8 DataLen );//從字庫讀DataLen個數據 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); #endif

3.主函數

// 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,"當",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,"設",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,"設",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,"設置",12,0);//GB2312_32*32 // delay_ms(2000);OLED_Clear();} }

總結

以上是生活随笔為你收集整理的“高通”字库芯片的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。