|
幾年前用藍(lán)牙芯片開(kāi)發(fā)一個(gè)項(xiàng)目,買(mǎi)了SmartRF開(kāi)發(fā)板,上面帶一個(gè)12864的OLED屏,最近在做一個(gè)IIC的OLED屏的項(xiàng)目,把這套板子找出來(lái)打算先把顯示的目錄系統(tǒng)做了。簡(jiǎn)單撇了一眼資料,寫(xiě)的IIC的驅(qū)動(dòng)例程,可看程序不對(duì)呀,驅(qū)動(dòng)方式明明是SPI的,怎么就IIC的例程呢?于是我找原理圖看了一下果然沒(méi)有開(kāi)漏的兩個(gè)上拉電阻。找找原來(lái)用過(guò)的配套軟件,沒(méi)找到,只好拿一塊前陣子調(diào)試GDE230的板子往上懟了。 好了,萬(wàn)事俱備了,老鐵,上吧!把程序移植到GD32E上,沒(méi)仿真,直接上,結(jié)果啥也沒(méi)有顯示。我坐在電腦前想了半天,想這個(gè)仿SIP的程序很簡(jiǎn)單呀,51時(shí)我就寫(xiě)個(gè),做PIC690和917時(shí),LPC2000時(shí),包括當(dāng)初做STM32時(shí)都寫(xiě)過(guò),不可能不好用呀!于是我搬出好久未用的用示波器測(cè)了測(cè)波形,兩個(gè)板子對(duì)比了一下,結(jié)果發(fā)現(xiàn)GD32E230的做CLK的那個(gè)引腳沒(méi)有輸出。血的教訓(xùn)告訴我,用過(guò)的板子一定做好記錄,要不就直接扔了,太耽誤事了!
好了,這個(gè)程序是直接移植過(guò)來(lái)的,能實(shí)現(xiàn)數(shù)字,英文,漢字和圖片的顯示,顯示字符的程序我修改了一下,加上了反顯,上程序!
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
單片機(jī)源程序如下:
- #ifndef __SSD1306_SPI_H
- #define __SSD1306_SPI_H
- #include "gd32e230.h"
- /*******************************宏定義****************************************/
- #define XLevelL 0x00
- #define XLevelH 0x10
- #define XLevel ((XLevelH&0x0F)*16+XLevelL)
- #define Max_Column 128
- #define Max_Row 64
- #define Brightness 0xCF
- #define X_WIDTH 128
- #define Y_WIDTH 64
- //-----------------OLED端口定義----------------
- #define OLED_CS_Clr() GPIO_BC(GPIOB) = GPIO_PIN_0
- #define OLED_CS_Set() GPIO_BOP(GPIOB) = GPIO_PIN_0 //接OLED模塊CS B0
- #define OLED_DC_Clr() GPIO_BC(GPIOB) = GPIO_PIN_1
- #define OLED_DC_Set() GPIO_BOP(GPIOB) = GPIO_PIN_1 //接OLED模塊D/C B1
- #define OLED_SDA_Clr() GPIO_BC(GPIOB) = GPIO_PIN_8
- #define OLED_SDA_Set() GPIO_BOP(GPIOB) = GPIO_PIN_8 //接OLED模塊MOSI B8
- #define OLED_SCL_Clr() GPIO_BC(GPIOA) = GPIO_PIN_7
- #define OLED_SCL_Set() GPIO_BOP(GPIOA) = GPIO_PIN_7 //接OLED模塊的CLK B9
- //#define OLED_CMD 0 //寫(xiě)命令
- //#define OLED_DATA 1 //寫(xiě)數(shù)據(jù)
- //OLED控制用函數(shù)
- void OLED_WrDat(unsigned char dat);//寫(xiě)數(shù)據(jù)
- void OLED_WrCmd(unsigned char cmd);//寫(xiě)命令
- void OLED_SetPos(unsigned char x, unsigned char y);//設(shè)置起始點(diǎn)坐標(biāo)
- void OLED_Fill(unsigned char bmp_dat);//全屏填充
- void OLED_CLS(void);//清屏
- void OLED_Init(void);//初始化
- void OLED_6x8Str(unsigned char x, unsigned char y, unsigned char ch[]);
- //void OLED_8x16Str(unsigned char x, unsigned char y, unsigned char ch[]);
- void OLED_8x16Str(unsigned char x, unsigned char y, unsigned char FB,unsigned char ch[]);
- void OLED_16x16CN(unsigned char x, unsigned char y, unsigned char N);
- void OLED_BMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[]);
- #endif
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- #include "SSD1306_SPI.h"
- #include "systick.h"
- #include "codetab.h"
- void delay(uint32_t nCount)
- {
- unsigned int a;
- while(nCount)
- {
- a=1800;
- while(a--);
- nCount--;
- }
- return;
- }
- void OLED_WrDat(unsigned char dat)//寫(xiě)數(shù)據(jù)
- {
- unsigned char i, temp=0;
- OLED_DC_Set();
- for(i=0;i<8;i++) //發(fā)送一個(gè)八位數(shù)據(jù)
- {
- OLED_SCL_Clr();
- temp = dat&0x80;
- if (temp == 0)
- {
- OLED_SDA_Clr();
- }
- else
- {
- OLED_SDA_Set();
- }
- //delay_1ms(1U);
- OLED_SCL_Set();
- dat<<=1;
- //delay_1ms(1U);
- }
- }
- void OLED_WrCmd(unsigned char cmd)//寫(xiě)命令
- {
- unsigned char i, temp=0;
- OLED_DC_Clr();
- for(i=0;i<8;i++) //發(fā)送一個(gè)八位數(shù)據(jù)
- {
- OLED_SCL_Clr();
- temp = cmd&0x80;
- if (temp == 0)
- {
- OLED_SDA_Clr();
- }
- else
- {
- OLED_SDA_Set();
- }
- OLED_SCL_Set();
- cmd<<=1;;
- }
- }
- void OLED_SetPos(unsigned char x, unsigned char y)//設(shè)置起始點(diǎn)坐標(biāo)
- {
- OLED_WrCmd(0xb0 + y);
- OLED_WrCmd(((x&0xf0)>>4)|0x10);
- OLED_WrCmd((x&0x0f)|0x01);
- }
- void OLED_Fill(unsigned char bmp_dat)//全屏填充
- {
- unsigned char y,x;
- for(y=0;y<8;y++)
- {
- OLED_WrCmd(0xb0+y);
- OLED_WrCmd(0x01);
- OLED_WrCmd(0x10);
- for(x=0;x<X_WIDTH;x++)
- {
- OLED_WrDat(bmp_dat);
- }
- }
- }
- void OLED_CLS(void)//清屏
- {
- OLED_Fill(0x00);
- }
- void OLED_Init(void)
- {
- rcu_periph_clock_enable(RCU_GPIOB);
- gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_0);
- gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0);
- gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_1);
- gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
- gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_8);
- gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8);
- rcu_periph_clock_enable(RCU_GPIOA);
- gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_7);
- gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7);
-
- OLED_SCL_Set();
- OLED_CS_Clr();
- delay(100);
- OLED_CS_Set();
-
- OLED_WrCmd(0xae);//--turn off oled panel
- OLED_WrCmd(0x00);//---set low column address
- OLED_WrCmd(0x10);//---set high column address
- OLED_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
- OLED_WrCmd(0x81);//--set contrast control register
- OLED_WrCmd(0xcf); // Set SEG Output Current Brightness
- OLED_WrCmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
- OLED_WrCmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
- OLED_WrCmd(0xa6);//--set normal display
- OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
- OLED_WrCmd(0x3f);//--1/64 duty
- OLED_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
- OLED_WrCmd(0x00);//-not offset
- OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
- OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
- OLED_WrCmd(0xd9);//--set pre-charge period
- OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
- OLED_WrCmd(0xda);//--set com pins hardware configuration
- OLED_WrCmd(0x12);
- OLED_WrCmd(0xdb);//--set vcomh
- OLED_WrCmd(0x40);//Set VCOM Deselect Level
- OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
- OLED_WrCmd(0x02);//
- OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
- OLED_WrCmd(0x14);//--set(0x10) disable
- OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
- OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
- OLED_WrCmd(0xaf);//--turn on oled panel
- OLED_Fill(0xff); //初始清屏
- delay(50);
- OLED_CLS();
- OLED_SetPos(0,0);
- }
- void OLED_6x8Str(unsigned char x, unsigned char y, unsigned char ch[])
- {
- unsigned char c=0,i=0,j=0;
- while (ch[j]!='\0')
- {
- c = ch[j]-32;
- if(x>126)
- {
- x=0;y++;
- }
- OLED_SetPos(x,y);
- for(i=0;i<6;i++)
- {
- OLED_WrDat(F6x8[c][i]);
- }
- x+=6;
- j++;
- }
- }
- void OLED_8x16Str(unsigned char x, unsigned char y, unsigned char FB,unsigned char ch[])
- {
- unsigned char c=0,i=0,j=0;
- while (ch[j]!='\0')
- {
- c =ch[j]-32;
- if(x>120)
- {
- x=0;y++;
- }
- OLED_SetPos(x,y);
- for(i=0;i<8;i++)
- {
- if(FB == 1) OLED_WrDat(~(F8X16[c*16+i]));
- else OLED_WrDat(F8X16[c*16+i]);
- }
- OLED_SetPos(x,y+1);
- for(i=0;i<8;i++)
- {
- if(FB == 1) OLED_WrDat(~(F8X16[c*16+i+8]));
- else OLED_WrDat(F8X16[c*16+i+8]);
- }
- x+=8;
- j++;
- }
- }
- void OLED_16x16CN(unsigned char x, unsigned char y, unsigned char N)
- {
- unsigned char wm=0;
- unsigned int adder=32*N;
- OLED_SetPos(x , y);
- for(wm = 0;wm < 16;wm++)
- {
- OLED_WrDat(F16x16[adder]);
- adder += 1;
- }
- OLED_SetPos(x,y + 1);
- for(wm = 0;wm < 16;wm++)
- {
- OLED_WrDat(F16x16[adder]);
- adder += 1;
- }
- }
- void OLED_BMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])
- {
- unsigned int j=0;
- unsigned char x,y;
-
- if(y1%8==0)
- {
- y=y1/8;
- }
- else
- y=y1/8+1;
- for(y=y0;y<y1;y++)
- {
- OLED_SetPos(x0,y);
- for(x=x0;x<x1;x++)
- {
- OLED_WrDat(BMP[j++]);
- }
- }
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- int main(void)
- {
- extern const unsigned char BMP1[];
- extern const unsigned char BMP_SETTING[];
- extern const unsigned char BMP_POWEROFF[];
- int32_t i = 0;
- uint8_t key = 0;
- /* system clocks configuration */
- rcu_config();
- /* systick configuration */
- systick_config();
- /* GPIO configuration */
- gpio_config();
- /* UART configuration */
- COM_init(EVAL_COM);
- /* OLED configuration */
- OLED_Init();
- /*******************************************************************/
- OLED_6x8Str(0,0,(uint8_t *)"123456789");
- OLED_6x8Str(0,1,(uint8_t *)"abcdefgh");
- delay_1ms(800U);
- OLED_BMP(0,0,128,8,(unsigned char *)BMP1);
- while (1)
- {
- delay_1ms(100U);
- }
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////
- MCU:GD32E230C8T6,72MHz
- OLED SPI MODE
- OLED: SmartRF V2.6的OLED屏
- 1 2 3 4 5 6
- GND VCC D0 D1 RST DC
- 0V 3V3 PB9 PA7 PB0 PB1
- GD的庫(kù): version 2018-06-19, V1.0.0, firmware for GD32E230
- KEIL MDK 5.27.1.0
復(fù)制代碼 全部程序51hei下載地址:
OLED_Display - 模擬SPI.zip
(220.23 KB, 下載次數(shù): 64)
2021-1-18 16:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|