首页 > 编程知识 正文

oled显示图片程序,oled动态显示数字

时间:2023-05-05 05:11:16 阅读:44124 作者:3727

任务:

了解OLED显示屏和汉字点码的原理,并使用STM32F103的SPI接口实现以下功能:

显示自己的学号和名字; 准备显示AHT20温度和湿度的上下或左右滑动显示长字符设备: STM32d103最小芯片、AHT20温湿度传感器、TTL串行芯片、0.96英寸OLED显示模块资料: https://detail.TM all.CCD SPM=a1z0d.6639537.1997196601.80.201 d 74841 fbmpwid=55673249552

OLDE与STM32芯片连接

OLED模块STM32芯片vccdc 5v/3.3 vgndgndd1pb15 cs pb11 RES pb12 dcpb 10 d0pb13 aht 20连接至STM32芯片

了解AHT20STM32芯片VCC3.3vsdab7gndgndsclb6OLED显示屏和汉字点码原理1、打开以上资料解压缩下载文件

将点大小设置为16 X 16,然后更改设置。

复制生成的字体并将其粘贴到oledfront.h文件中。

用1616点表示汉字的话,那个汉字图形由16行16列共计256个点构成。 这256个点用256位描述,需要32字节来存储图形信息。 这种二进制代码串称为汉字的“字符型”。

汉字的显示原理

通过键盘输入的汉字经过键盘管理模块,转换为机内代码。

然后,经过文字模式检索程序,发现与机内代码对应的点信息位于文字模式库的地址。

从词典中检索那个汉字的点阵信息。

使用显示驱动程序将这些信息发送到显卡的显示缓冲存储器。

显示器的控制器可以在整个画面上依次读取点信息,通过使各二进制位与画面的一个点相对应,在画面上显示汉字字形。

在任务OLED画面中显示学号名称。

1、使用PCtoLCD2002 (上图工具)输入学号名称。

2、将生成的文字模式复制到工程文件oledfront.h中。

