嵌入式系统原理及应用项目化教程 课件 (陈群英)项目7、8 模数转换设计与实现、显示屏控制设计与实现_第1页
嵌入式系统原理及应用项目化教程 课件 (陈群英)项目7、8 模数转换设计与实现、显示屏控制设计与实现_第2页
嵌入式系统原理及应用项目化教程 课件 (陈群英)项目7、8 模数转换设计与实现、显示屏控制设计与实现_第3页
嵌入式系统原理及应用项目化教程 课件 (陈群英)项目7、8 模数转换设计与实现、显示屏控制设计与实现_第4页
嵌入式系统原理及应用项目化教程 课件 (陈群英)项目7、8 模数转换设计与实现、显示屏控制设计与实现_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统原理及应用

项目化教程项目7模数转换设计与实现学习目标1.了解STM32的ADC主要特点和结构;2.了解STM32与ADC编程相关的寄存器和库函数;3.会使用STM32的ADC寄存器和库函数,完成A/D转换程序设计;4.会利用STM32的ADC,实现模拟电压的采集并在串口上打印出来。目录7.1ADC介绍7.2任务12基于库函数的STM32F1ADC控制设计7.3任务13DS18B20温度传感器控制ADCADCAnalog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。7.1ADC介绍ADCSTM32F10xADC特点12位逐次逼近型的模拟数字转换器。最多带3个ADC控制器最多支持18个通道,可最多测量16个外部和2个内部信号源。支持单次和连续转换模式

转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。

通道0到通道n的自动扫描模式

自动校准

采样间隔可以按通道编程

规则通道和注入通道均有外部触发选项

转换结果支持左对齐或右对齐方式存储在16位数据寄存器ADC转换时间:最大转换速率1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)ADC供电要求:2.4V-3.6VADC输入范围:VREF-≤VIN≤VREF+7.1ADC介绍ADCSTM32F10x大容量芯片带3个ADC控制器其中144脚芯片因为带PF脚,所以多5个通道,为21个外部通道。小于144脚芯片只有16个外部通道。7.1ADC介绍ADCSTM32F10x系列芯片ADC通道和引脚对应关系7.1ADC介绍ADCADC引脚7.1ADC介绍ADCADC框图7.1ADC介绍ADC7.1ADC介绍ADCSTM32通道组规则通道组:相当正常运行的程序。最多16个通道。

规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则

组转换的总数应写入ADC_SQR1寄存器的L[3:0]中②注入通道组:相当于中断。最多4个通道。

注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组

里转化的总数应写入ADC_JSQR寄存器的L[1:0]中7.1ADC介绍ADC规则通道1规则通道2规则通道N注入通道1注入通道1规则通道1规则通道2规则通道N注入通道N7.1ADC介绍ADCSTM32F1的ADC的各通道可以单次,连续,扫描或者间断模式执行。7.1ADC介绍ADC单次转化VS连续转换7.1ADC介绍ADC单次转化VS连续转换7.1ADC介绍ADC扫描模式7.1ADC介绍ADCADC中断7.1ADC介绍ADCADC时钟配置不要让ADC时钟超过14MHz,否则可能不准。RCC_ADCCLKConfig(RCC_PCLK2_Div6);7.1ADC介绍ADCADC_CR1寄存器在扫描模式下,由ADC_SQRx或者ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或者JEOCIE,在最后一个通道转换完毕后才会产生EOC或者JEOC中断。7.1ADC介绍ADCADC_CR1寄存器7.1ADC介绍ADCADC_CR2寄存器7.1ADC介绍ADC数据对齐方式7.1ADC介绍ADCADC_CR2寄存器7.1ADC介绍ADCADC_SMPR1寄存器7.1ADC介绍ADCADC_SMPR2寄存器7.1ADC介绍ADCADC的采样时间最小采样时间1us(ADC时钟=14MHz,采样周期为1.5周期下得到)7.1ADC介绍ADCADC_SQR1/SQR2/SQR3规则序列寄存器7.1ADC介绍ADCADC_JSQR注入系列寄存器7.1ADC介绍ADCADC_DR规则通道数据寄存器7.1ADC介绍ADCADC_JDR注入通道数据寄存器7.1ADC介绍ADCADC_SR状态寄存器7.1ADC介绍ADC常用库函数voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);voidADC_DeInit(ADC_TypeDef*ADCx)voidADC_Cmd(ADC_TypeDef*ADCx,FunctionalStateNewState);voidADC_ITConfig(ADC_TypeDef*ADCx,uint16_tADC_IT,FunctionalStateNewState);voidADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx,FunctionalStateNewState);voidADC_RegularChannelConfig(ADC_TypeDef*ADCx,uint8_tADC_Channel,uint8_tRank,uint8_tADC_SampleTime);uint16_tADC_GetConversionValue(ADC_TypeDef*ADCx);voidADC_ResetCalibration(ADC_TypeDef*ADCx);FlagStatusADC_GetResetCalibrationStatus(ADC_TypeDef*ADCx);voidADC_StartCalibration(ADC_TypeDef*ADCx);FlagStatusADC_GetCalibrationStatus(ADC_TypeDef*ADCx);7.1ADC介绍ADCADC初始化函数ADC_Init

voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);typedefstruct{uint32_tADC_Mode;//ADC模式:配置ADC_CR1寄存器的位[19:16]:DUALMODE[3:0]位FunctionalStateADC_ScanConvMode;//是否使用扫描模式。ADC_CR1位8:SCAN位

FunctionalStateADC_ContinuousConvMode;//单次转换OR连续转换:ADC_CR2的位1:CONTuint32_tADC_ExternalTrigConv;//触发方式:ADC_CR2的位[19:17]:EXTSEL[2:0]uint32_tADC_DataAlign;//对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGNuint8_tADC_NbrOfChannel;//规则通道序列长度:ADC_SQR1的位[23:20]:L[3:0]}ADC_InitTypeDef;7.1ADC介绍ADC

voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE; //不开启扫描ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换模式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//触发软件ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel=1;//顺序进行规则转换的ADC通道的数目ADC_Init(ADC1,&ADC_InitStructure); 7.1ADC介绍ADCADC使能函数

ADC_Cmd();

voidADC_Cmd(ADC_TypeDef*ADCx,FunctionalState

NewState);ADC_Cmd(ADC1,ENABLE); //使能指定的ADC1ADC使能软件转换函数ADC_SoftwareStartConvCmdvoidADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx,FunctionalStateNewState)ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1的软件转换启动7.1ADC介绍ADCADC规则通道配置函数ADC_RegularChannelConfigADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);ADC获取转换结果函数ADC_GetConversionValueuint16_tADC_GetConversionValue(ADC_TypeDef*ADCx);ADC_GetConversionValue(ADC1);//获取ADC1转换结果

voidADC_RegularChannelConfig(ADC_TypeDef*ADCx,uint8_tADC_Channel,uint8_tRank,uint8_tADC_SampleTime);7.1ADC介绍7.2任务12基于库函数的STM32F1ADC控制设计ADC1对应芯片的PA1引脚,将该引脚直接外部连接到电位器上,调节电位器即可改变电压,通过ADC转换即可检测此电压值。

7.2任务12基于库函数的STM32F1ADC控制设计DS18B20介绍DS18B20技术性能特征①、独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实

现微处理器与DS18B20的双向通讯。大大提高了系统的抗干扰性。②、测温范围-55℃~+125℃,精度为±0.5℃。③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,

实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的

不稳定。④、工作电源:3.0~5.5V/DC(可以数据线寄生电源)。⑤、在使用中不需要任何外围元件。⑥、测量结果以9~12位数字量方式串行传送。7.3任务13DS18B20温度传感器控制DS18B20封装7.3DS18B20介绍连接方式7.3DS18B20介绍单总线是一种半双工通信方式DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。7.3DS18B20介绍复位脉冲单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480us,,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时15~60us,并进入接收模式(Rx)。接着DS18B20拉低总线60~240us,以产生低电平应答脉冲。

//复位DS18B20voidDS18B20_Rst(void) {DS18B20_IO_OUT();//设置为输出模式DS18B20_DQ_OUT=0;//拉低DQ

delay_us(750);//拉低750us(至少480us)DS18B20_DQ_OUT=1;//DQ=1拉高释放总线

delay_us(15);//15US//进入接受模式,等待应答信号。}7.3DS18B20介绍②应答信号//等待DS18B20的回应//返回1:未检测到DS18B20的存在返回0:存在u8DS18B20_Check(void) {u8retry=0;DS18B20_IO_IN();//SETPA0INPUT while(DS18B20_DQ_IN&&retry<200){retry++;

delay_us(1);}; if(retry>=200)return1;elseretry=0;while(!DS18B20_DQ_IN&&retry<240){retry++;

delay_us(1);};if(retry>=240)return1; return0;}7.3DS18B20介绍③写时序写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。写0时序:主机输出低电平,延时60us,然后释放总线,延时2us。7.3DS18B20介绍//写一个字节到DS18B20//dat:要写入的字节voidDS18B20_Write_Byte(u8dat){u8j;u8testb;DS18B20_IO_OUT();//设置PA0为输出for(j=1;j<=8;j++){

