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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于正点原子STM32的OLED显示实验

發(fā)布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于正点原子STM32的OLED显示实验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本章將講述OLED顯示實(shí)驗(yàn),小白總結(jié),如有錯誤,請大神指教。我們將使用 MiniSTM32 開發(fā)板上的 OLED 模塊接口,來點(diǎn)亮 OLED,并實(shí)現(xiàn) ASCII 字符的顯示。

目錄

一、什么是OLED呢?

二、OLED顯示實(shí)驗(yàn)的思路

三、OLED顯示實(shí)驗(yàn)


一、什么是OLED呢?

OLED,即有機(jī)發(fā)光二極管,由于同時具備自發(fā)光,不需背光源、對比度高、厚度薄、視角廣、反應(yīng)速度快、可用于撓曲性面板、使用溫度范圍廣、構(gòu)造及制程較簡單等優(yōu)異之特性,被認(rèn)為是下一代的平面顯示器新興應(yīng)用技術(shù)。

我們使用的是 ALINETEK 的 OLED 顯示模塊,該模塊有以下特點(diǎn):?
1)模塊有單色和雙色兩種可選,單色為純藍(lán)色,而雙色則為黃藍(lán)雙色。?
2)尺寸小,顯示尺寸為 0.96 寸,而模塊的尺寸僅為 27mm*26mm 大小。?
3)高分辨率,該模塊的分辨率為 128*64。?
4)多種接口方式,該模塊提供了總共 4 種接口包括:6800、8080 兩種并行接口方式、4
線 SPI 接口方式以及 IIC 接口方式(只需要 2 根線就可以控制 OLED 了!)。?
5)不需要高壓,直接接 3.3V 就可以工作了。?

二、OLED顯示實(shí)驗(yàn)的思路

1.設(shè)置 STM32 與 OLED 模塊相連接的 IO。

2.初始化 OLED 模塊。

3.通過函數(shù)將字符和數(shù)字顯示到 OLED 模塊上。

三、OLED顯示實(shí)驗(yàn)

工程文件如下:

test.c文件如下:

#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "oled.h" int main(void) { u8 t=0; Stm32_Clock_Init(9);delay_init(72); uart_init(72,9600); LED_Init(); OLED_Init(); OLED_ShowString(0,0,"ALIENTEK",24); OLED_ShowString(0,24, "0.96' OLED TEST",16); OLED_ShowString(0,40,"ATOM 2014/3/7",12); OLED_ShowString(0,52,"ASCII:",12); OLED_ShowString(64,52,"CODE:",12); OLED_Refresh_Gram(); t=' '; while(1) { OLED_ShowChar(36,52,t,12,1);OLED_ShowNum(94,52,t,3,12); OLED_Refresh_Gram();t++;if(t>'~')t=' '; delay_ms(500);LED0=!LED0;} }

?oled.c如下:

#include "oled.h" #include "stdlib.h" #include "oledfont.h" #include "delay.h"u8 OLED_GRAM[128][8]; //?üD???′?μ?LCD void OLED_Refresh_Gram(void) {u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); OLED_WR_Byte (0x00,OLED_CMD); OLED_WR_Byte (0x10,OLED_CMD); for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); } } #if OLED_MODE==1void OLED_WR_Byte(u8 dat,u8 cmd) {DATAOUT(dat); OLED_RS=cmd;OLED_CS=0; OLED_WR=0; OLED_WR=1;OLED_CS=1; OLED_RS=1; } #elsevoid OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; OLED_RS=cmd; //D′?üá? OLED_CS=0; for(i=0;i<8;i++){ OLED_SCLK=0;if(dat&0x80)OLED_SDIN=1;else OLED_SDIN=0;OLED_SCLK=1;dat<<=1; } OLED_CS=1; OLED_RS=1; } #endifvoid OLED_Display_On(void) {OLED_WR_Byte(0X8D,OLED_CMD); OLED_WR_Byte(0X14,OLED_CMD); OLED_WR_Byte(0XAF,OLED_CMD); }void OLED_Display_Off(void) {OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC?üá?OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF } void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00; OLED_Refresh_Gram(); }void OLED_DrawPoint(u8 x,u8 y,u8 t) {u8 pos,bx,temp=0;if(x>127||y>63)return;//3?3?·??§á?.pos=7-y/8;bx=y%8;temp=1<<(7-bx);if(t)OLED_GRAM[x][pos]|=temp;else OLED_GRAM[x][pos]&=~temp; }void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot) { u8 x,y; for(x=x1;x<=x2;x++){for(y=y1;y<=y2;y++)OLED_DrawPoint(x,y,dot);} OLED_Refresh_Gram();//?üD???ê? }void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode) { u8 temp,t,t1;u8 y0=y;u8 csize=(size/8+((size%8)?1:0))*(size/2); chr=chr-' '; for(t=0;t<csize;t++){ if(size==12)temp=asc2_1206[chr][t]; else if(size==16)temp=asc2_1608[chr][t]; else if(size==24)temp=asc2_2412[chr][t]; else return; for(t1=0;t1<8;t1++){if(temp&0x80)OLED_DrawPoint(x,y,mode);else OLED_DrawPoint(x,y,!mode);temp<<=1;y++;if((y-y0)==size){y=y0;x++;break;}} } }u32 mypow(u8 m,u8 n) {u32 result=1; while(n--)result*=m; return result; } void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size) { u8 t,temp;u8 enshow=0; for(t=0;t<len;t++){temp=(num/mypow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){OLED_ShowChar(x+(size/2)*t,y,' ',size,1);continue;}else enshow=1; }OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1); } } void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size) { while((*p<='~')&&(*p>=' '))//?D??ê?2?ê?·?·¨×?·?!{ if(x>(128-(size/2))){x=0;y+=size;}if(y>(64-size)){y=x=0;OLED_Clear();}OLED_ShowChar(x,y,*p,size,1); x+=size/2;p++;} } void OLED_Init(void) { RCC->APB2ENR|=1<<3; RCC->APB2ENR|=1<<4; #if OLED_MODE==1 JTAG_Set(SWD_ENABLE);GPIOB->CRL=0X33333333;GPIOB->ODR|=0XFFFF; GPIOC->CRH&=0XFFFFFF00;GPIOC->CRL&=0X00FFFFFF;GPIOC->CRH|=0X00000033;GPIOC->CRL|=0X33000000;GPIOC->ODR|=0X03C0; #else GPIOB->CRL&=0XFFFFFF00;GPIOB->CRL|=0XF0000033;GPIOB->ODR|=0X03;GPIOC->CRH&=0XFFFFFF00; GPIOC->CRH|=0X00000033; GPIOC->ODR|=3<<8; #endifOLED_WR_Byte(0xAE,OLED_CMD); OLED_WR_Byte(0xD5,OLED_CMD);OLED_WR_Byte(80,OLED_CMD); OLED_WR_Byte(0xA8,OLED_CMD); OLED_WR_Byte(0X3F,OLED_CMD); OLED_WR_Byte(0xD3,OLED_CMD); OLED_WR_Byte(0X00,OLED_CMD); OLED_WR_Byte(0x40,OLED_CMD); OLED_WR_Byte(0x8D,OLED_CMD);OLED_WR_Byte(0x14,OLED_CMD); OLED_WR_Byte(0x20,OLED_CMD);OLED_WR_Byte(0x02,OLED_CMD); OLED_WR_Byte(0xA1,OLED_CMD); OLED_WR_Byte(0xC0,OLED_CMD);OLED_WR_Byte(0xDA,OLED_CMD); OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0x81,OLED_CMD); OLED_WR_Byte(0xEF,OLED_CMD); OLED_WR_Byte(0xD9,OLED_CMD); OLED_WR_Byte(0xf1,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD); OLED_WR_Byte(0x30,OLED_CMD); OLED_WR_Byte(0xA4,OLED_CMD); OLED_WR_Byte(0xA6,OLED_CMD); OLED_WR_Byte(0xAF,OLED_CMD); OLED_Clear(); }

總結(jié)

以上是生活随笔為你收集整理的基于正点原子STM32的OLED显示实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。