3、main.c函数的TEST_MainPage (改写函数。 在函数所在的位置单击鼠标左键,然后跳。

4、显示效果

显示任务AHT20的温度和湿度

代码

# include ' tem hum.h ' # include ' GUI.h '/aht 20的状态寄存器u8aht 20 _ read _ status { u8 byte _ first,flag; IIC_Start (; aht20_wr_byte(0x71 ); flag=Receive_ACK (; byte_first=aht20_rd_byte(flag; IIC_NAck (; IIC_Stop (; return Byte_first; 向AHT20发送AC命令voidaht20_sendac(void ) {IIC_Start ); aht20_wr_byte(0x70 ); //传输开始后发送的01110000 (最后1位表示读/写0--写入,1--读取(Receive_ACK ) ); aht20_wr_byte(0xAC; //0xAC收集命令的命令参数有2个字节,第一个字节是0x33,第二个字节是0x00。 Receive_ACK (; aht20_wr_byte(0x33 ); Receive_ACK (; aht20_wr_byte(0x00 ); Receive_ACK (; IIC_Stop (; //aht20voidaht20_init(void ) ) {IIC_Init ); IIC_Start (; aht20_wr_byte(0x70 ); Receive_ACK (; aht20_wr_byte(0xa8 ); //0x A8进入nor操作模式的Receive_ACK (); aht20_wr_byte(0x00 ); Receive_ACK (; aht20_wr_byte(0x00 ); Receive_ACK (; IIC_Stop (; dlay_ms(10; 10ms左右的延迟IIC_Start (; aht20_wr_byte(0x70 ); Receive_ACK (; aht20_wr_byte(0xbe; //0xBE初始化命令,AHT20的初始化命令为0xBE,AHT10的初始化命令为0xE1Receive_ACK (; aht20_wr_byte(0x08 ); //相关寄存器bit[3]设为1,校准输出Receive_ACK (; aht20_wr_byte(0x00 ); Receive_ACK (; IIC_Stop (; dlay_ms(10; //延迟10ms左右(无//CRC检查,AHT20的温度和湿度数据voidaht20_read_CTdata(u32*CT ) {volatile uint8_t Byte_1th=0; volatile uint8_t Byte_2th=0; volatile uint8_t Byte_3th=0; volatile uint8_t Byte_4th=0; volatile uint8

_t Byte_5th=0;volatile uint8_t Byte_6th=0;uint32_t RetuData = 0;uint16_t cnt = 0;uint16_t flag;AHT20_SendAC();//向AHT20发送AC命令delay_ms(80);//大约延时80ms while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态{delay_ms(1);if(cnt++>=100) break;} IIC_Start();AHT20_WR_Byte(0x71);flag=Receive_ACK();Byte_1th = AHT20_RD_Byte(flag);//状态字Byte_2th = AHT20_RD_Byte(flag);//湿度,发送ACK(继续发送)Byte_3th = AHT20_RD_Byte(flag);//湿度Byte_4th = AHT20_RD_Byte(flag);//湿度/温度Byte_5th = AHT20_RD_Byte(flag);//温度Byte_6th = AHT20_RD_Byte(!flag);//温度,发送NACK(停止发送) IIC_Stop(); //保存得到的数据到RetuData中RetuData = (RetuData|Byte_2th)<<8; RetuData = (RetuData|Byte_3th)<<8;RetuData = (RetuData|Byte_4th);RetuData =RetuData >>4;ct[0] = RetuData;//湿度 RetuData = 0;RetuData = (RetuData|Byte_4th)<<8;RetuData = (RetuData|Byte_5th)<<8;RetuData = (RetuData|Byte_6th);RetuData = RetuData&0x0fffff;ct[1] =RetuData; //温度}extern void temandhum(void){uint32_t CT_data[2]={0};volatile int c1,t1;AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据 c1 = CT_data[0]*100*10/1024/1024/10; //计算得到湿度值t1 = (CT_data[1]*200*10/1024/1024-500)/10;//计算得到温度值GUI_ShowCHinese(10,16,16,"温度",1);GUI_ShowNum(50,16,t1,5,16,1);GUI_ShowCHinese(10,40,16,"湿度",1);GUI_ShowNum(50,40,c1,5,16,1);} #include "myiic.h"#include "delay.h" //初始化IICvoid IIC_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//使能GPIOB时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高}//产生IIC起始信号void IIC_Start(void){SDA_OUT(); //sda线输出IIC_SDA=1; IIC_SCL=1; IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号void IIC_Stop(void){SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highIIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4); }等待应答信号到来返回值:1,接收应答成功 0,接收应答失败u8 Receive_ACK(void){u8 ucErrTime=0;SDA_IN(); //SDA设置为输入 IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 0;}}IIC_SCL=0;//时钟输出0 return 1; } //产生ACK应答void IIC_Ack(void){IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;}//不产生ACK应答 void IIC_NAck(void){IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;} //IIC发送一个字节//返回从机有无应答//1,有应答//0,无应答 void AHT20_WR_Byte(u8 txd){ u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t<8;t++) { IIC_SDA=(txd&0x80)>>7; txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0;delay_us(2); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 AHT20_RD_Byte(unsigned char ack){unsigned char i,receive=0;SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ){ IIC_SCL=0; delay_us(2);IIC_SCL=1; receive<<=1; if(READ_SDA)receive++; delay_us(1); } if (!ack) IIC_NAck();//发送nACK,表示停止接收 else IIC_Ack(); //发送ACK,表示继续接收 return receive;} 任务三

上下或左右的滑动显示长字符。
参考:
1、 0.96寸OLED显示屏模块0.91 1.3寸液晶屏供原理图12864屏 IIC/SPI
2、SSD1306-0.96寸oled屏-滚动指令介绍

程序主代码

#include "delay.h"#include "sys.h"#include "oled.h"#include "gui.h"#include "test.h"#include "temhum.h"int main(void){int i;delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑) //uart_init(115200); //串口初始化为115200delay_ms(40);//上电后,延时40ms才能读取状态 AHT20_Init(); //ATH20初始化 while(1) {GUI_ShowString(30,0,"12345678",8,1); GUI_ShowCHinese(16,20,16,"一只小虾米",1);delay_ms(5000);OLED_Clear(0);for(i=0;i<=2;i++){temandhum();delay_ms(5000);OLED_Clear(0);}gun();GUI_ShowString(0,8,"welcome come to here,I hope you will get something",8,1);for(i=0;i<=5;i++){delay_ms(5000);}OLED_WR_Byte(0x2e,OLED_CMD);OLED_Clear(0);}}

滚动代码

OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动 OLED_WR_Byte(0x29,OLED_CMD); //水平垂直和水平滚动左右 29/2a OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节 OLED_WR_Byte(0x00,OLED_CMD); //起始页 0 OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔 OLED_WR_Byte(0x07,OLED_CMD); //终止页 1 OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量 OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动

最后结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。