testb=dat&0x01;

dat=dat>>1;if(testb)//输出高{DS18B20_DQ_OUT=0;//主机输出低电平

delay_us(2);//延时2usDS18B20_DQ_OUT=1;//释放总线

delay_us(60);//延时60us}else//输出低{DS18B20_DQ_OUT=0;//主机输出低电平

delay_us(60);//延时60usDS18B20_DQ_OUT=1;//释放总线

delay_us(2);//延时2us}}}7.3DS18B20介绍④读时序单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。7.3DS18B20介绍//从DS18B20读取一个位//返回值:1/0u8DS18B20_Read_Bit(void) //readonebit{u8data;DS18B20_IO_OUT();//设置为输出DS18B20_DQ_OUT=0;//输出低电平2us

delay_us(2);DS18B20_DQ_OUT=1;//拉高释放总线DS18B20_IO_IN();//设置为输入

delay_us(12);//延时12usif(DS18B20_DQ_IN)data=1;//读取总线数据elsedata=0;

delay_us(50);//延时50usreturndata;}典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。7.3DS18B20介绍//从DS18B20读取一个字节//返回值:读到的数据u8DS18B20_Read_Byte(void)//readonebyte{u8i,j,dat;

dat=0;for(i=1;i<=8;i++){j=DS18B20_Read_Bit();

dat=(j<<7)|(dat>>1);} returndat;}读取一个字节数据7.3DS18B20介绍我们来看看DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位

发SKIPROM命令(0XCC)

发开始转换命令(0X44)

延时

复位

发送SKIPROM命令(0XCC)

发读存储器命令(0XBE)

连续读出两个字节数据(即温度)

结束。7.3DS18B20介绍//从ds18b20得到温度值//精度:0.1C//返回值:温度值(-550~1250)shortDS18B20_Get_Temp(void){u8temp;u8TL,TH;shorttem;DS18B20_Start();//ds1820startconvertDS18B20_Rst();复位DS18B20_Check(); DS18B20_Write_Byte(0xcc);//skipromDS18B20_Write_Byte(0xbe);//convert TL=DS18B20_Read_Byte();TH=DS18B20_Read_Byte(); if(TH>7){TH=~TH;TL=~TL;temp=0;//温度为负

}elsetemp=1;//温度为正

tem=TH;//获得高八位

tem<<=8;tem+=TL;//获得底八位

tem=(float)tem*0.625;//转换if(temp)returntem;//返回温度值

elsereturn-tem;}//开始温度转换voidDS18B20_Start(void)//ds1820startconvert{ DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);//skipromDS18B20_Write_Byte(0x44);//convert}转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125℃的数字输出为07D0H,,-25.0625℃的数字输出为FE6FH。7.3DS18B20介绍7.3任务13DS18B20温度传感器控制举一反三(1)使用ADC实现多个通道的AD采集。(温馨提示:参考ADC初始化步骤,修改相应的一些参数,注意ADC转换通道引脚不要被其他芯片或电路占用,防止干扰,ADC输入电压不能超过3.3V,否则可能烧坏芯片)。(2)利用DS18B20设计一个智能温度控制系统,具有温度上下限值设定,当温度高于上限值加热指示灯LED2熄灭同时报警,当温度低于下限值时加热指示灯LED2点亮同时报警,当温度处于上下限间正常工作,指示灯LED2闪烁。(温馨提示:把本章实验结合按键控制实验)。嵌入式系统原理及应用

项目化教程项目8显示屏控制设计与实现学习目标1.掌握TFT-LCD显示原理;2.利用TFT-LCD实现汉字和彩色的显示方法;3.掌握OLED显示原理;4.利用OLED实现ASCII字符的显示。目录8.1任务14TFT-LCD显示8.2任务15OLED显示1、TFTLCD驱动原理-TFTLCD简介TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFTLCD具有:亮度好、对比度高、层次感强、颜色鲜艳等特点。是目前最主流的LCD显示器。广泛应用于电视、手机、电脑、平板等各种电子产品。8.1任务14TFT-LCD显示TFTLCD驱动原理1、TFTLCD驱动原理-模块简介ALINETEKTFTLCD模块介绍ALIENTEK提供丰富的TFTLCD模块型号,供大家选择,目前有以下型号可选:1,ATK-2.8寸TFTLCD模块

分辨率:240*320,驱动IC:ILI9341,电阻触摸屏,16位并口驱动2,ATK-3.5寸TFTLCD模块分辨率:320*480,驱动IC:NT35310,电阻触摸屏,16位并口驱动3,ATK-4.3寸TFTLCD模块分辨率:480*800,驱动IC:NT35510,电容触摸屏,16位并口驱动4,ATK-7寸TFTLCD模块(V1版本)

分辨率:480*800,驱动IC:CPLD+SDRAM,电容触摸屏,16位并口驱动5,ATK-7寸TFTLCD模块(V2版本)分辨率:480*800,驱动IC:SSD1963,电容触摸屏,8/9/12/16位并口驱动8.1任务14TFT-LCD显示TFTLCD驱动原理1、TFTLCD驱动原理-模块简介ALINETEK2.8寸TFTLCD模块特点240*320分辨率16位真彩显示(65536色)自带电阻触摸屏自带背光电路注意:模块是3.3V供电的,不支持5V电压的MCU,如果是5VMCU,必须在信号线串接120R电阻使用。8.1任务14TFT-LCD显示TFTLCD驱动原理1、TFTLCD驱动原理-模块简介ALINETEK2.8寸TFTLCD模块原理图8.1任务14TFT-LCD显示TFTLCD驱动原理1、TFTLCD驱动原理-模块简介ALINETEK2.8寸TFTLCD接口说明(16位80并口)注意:DB1~DB8,DB10~DB17,总是按顺序连接MCU的D0~D15LCD_CS:LCD片选信号LCD_WR:LCD写信号LCD_RD:LCD读信号DB[17:1]:16位双向数据线。LCD_RST:硬复位LCD信号LCD_RS:命令/数据标志(0:命令,1:数据)BL_CTR:背光控制信号T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号8.1任务14TFT-LCD显示TFTLCD驱动原理1、TFTLCD驱动原理-模块简介ALINETEK2.8寸TFTLCD

16位80并口驱动简介并口写时序图并口读时序图模块的8080并口读/写的过程为:先根据要写入/读取的数据的类型,设置RS为高(数据)/低(命令),然后拉低片选,选中ILI9341,接着我们根据是读数据,还是要写数据置RD/WR为低,然后:1.读数据:在RD的上升沿,读取数据线上的数据(D[15:0]);2.写数据:在WR的上升沿,使数据写入到ILI9341里面8.1任务14TFT-LCD显示TFTLCD驱动原理1、TFTLCD驱动原理-模块简介ILI9341驱动时序重点时序:读ID低电平脉宽(trdl)读ID高电平脉宽(trdh)读FM低电平脉宽(trdlfm)读FM高电平脉宽(trdhfm)写控制低电平脉宽(twrl)写控制高电平脉宽(twrh)注意:ID指LCD的ID号FM指帧缓存,即:GRAM右图为:ILI93418080并口时序,详见:ILI9341_DS.pdf,232页8.1任务14TFT-LCD显示TFTLCD驱动原理1、TFTLCD驱动原理-驱动流程8.1任务14TFT-LCD显示TFTLCD驱动原理

RGB565格式说明模块对外接口采用16位并口,颜色深度为16位,格式为RGB565,关系如下图:1、TFTLCD驱动原理-指令简介ILI9341指令格式说明ILI9341所有的指令都是8位的(高8位无效),且参数除了读写GRAM的时候是16位,其他操作参数,都是8位的。ILI9341的指令很多,这里不一一介绍,仅介绍几个重要的指令,他们是:0XD3,0X36,0X2A,0X2B,0X2C,0X2E等6条指令。8.1任务14TFT-LCD显示TFTLCD驱动原理

0XD3指令该指令为读ID4指令,用于读取LCD控制器的ID。因此,同一个代码,可以根据ID的不同,执行不同的LCD驱动初始化,以兼容不同的LCD屏幕。1、TFTLCD驱动原理-指令简介8.1任务14TFT-LCD显示TFTLCD驱动原理

0X36指令该指令为存储访问控制指令,可以控制ILI9341存储器的读写方向,简单的说,就是在连续写GRAM的时候,可以控制GRAM指针的增长方向,从而控制显示方式(读GRAM也是一样)。1、TFTLCD驱动原理-指令简介8.1任务14TFT-LCD显示TFTLCD驱动原理

0X2A指令该指令是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x坐标)1、TFTLCD驱动原理-指令简介在默认扫描方式时,该指令用于设置x坐标,该指令带有4个参数,实际上是2个坐标值:SC和EC,即列地址的起始值和结束值,SC必须小于等于EC,且0≤SC/EC≤239。一般在设置x坐标的时候,我们只需要带2个参数即可,也就是设置SC即可,因为如果EC没有变化,我们只需要设置一次即可(在初始化ILI9341的时候设置),从而提高速度。8.1任务14TFT-LCD显示TFTLCD驱动原理

0X2B指令该指令是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y坐标)1、TFTLCD驱动原理-指令简介在默认扫描方式时,该指令用于设置y坐标,该指令带有4个参数,实际上是2个坐标值:SP和EP,即页地址的起始值和结束值,SP必须小于等于EP,且0≤SP/EP≤319。一般在设置y坐标的时候,我们只需要带2个参数即可,也就是设置SP即可,因为如果EP没有变化,我们只需要设置一次即可(在初始化ILI9341的时候设置),从而提高速度。8.1任务14TFT-LCD显示TFTLCD驱动原理

0X2C指令该指令是写GRAM指令,在发送该指令之后,我们便可以往LCD的GRAM里面写入颜色数据了,该指令支持连续写(地址自动递增)1、TFTLCD驱动原理-指令简介在收到指令0X2C之后,数据有效位宽变为16位,我们可以连续写入LCDGRAM值,而GRAM的地址将根据MY/MX/MV设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过SC,SP设置)后,每写入一个颜色值,GRAM地址将会自动自增1(SC++),如果碰到EC,则回到SC,同时SP++,一直到坐标:EC,EP结束,其间无需再次设置的坐标,从而大大提高写入速度。8.1任务14TFT-LCD显示TFTLCD驱动原理

0X2E指令该指令是读GRAM指令,用于读取ILI9341的显存(GRAM),同0X2C指令,该指令支持连续读(地址自动递增)1、TFTLCD驱动原理-指令简介ILI9341在收到该指令后,第一次输出的是dummy数据(无效),第二次开始,读取到的才是有效的GRAM数据(从坐标:SC,SP开始),输出规律为:每个颜色分量占8个位,一次输出2个颜色分量。比如:第一次输出是R1G1,随后的规律为:B1R2

G2B2

R3G3

B3R4

G4B4

R5G5...以此类推8.1任务14TFT-LCD显示TFTLCD驱动原理3、源码讲解-LCD坐标设置函数//设置光标位置//Xpos:横坐标//Ypos:纵坐标voidLCD_SetCursor(u16Xpos,u16Ypos){ if(lcddev.id==0X9341||lcddev.id==0X5310){ LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF);LCD_WR_REG(lcddev.setycmd); LCD_WR_DATA(Ypos>>8); LCD_WR_DATA(Ypos&0XFF);}elseif(lcddev.id==XXXX) //根据不同的LCD型号,执行不同的代码{ ……//省略部分代码}}

8.1任务14TFT-LCD显示TFTLCD源码3、源码讲解-LCD画点函数//画点//x,y:坐标//POINT_COLOR:此点的颜色voidLCD_DrawPoint(u16x,u16y){LCD_SetCursor(x,y); //设置光标位置

LCD_WriteRAM_Prepare(); //开始写入GRAMLCD->LCD_RAM=POINT_COLOR; //非Mini板的操作方式

}LCD_WR_DATA(POINT_COLOR);MiniSTM32;8.1任务14TFT-LCD显示TFTLCD源码3、源码讲解-LCD读点函数LCD读点函数:u16LCD_ReadPoint(u16x,u16y)1,非Mini板的读点函数代码(FSMC方式,适合战舰、精英、探索者F4板)2,Mini板的读点函数代码(GPIO方式,适合Mini板)8.1任务14TFT-LCD显示TFTLCD源码3、源码讲解-LCD字符显示函数//在指定位置显示一个字符//x,y:起始坐标//num:要显示的字符:""--->"~"//size:字体大小12/16/24//mode:叠加方式(1)还是非叠加方式(0)voidLCD_ShowChar(u16x,u16y,u8num,u8size,u8mode){

u8temp,t1,t;u16y0=y;u8csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数

num=num-''; //得到偏移后的值(ASCII字库是从空格开始取模,所以-''就是对应字符的字库)

for(t=0;t<csize;t++){if(size==12)temp=asc2_1206[num][t]; //调用1206字体

elseif(size==16)temp=asc2_1608[num][t]; //调用1608字体

elseif(size==24)temp=asc2_2412[num][t]; //调用2412字体

elsereturn; //没有的字库

for(t1=0;t1<8;t1++){

if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);

elseif(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);temp<<=1;y++;

if(y>=lcddev.height)return; //超区域了

if((y-y0)==size){

y=y0;

x++; if(x>=lcddev.width)return; //超区域了

break;}}

}

}8.1任务14TFT-LCD显示TFTLCD源码3、源码讲解-LCD字符显示函数constunsignedcharoled_asc2_1206[95][12]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"",0*/{0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/……{0x40,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x40,0x00},/*"~",94*/};字符码表constunsignedcharoled_asc2_1608[95][16]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"",0*/{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/……{0x00,0x00,0x60,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*"~",94*/}constunsignedcharoled_asc2_2412[95][36]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"",0*/{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0x0F,0xFE,0x38,0x0F,0x80,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/……{0x00,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x0C,0x00,0x00,0x10,0x00,0x00},/*"~",94*/}8.1任务14TFT-LCD显示TFTLCD源码3、源码讲解-LCD字符显示函数淘宝店铺:

技术论坛:8.1任务14TFT-LCD显示TFTLCD源码8.1任务14TFT-LCD显示OLEDOLED,即有机发光二极管(OrganicLight-EmittingDiode),又称为有机电激光显示(OrganicElectroluminesenceDisplay,OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。8.2任务15OLED显示ALINETEK0.96寸OLED模块1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。

单色模块每个像素点只有亮与不亮两种情况,没有颜色区分。2)尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小。3)高分辨率,该模块的分辨率为128*64。4)多种接口方式,该模块提供了总共4种接口包括:6800、8080两种并行接口方式、4线的穿行SPI接口方式,、IIC接口方式(只需要2根线就可以控制OLED了!)。5)不需要高压,直接接3.3V就可以工作了。这里要提醒大家的是,该模块不和5.0V接口兼容,所以请大家在使用的时候一定要小心,别直接接到5V的系统上去,否则可能烧坏模块8.2任务15OLED显示OLED模块工作模式选择4种模式通过模块的BS1/BS2设置,BS1/BS2的设置与模块接口模式的关系如表所示:8.2任务15OLED显示OLED模块原理图8.2任务15OLED显示OLED8080并行接口信号线说明CS:OLED片选信号。WR:向OLED写入数据。RD:从OLED读取数据。D[7:0]:8位双向数据线。RST(RES):硬复位OLED。DC:命令/数据标志(0,读写命令;1,读写数据)。OLED控制器为SSD13068.2任务15OLED显示OLED8080并口读写过程模块的8080并口读/写的过程为:先根据要写入/读取的数据的类型,设置DC为高(数据)/低(命令),然后拉低片选,选中SSD1306,接着我们根据是读数据,还是要写数据置RD/WR为低,然后:1.读数据:在RD的上升沿,使数据锁存到数据线(D[7:0])上;2.写数据:在WR的上升沿,使数据写入到SSD1306里面;并口写时序图并口读时序图8.2任务15OLED显示OLED模块显存SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。8.2任务15OLED显示程序显示原理在STM32的内部建立一个

缓存(共128*8个字节),在每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。当然这个方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。8.2任务15OLED显示SSD1306的命令命令0X81:设置对比度。包含两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。命令0XAE/0XAF:0XAE为关闭显示命令;0XAF为开启显示命令。命令0X8D:包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。命令0XB0~B7:用于设置页地址,其低三位的值对应着GRAM的页地址。命令0X00~0X0F:用于设置显示时的起始列地址低四位。命令0X10~0X1F:用于设置显示时的起始列地址高四位。8.2任务15OLED显示OLED初始化过程8.2任务15OLED显示OLED初始化//初始化SSD1306 voidOLED_Init(void){…//设置IO口模式,所有用到的io口设置为推挽模式。GPIO_Init();…//初始化代码,写相关寄存器OLED_WR_Byte(0xAE,OLED_CMD);//关闭显示OLED_WR_Byte(0xD5,OLED_CMD);//设置时钟分频因子,震荡频率OLED_WR_Byte(80,OLED_CMD);//[3:0],分频因子;[7:4],震荡频率OLED_WR_Byte(0xA8,OLED_CMD);//设置驱动路数OLED_WR_Byte(0X3F,OLED_CMD);//默认0X3F(1/64)OLED_WR_Byte(0xD3,OLED_CMD);//设置显示偏移OLED_WR_Byte(0X00,OLED_CMD);//默认为0……OLED_Clear();}8.2任务15OLED显示OLED写一个字节//向SSD1306写入一个字节。//dat:要写入的数据/命令//cmd:数据/命令标志0,表示命令;1,表示数据;voidOLED_WR_Byte(u8dat,u8cmd){DATAOUT(dat); if(cmd)

OLED_RS_Set();else

OLED_RS_Clr();

OLED_CS_Clr();

OLED_WR_Clr();

OLED_WR_Set();

OLED_CS_Set();

OLED_RS_Set(); } 8.2任务15OLED显示OLED更新缓存,显示内容。u8OLED_GRAM[128][8]; voidOLED_Refresh_Gram(void){u8i,n; for(i=0;i<8;i++){

OLED_WR_Byte(0xb0+i,OLED_CMD);//设置页地址(0~7)

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);}}8.2任务15OLED显示OLED画点函数voidOLED_DrawPoint(u8x,u8y,u8t){u8pos,bx,temp=0;if(x>127||y>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论