ssd1306ssd为什么要换微软驱动指令表

网站已改版,请使用新地址访问:
FN90W SSD1306驱动程序,适合所有 芯片的OLED显示屏,成功调试,可用 SCM 单片机开发 261万源代码下载- www.pudn.com
&文件名称: FN90W& & [
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 6356 KB
&&上传时间:
&&下载次数: 0
&&提 供 者:
&详细说明:SSD1306驱动程序,适合所有SSD1306驱动芯片的OLED显示屏,成功调试,可用-SSD1306 device
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&FN90W\FN90W.rar&&.....\FN90W.uvguix.Administrator&&.....\FN90W.uvoptx&&.....\FN90W.uvprojx&&.....\header\adc.h&&.....\......\flash.h&&.....\......\key.h&&.....\......\lcd.h&&.....\......\main.h&&.....\......\temper.h&&.....\JLinkLog.txt&&.....\JLinkSettings.ini&&.....\Libraries\CMSIS\CM3\CoreSupport\core_cm3.c&&.....\.........\.....\...\...........\core_cm3.h&&.....\.........\.....\...\DeviceSupport\GD\GD32F1x0\startup_stm32f0xx.s&&.....\.........\.....\...\.............\..\........\stm32f0xx.h&&.....\.........\.....\...\.............\..\........\stm32f0xx_conf.h&&.....\.........\.....\...\.............\..\........\system_stm32f0xx.c&&.....\.........\.....\...\.............\..\........\system_stm32f0xx.h&&.....\.........\GD32F1x0_StdPeriph_Driver\inc\stm32f0xx_adc.h&&.....\.........\.........................\...\stm32f0xx_dbgmcu.h&&.....\.........\.........................\...\stm32f0xx_dma.h&&.....\.........\.........................\...\stm32f0xx_exti.h&&.....\.........\.........................\...\stm32f0xx_flash.h&&.....\.........\.........................\...\stm32f0xx_gpio.h&&.....\.........\.........................\...\stm32f0xx_i2c.h&&.....\.........\.........................\...\stm32f0xx_iwdg.h&&.....\.........\.........................\...\stm32f0xx_misc.h&&.....\.........\.........................\...\stm32f0xx_pwr.h&&.....\.........\.........................\...\stm32f0xx_rcc.h&&.....\.........\.........................\...\stm32f0xx_rtc.h&&.....\.........\.........................\...\stm32f0xx_spi.h&&.....\.........\.........................\...\stm32f0xx_syscfg.h&&.....\.........\.........................\...\stm32f0xx_tim.h&&.....\.........\.........................\...\stm32f0xx_wwdg.h&&.....\.........\.........................\src\stm32f0xx_adc.c&&.....\.........\.........................\...\stm32f0xx_dbgmcu.c&&.....\.........\.........................\...\stm32f0xx_dma.c&&.....\.........\.........................\...\stm32f0xx_exti.c&&.....\.........\.........................\...\stm32f0xx_flash.c&&.....\.........\.........................\...\stm32f0xx_gpio.c&&.....\.........\.........................\...\stm32f0xx_i2c.c&&.....\.........\.........................\...\stm32f0xx_iwdg.c&&.....\.........\.........................\...\stm32f0xx_misc.c&&.....\.........\.........................\...\stm32f0xx_pwr.c&&.....\.........\.........................\...\stm32f0xx_rcc.c&&.....\.........\.........................\...\stm32f0xx_rtc.c&&.....\.........\.........................\...\stm32f0xx_spi.c&&.....\.........\.........................\...\stm32f0xx_syscfg.c&&.....\.........\.........................\...\stm32f0xx_tim.c&&.....\.........\.........................\...\stm32f0xx_wwdg.c&&.....\..stings\FN90W.map&&.....\........\startup_stm32f0xx.lst&&.....\Objects\adc.crf&&.....\.......\adc.d&&.....\.......\adc.o&&.....\.......\core_cm3.crf&&.....\.......\core_cm3.d&&.....\.......\core_cm3.o&&.....\.......\ExtDll.iex&&.....\.......\flash.crf&&.....\.......\flash.d&&.....\.......\flash.o&&.....\.......\FN90W.axf&&.....\.......\FN90W.build_log.htm&&.....\.......\FN90W.hex&&.....\.......\FN90W.htm&&.....\.......\FN90W.lnp&&.....\.......\FN90W.sct&&.....\.......\FN90W_GD130_90W.dep&&.....\.......\key.crf&&.....\.......\key.d&&.....\.......\key.o&&.....\.......\lcd.crf&&.....\.......\lcd.d&&.....\.......\lcd.o&&.....\.......\main.crf&&.....\.......\main.d&&.....\.......\main.o&&.....\.......\startup_stm32f0xx.d&&.....\.......\startup_stm32f0xx.o&&.....\.......\stm32f0xx_adc.crf&&.....\.......\stm32f0xx_adc.d&&.....\.......\stm32f0xx_adc.o&&.....\.......\stm32f0xx_dbgmcu.crf&&.....\.......\stm32f0xx_dbgmcu.d&&.....\.......\stm32f0xx_dbgmcu.o&&.....\.......\stm32f0xx_dma.crf&&.....\.......\stm32f0xx_dma.d&&.....\.......\stm32f0xx_dma.o&&.....\.......\stm32f0xx_exti.crf&&.....\.......\stm32f0xx_exti.d&&.....\.......\stm32f0xx_exti.o&&.....\.......\stm32f0xx_flash.crf&&.....\.......\stm32f0xx_flash.d&&.....\.......\stm32f0xx_flash.o&&.....\.......\stm32f0xx_gpio.crf&&.....\.......\stm32f0xx_gpio.d&&.....\.......\stm32f0xx_gpio.o&&.....\.......\stm32f0xx_i2c.crf
&输入关键字,在本站261万海量源码库中尽情搜索:SSD1306控制器OLED液晶显示模块资料分享,附原理图/PCB/Adruino代码
该设计分享的是控制器模块原理图/PCB源文件/Adruino代码,该OLED-128x64是具有UEXT连接器的低功耗OLED液晶显示模块,低成本,低功耗,高对比度。您可以通过I2C进行控制。所需的电源仅在睡眠模式范围为1 uA,工作模式为200 uA,显示ON模式为7mA。该SSD1306控制器OLED液晶显示模块视图面积为21 x 11 mm。提供4针头,用户可以使用MOD-OLED-128x64与面包板进行焊接。SSD1306控制器OLED液晶显示模块实物截图:SSD1306控制器OLED液晶显示模块电路 PCB板截图:SSD1306控制器OLED液晶显示模块特点: UEXT连接器4 pin头用于面包板27x11 mm尺寸高对比度I2C可控3.3V电源线(4V绝对最大)7 mA电流,显示ON,1uA睡眠模式
电路项目的主要芯片及数据手册
电路相关文件(请在PC端查看下载)
扫码关注电路设计技能
电路城电路折扣劵获取途径:
电路城7~10折折扣劵(全场通用):对本电路进行评分获取;
电路城6折折扣劵(限购≤100元电路):申请成为卖家,上传电路,审核成功后获取。
版权声明:电路城所有电路均源于网友上传或网上搜集,供学习和研究使用,其版权归原作者所有,对可以提供充分证据的侵权信息,本站将在确认后24小时内删除。对本电路进行投诉建议,点击反馈给电路城。
使用说明:直接使用附件资料或需要对资料PCB板进行打样的买家,请先核对资料的完整性,如果出现问题,电路城不承担任何经济损失!
大家都在看:
这是一个基于STM32 的传感器的Demo工程一、板子上集成的传感器有:GP2Y1050&&PM2.5传感器,升级版,可通过串口采集电压。&&Uart接口。HT01&&五合一空气传感器,温度,湿度,CO2浓度,TVOC浓度,HCHO(甲醛)浓度。Uart接口。DHT11&&低成本温湿度传感器,单总线。TSL2561&&可见光传感器,能过滤红外光,使结果接近人眼视觉。I2C总线。二、其他硬件资源:PCF8563&&时钟芯片,高精度,低功耗。I2C总线。板上带有可充电纽扣锂电池,可在有外部电源的情况下充电。GT20L16&&字库芯片,SPI接口。OLED&&0.96寸OLED,SPI接口。三、外接资源:可外接两路NTC电阻。可外接两路5V继电器。四、主控:STM32F103RET6,512KFlash, 64K RAM。晶振使用2520封装16MHz晶振。(体积小,节省空间,成本低)自己建工程的时候别忘记改分频。(附件中的工程已改好)自己不会改可以把Library/CMSIS目录下的:三个文件替换到你工程中即可。五、通信&调试接口:1、调试接口:6P的PH2.0,预留SWD接口和调试串口Uart1。(配套的包含SWD+Uart接口的调试器,之后可能会放出,敬请期待)2、USB接口:工程包含能通过USB更新固件的BootLoader。需要先烧录BootLoader。烧录完成之后,按住Boot键,上电后松手,LED闪烁。此时可发现在电脑上会出现一个200+K的模拟U盘。直接把加密的固件拖到U盘内即可。BootLoader硬件信息:按键:PC7LED:PC6加密程序在附件中。BootLoader和上位机加密程序稍后会放出。使用BootLoader的时候,固件需要更改Offset:0x具体方法,请在工程中查看。(查看main.c的主函数,和工程设置中的target标签页)3、无线通信模块注意:此模块为内部模块,不提供任何资料。如要使用无线通信,请自行替换成相应模块。模块使用Uart接口。六、RTOS工程使用uCOSIII实时操作系统。(初学者,还请各位大牛多指教)
PCB图:实物图:上位机调试信息:八、备注TSL2561排针的线序和模块版本不一样,需要自行调整。切记,不要把元器件烧了。TSL2561排针的线序和模块版本不一样,需要自行调整。切记,不要把元器件烧了。TSL2561排针的线序和模块版本不一样,需要自行调整。切记,不要把元器件烧了。重要的事情说三遍。单片机上放散热片纯粹是为了装逼(▼へ▼メ)哈哈哈哈哈。欢迎交流。
来自:时间:
0.5寸OLED微显示屏驱动电路是之前做的一个产品中的一部分,采用intersil的TW8836为驱动芯片,STM32为控制芯片,实现了SONY的0.5寸微显示屏的驱动,色彩鲜艳,成像细腻。如有疑问,可以在讨论区给我留言。原理图用ORCAD打开,见截图:
来自:时间:
本项目分享的是0.96OLED模块资料,包括OLED液晶屏上位机及应用和STM32 控制代码等。该OLED液晶屏高分辨率(128*64),和12864 LCD相同分辨率,但该OLED 屏的单位面积像素更多。128*64 OLED液晶屏特点:可视角度:大于160°功耗:正常显示时0.06W(远低于TFT显示屏)供电范围:直流3V-5V,直接兼容3.3V和5V供电系统使用2线的I2C接口,一般的IO口模拟I2C也能控制兼容3.3V和5V控制芯片的I/O电平(无需设置,直接兼容)字模制作上位机截图:附件内容截图:
来自:时间:
该多档位电压电流测量系统基于STM32F103和19264液晶屏等设计,用旋转编码开关进行菜单切换不同测量量程。该解决方案附件内容包含原理图及电路板PCB源文件和源代码,保证可用。注意:不提供技术支持。使用说明:1.CH0–CH5档位关联排序: AC0-250V、0-10A、0-50A、0-100A、DC0-350V、0-10ACH6暂时不用,如有需要可以安排相应功能。每一CH路信号都是继电器常开接点2.电压电流信号关联排序:AC0-250V和DC0-350V连接(0-500VAC/DC)AC0-10A、0-50A、0-100A连接(0-100MA)DC0-10A连接(0-75mv)
多档位电压电流测量系统板实物截图:
来自:时间:
orange pi orangepi
gsm 2g gprs 物联网 oled
开发板提供Bigiot物联网平台代码,远程拍照,温度上传。详见视频演示:http://www.lightembedded.com/dokuwiki/doku.php?id=videos淘宝购买链接:https://item.taobao.com/item.htm?spm=a1z38n..0.bX7yc8&id=模块使用视频教程:http://otp70vofb.bkt.clouddn.com/orangepi.mp4模块使用教程:http://wiki.lightembedded.com/dokuwiki/doku.php?id=linux:linux%E4%B8%8Bgprs%E8%81%94%E7%BD%91模块对接物联网平台在线温度采集,远程监控拍照演示:http://wiki.lightembedded.com/dokuwiki/doku.php?id=videos 只要接口符合以下方式的都可以通用:Linux下GPRS拨号上网实验环境
orange pi lite(全志H3)sim800c/sim900a模块(淘宝上卖的有)中国移动物联网卡(9块钱一张)Ubuntu/armbian/debian系统步骤
在板子上安装ppp和chatsudo apt-get install ppp sudo apt-get install chat
编辑拨号文件/etc/ppp/peers/chat-gprs-connectTIMEOUT 15 ABORT '\nDELAYED\r' ABORT '\nBUSY\r' ABORT '\nERROR\r' ABORT '\nNO DIALTONE\r' ABORT '\nNO CARRIER\r' '' \rAT OK ATS0=0 OK ATE0V1 OK AT+CGDCONT=1,"IP","CMNET" OK ATDT*99***1# CONNECT ''
编辑拨号文件/etc/ppp/peers/chat-gprs-disconnectABORT OK ABORT BUSY ABORT DELAYED ABORT "NO ANSWER" ABORT "NO CARRIER" ABORT "NO DIALTONE" ABORT VOICE ABORT ERROR ABORT RINGING TIMEOUT 12 "" \K "" \K "" \K "" +++ATH "" +++ATH "" +++ATH "" ATZ SAY "\nForlinx GPRS Disconnect\n"
编辑拨号文件/etc/ppp/peers/gprsnodetach lock /dev/ttyS1 115200 nocrtscts modem noauth debug nodetach #hide-password usepeerdns noipdefault defaultroute user "" password "" 0.0.0.0:0.0.0.0 ipcp-accept-local ipcp-accept-remote noccp #novj #novjccomp persist connect 'chat -s -v -f /etc/ppp/peers/chat-gprs-connect' disconnect 'chat -s -v -f /etc/ppp/peers/chat-gprs-disconnect'
开启GPRS模块开始拨号sudo pon gprs&
这个时候输入ifconfig会出现ppp0,然后设置路由route add default dev ppp0
然后查看网络是否连接ping www.baidu.com
来自:时间:
猜你喜欢(实时推荐最适合你的电路)
本设计使用 0.96寸 oled作为显示,具有可调时间,可以实现年月日时分秒周的显示,stc89c52作为主控。实验效果图如下:附件内容截图:
来自:时间:
单片机型号是:stm32f103c8t6;编译环境:keil5单片机的RXD,TXD不断的接收字符串数据:$GPGGA,,2,A,44,B,1,09,1.4,35.545,M,11.948,M,,*52进行变换计算,X=24+52.;Y=118+40.;计算sinX,cosX,sinY,cosY;显示sinX+sinY;cosX+cosY;用II2c的oled1306显示计算出来的和
来自:时间:
诺基亚Nokia5110液晶由于价格便宜(淘宝8块钱一个)虽然经历了十几年还是经常可以DIY用到84*48个像素点,采用LCD驱动芯片pcd8544。STM32驱动诺基亚Nokia5110液晶显示包括2个版本:第一版(SPI+DMA 只显示英文)第二版(SPI+DMA 也可以显示图片和中文)附件内容截图:
来自:时间:
这是NRF24L01+OLED+蓝牙 插在电脑USB口 通过上位机 控制 电机8520电池3.7V 600mAH四轴硬件实物图STM32四轴主板电路图STM32四轴遥控PCBSTM32四轴遥控电路图STM32四轴遥控PCB附件包含以下资料
来自:时间:
卖家语:手头有一些空板和已经焊接好的实物,如果有需要的同学可以联系qq(非诚勿扰!)首先说明一下,此电路中存在一个设计BUG,即OLED的数据发送地址和MPU6050IIC的地址是在一起的,起初设计一位OLED可以加入寻址,后来程序出测试后发现不可以,这俩个器件只有一个可以工作(只焊接一个),当然,如果焊接技术厉害,可以把OLED的数据线通飞线到别的IO。本设计由于存在BUG。一下开始进行设计介绍:1 处理器:stm32f103c8t62 硬件构成:MPU6050,OLED12864,CP2102,EEPROM(未焊接),NRF24L01,PS2摇杆X23 功能:留有4.2V锂电池接口,ADC电路实时读取电压,CP2102usb转串口,只要短接BOOT0就可以通过安卓数据线下载,MPU6050六轴姿态传感,可以用于控制小车的姿态或者飞行器,EEPROM硬件寻址,与MPU6050使用同一个IIC,用于存储数据,NRF24L01无线接口,用于遥控使用(附件送测试代码)4 尺寸 10cmX6cm迷你四轴遥控器电路PCB实物截图:测试波形图:
来自:时间:
2017 年 08 月 18日
寒笑绊步颠购买了:
langzi90购买了:
eyjfx购买了:
逸休哥哥购买了:
ADS1993购买了:
The-Script购买了:
HVAJKkln购买了:
ksfksf购买了:
免费下载!
您想购买此电路吗?,上传电路,审核成功后获取电路城6折折扣劵。
6折折扣劵只能购买小于100元(含100元)的电路。豆丁微信公众号
君,已阅读到文档的结尾了呢~~
SSD1306 OLED驱动芯片中文手册
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
SSD1306 OLED驱动芯片中文手册
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口SSD1306 OLED
12864 spi驱动程序 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
SSD1306 OLED
12864 spi驱动程序
<div class=""
stm32驱动的。上次他们给的那个程序有些不好的地方,我稍微修改了一下。
(2.76 MB, 下载次数: 6288)
(682 KB, 下载次数: 1069)
(3.99 KB, 下载次数: 1501)
22:45:53  
281 个讨论
SSD1306 OLED 12864 spi驱动程序
SSD1306 OLED 12864 spi驱动程序
你好&&请问有什么疑问么?
没积分了。。惆怅,正好需要用。能发到我邮箱 ?
额、、、SSD1306 OLED 12864 spi驱动程序
只能靠回复得分了
不过不错。。。
嗯、再顶一个!
加油!再接再厉!
相对于市面上去用STM32模拟SPI,这个是采用集成的SPI很不错哟。
不错,谢谢分享
很不错,正在做,参考了,谢谢
很不错,正在做,参考了,谢谢
谢谢啊,正在做这个,参考了
真的差一点积分,给我下吧
正在做,参考了,谢谢
真的差一点积分,给我下吧
正在学习这个 顶顶贴
真的差一点积分,给我下吧
谢 谢&&分 享。
发帖转积分。。。
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司查看: 4097|回复: 3
STM32实验-SSD1306 OLED显示实验
OLED显示实验 前面所有的介绍都没有涉及到液晶显示,从这一节开始,我们将陆续向大家介绍几款液晶显示模块。本节我们将向大家介绍相对简单的OLED。本节分为如下几个部分:3.9.1 OLED简介3.9.2 硬件设计3.9.3 软件设计3.9.4 下载与测试
1463.9.1 OLED简介 OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。 LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。OLED的尺寸难以大型化,但是分辨率确可以做到很高。这一节,我们使用的是ALINETEK的OLED显示模块,该模块有以下特点: 1)模块有单色和双色两种可选,单色为纯白色,而双色则为黄蓝双色。 2)尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小。 3)高分辨率,该模块的分辨率为128*64。 4)多种接口方式,该模块提供了总共5种接口包括:两种并行接口方式、3线或4线的穿行SPI接口方式,、IIC接口方式(只需要2根线就可以控制OLED了!)。 5)不需要高压,直接接3.3V就可以工作了。 这里要提醒大家的是,该模块不和5.0V接口兼容,所以请大家在使用的时候一定要小心,别接到5V的系统上去,否则可能烧坏模块。以上5种模式通过模块的BS0~2设置,BS0~2的设置与模块接口模式的关系如下表:
& && && && && &&&表3.9.1.1 OLED模块接口方式设置表
上表中:“1”代表接VCC,而“0”代表接GND。 该模块的外观图如下: 图3.9.1.1 ALIENTEK OLED模块外观图
模块的原理图如下:图3.9.1.2 ALIENTEK OLED模块原理图
该模块采用8*2的2.54排针与外部连接,其引线图如上图所示,总共有16个管脚,在16条线中,我们只用了15条,有一个是悬空的。15条线中,电源和地线占了2条,还剩下13条信号线。在不同模式下,我们需要的信号线数量是不同的,在8080模式下,需要全部13条,而在IIC模式下,仅需要2条线就够了!这其中有一条是共同的,那就是复位线RST(RES),该线我们可以直接接在MCU的复位上(要先确认复位方式一样),这样可以省掉一条线。 ALIENTEK OLED模块的控制器是SSD1306,这一节,我们将学习如何通过STM32来控制该模块显示字符和数字,本节实例将可以支持2种方式与OLED模块连接,一种是8080的并口方式,另外一种是4线SPI方式。 首先我们介绍一下模块的8080并行接口,8080并行接口的发明者是INTEL,该总线也被广泛应用于各类液晶显示器,ALIENTEK OLED模块也提供了这种接口,使得MCU可以快速的访问OLED。ALIENTEK OLED模块的8080接口方式需要如下一些信号线:
CS:OLED片选信号。&&WR:向OLED写入数据。&&RD:从OLED读取数据。&&D[7:0]:8位双向数据线。&&RST(RES):硬复位OLED。 DC:命令/数据标志(0,读写命令;1,读写数据)。 模块的8080并口读/写的过程为:先根据要写入/读取的数据的类型,设置DC为高(数据)/低(命令),然后拉低片选,选中SSD1306,接着我们根据是读数据,还是要写数据置RD/WR为低,然后: 在RD的上升沿, 使数据锁存到数据线(D[7:0])上; 在WR的上升沿,使数据写入到SSD1306里面; SSD并口写时序图如下: 图3.9.1.3&&8080并口写时序图SSD并口读时序图如下:图3.9.1.4&&8080并口读时序图SSD接口方式下,控制脚的信号状态所对应的功能如下表:表3.9.1.2&&控制脚信号状态功能表 在8080方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命(Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始,才是我们真正要读的数据。 一个典型的读显存的时序图,如下图所示:图3.9.1.5&&读显存时序图 可以看到,在发送了列地址之后,开始读数据,第一个是Dummy Read,也就是假读,我们从第二个开始,才算是真正有效的数据。 并行接口模式就介绍到这里,我们接下来介绍一下4线串行(SPI)方式,4先串口模式使用的信号线有如下几条: CS:OLED片选信号。 RST(RES):硬复位OLED。 DC:命令/数据标志(0,读写命令;1,读写数据)。 SCLK:串行时钟线。在4线串行模式下,D0信号线作为串行时钟线SCLK。SDIN:串行数据线。在4线串行模式下,D1信号线作为串行数据线SDIN。 模块的D2需要悬空,其他引脚可以接到GND。在4线串行模式下,只能往模块写数据而不能读数据。
在4线SPI模式下,每个数据长度均为8位,在SCLK的上升沿,数据从SDIN移入到SSD1306,并且是高位在前的。DC线还是用作命令/数据的标志线。在4线SPI模式下,写操作的时序如下:
& && && && &&&图3.9.1.6&&4线SPI写操作时序图 4线串行模式就为大家介绍到这里。其他还有几种模式,在SSD1306的数据手册上都有详细的介绍,如果要使用这些方式,请大家参考该手册。 接下来,我们介绍一下模块的显存,SSD1306的显存总共为128*64bit大小,SSD1306将这些显存分为了8页,其对应关系如下:表3.9.1.3&&SSD1306显存与屏幕对应关系表 可以看出,SSD1306的每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。因为每次写入都是按字节写入的,这就存在一个问题,如果我们使用只写方式操作模块,那么,每次要写8个点,这样,我们在画点的时候,就必须把要设置的点所在的字节的每个位都搞清楚当前的状态(0/1?),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显示了。这个问题在能读的模式下,我们可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进GRAM,这样就不会影响到之前的状况了。但是这样需要能读GRAM,对于3线或4线SPI模式,模块是不支持读的,而且读-&改-&写的方式速度也比较慢。 所以我们采用的办法是在STM32的内部建立一个OLED的GRAM(共128个字节),在每次修改的时候,只是修改STM32上的GRAM(实际上就是SRAM),在修改完了之后,一次性把STM32上的GRAM写入到OLED的GRAM。当然这个方法也有坏处,就是对于那些SRAM很小的单片机(比如51系列)就比较麻烦了。 SSD1306的命令比较多,这里我们仅介绍几个比较常用的命令,这些命令如下表:表3.9.1.4&&SSD1306常用命令表第一个命令为0X81,用于设置对比度的,这个命令包含了两个字节,第一个0X81为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。 第二个命令为0XAE/0XAF。0XAE为关闭显示命令;0XAF为开启显示命令。 第三个命令为0X8D,该指令也包含2个字节,第一个为命令字,第二个为设置值,第二个字节的BIT2表示电荷泵的开关状态,该位为1,则开启电荷泵,为0则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。 第四个命令为0XB0~B7,该命令用于设置页地址,其低三位的值对应着GRAM的页地址。第五个指令为0X00~0X0F,该指令用于设置显示时的起始列地址低四位。 第六个指令为0X10~0X1F,该指令用于设置显示时的起始列地址高四位。 其他命令,我们就不在这里一一介绍了,大家可以参考SSD1306 datasheet的第28页。从这页开始,对SSD1306的指令有详细的介绍。 最后,我们再来介绍一下OLED模块的初始化过程,SSD1306的典型初始化框图如下图所示:图3.9.1.7&&SSD1306初始化框图 驱动IC的初始化代码,我们直接使用厂家推荐的设置就可以了,只要对细节部分进行一些修改,使其满足我们自己的要求即可,其他不需要变动。 OLED的介绍就到此为止,我们重点向大家介绍了ALIENTEK OLED模块的相关知识,接下来我们将使用这个模块来显示字符和数字。通过以上介绍,我们可以得出OLED显示需要的相关设置步骤如下: 1)设置STM32与OLED模块相连接的IO。这一步,先将我们与OLED模块相连的IO口设置为输出,具体使用哪些IO口,这里需要根据连接电路以及OLED模块所设置的通讯模式来确定。这些将在硬件设计部分向大家介绍。 2)初始化OLED模块。其实这里就是上面的初始化框图的内容,通过对OLED相关寄存器的初始化,来启动OLED的显示。为后续显示字符和数字做准备。 3)通过函数将字符和数字显示到OLED模块上。这里就是通过我们设计的程序,将要显示的字符送到OLED模块就可以了,这些函数将在软件设计部分向大家介绍。 通过以上三步,我们就可以使用ALIENTEK OLED模块来显示字符和数字了,在后面我们还将会给大家介绍显示汉字的方法。这一部分就先介绍到这里。
3.9.2硬件设计
OLED模块的电路在上一节已有详细说明了,这里我们介绍OLED模块与ALIETEK MiniSTM32开发板的连接,MiniSTM32开发板地板的LCD接口和ALIENTEK OLED模块直接可以对插,连接如下图:
& && && &&&图3.9.2.1&&OLED模块与开发板连接示意图 图中绿色线圈出来的部分就是连接OLED的接口,这里在硬件上,OLED与MiniSTM32开发板的IO口对应关系如下: OLED_CS对应PC9;&&OLED_RS对应PC8;&&OLED_WR对应PC7;&&OLED_RD对应PC6; & && && && && &OLED_D[7:0]对应PB[7:0]; 这些线的连接,MiniSTM32的内部已经连接好了,我们只需要将OLED模块插上去就好了。实物连接如下图所示:图3.9.2.2&&OLED模块与开发板连接实物图
3.9.3软件设计
软件设计我们依旧在之前的工程上面增加,首先在HARDWARE文件夹下新建一个OLED的文件夹。然后打开USER文件夹下的工程,新建一个oled.c的文件和oled.h的头文件,保存在OLED文件夹下,并将OLED文件夹加入头文件包含路径。 打开oled.c,输入如下代码:#include &oled.h&
#include &stdlib.h&
#include &font.h&& &&&
#include &delay.h&
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127&&
//[1]0 1 2 3 ... 127&&
//[2]0 1 2 3 ... 127&&
//[3]0 1 2 3 ... 127&&
//[4]0 1 2 3 ... 127&&
//[5]0 1 2 3 ... 127&&
//[6]0 1 2 3 ... 127&&
//[7]0 1 2 3 ... 127& && &
u8 OLED_GRAM[128][8];& &
//更新显存到LCD& &
void OLED_Refresh_Gram(void)
& && && && && &{
& && && && && &u8 i,n;& && &
for(i=0;i&8;i++)& &
{& &
& && && && && && && && && && &LED_WR_Byte (0xb0+i,OLED_CMD);& & //设置页地址(0~7)& &
OLED_WR_Byte (0x02,OLED_CMD);& && &//设置显示位置—列低地址,偏移了2列
& && && && && && && && && && &LED_WR_Byte (0x10,OLED_CMD);& && &//设置显示位置—列高地址& && &
for(n=0;n&128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);& &
}& &
#if OLED_MODE==1
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
& && && && && && && && && && && && && && & DATAOUT(dat)& && &
OLED_RS=
OLED_CS=0;& &
OLED_WR=0;& &
OLED_WR=1;&&
OLED_CS=1;& &&&
OLED_RS=1;
& && && && && && && && && & }
& && && && &#else
//SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{& &
u8& && &
OLED_RS= //写命令& &
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;& && &
}&&
#endif
//开启OLED显示& &&&
void OLED_Display_On(void)
OLED_WR_Byte(0X8D,OLED_CMD);&&//SET DCDC命令&&
OLED_WR_Byte(0X14,OLED_CMD);&&//DCDC ON&&
OLED_WR_Byte(0XAF,OLED_CMD);&&//DISPLAY ON
//关闭OLED显示& && &
void OLED_Display_Off(void)
& && && && && &OLED_WR_Byte(0X8D,OLED_CMD);&&//SET DCDC命令&&
OLED_WR_Byte(0X10,OLED_CMD);&&//DCDC OFF&&
OLED_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();//更新显示
//画点&&
//x:0~127
//t:1 填充 0,清空& && &&&
void OLED_DrawPoint(u8 x,u8 y,u8 t)
& && && && && &u8 pos,bx,temp=0;
& && && && && &if(x&127||y&63)//超出范围了.&&
pos=7-y/8;&&
bx=y%8;
& && && && && &temp=1&&(7-bx);
& && && && && &if(t)OLED_GRAM[x][pos]|=&&
else OLED_GRAM[x][pos]&=~& && &
}
//x1,y1,x2,y2 填充区域的对角坐标
//确保x1&=x2;y1&=y2 0&=x1&=127 0&=y1&=63& &
//dot:0,清空;1,填充& &
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();//更新显示 }
//在指定位置显示一个字符,包括部分字符
//x:0~127 //y:0~63
//mode:0,反白显示;1,正常显示& && &
//size:选择字体 16/12
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{& && && && && &
u8 temp,t,t1;&&
u8 y0=y;&&chr=chr-' ';//得到偏移后的值& && && &&&
for(t=0;t&t++)
{& &
& && && && && && && && && && && && && && &&&if(size==12)temp=asc2_1206[chr][t];&&//调用1206字体& &
else temp=asc2_1608[chr][t];& &//调用1608字体& &
for(t1=0;t1&8;t1++)& &
{
& && && && && && && && && && && && && && && &if(temp&0x80)OLED_DrawPoint(x,y,mode);& &
else OLED_DrawPoint(x,y,!mode);& &
temp&&=1;& &
& && && && && && && && && && && && && && && &if((y-y0)==size)& &
{& &&&
y=y0;& &&&
x++;& &&&
& &
}& &
}& && && &
}& && && &&&
}
u32 mypow(u8 m,u8 n)
u32 result=1;& &
while(n--)result*=m;& &&&
//显示2个数字
//x,y :起点坐标& &
//len :数字的位数
//size:字体大小
//mode:模式 0,填充模式;1,叠加模式
//num:数值(0~);&&
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{& && && && &
u8 t,&&
u8 enshow=0;& && && &&&
for(t=0;t&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);
}else enshow=1;& && && &
OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1);& &} }&&
//显示字符串
//x,y:起点坐标& &
//*p:字符串起始地址
//用16字体
void OLED_ShowString(u8 x,u8 y,const u8 *p)
#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58& && && && && &
while(*p!='\0')& &&&
{& && &&&
& && &&&if(x&MAX_CHAR_POSX){x=0;y+=16;}
& && &&&if(y&MAX_CHAR_POSY){y=x=0;OLED_Clear();}& && && &
OLED_ShowChar(x,y,*p,16,1);& && && &&&
x+=8;& && && &
p++;& &&&
}& &
}& &&&
//初始化SSD1303& && &
void OLED_Init(void)
{& && && && && && && &
RCC-&APB2ENR|=1&&3;& & //使能PORTB时钟& &
RCC-&APB2ENR|=1&&4;& & //使能
PORTC时钟& &&&#if OLED_MODE==1& && &&&
RCC-&APB2ENR|=1&&0;& & //开启辅助时钟& && &
AFIO-&MAPR=0X; //关闭JTAG&&
& && && && && && && && && &&&GPIOB-&CRL=0X;&&GPIOB-&ODR|=0XFFFF;& && && && && &&&
& && && && && && && && && && &GPIOC-&CRH&=0XFFFFFF00;&&
GPIOC-&CRL&=0X00FFFFFF;& &
GPIOC-&CRH|=0X;&&
GPIOC-&CRL|=0X;&&
GPIOC-&ODR|=0X03C0;
& && && && && && && && && &&&GPIOB-&CRL&=0XFFFFFF00;
GPIOB-&CRL|=0XF0000033;&&
GPIOB-&ODR|=0X03;&&
& && && && && && && && && && &GPIOC-&CRH&=0XFFFFFF00;& && &
GPIOC-&CRH|=0X;& &
GPIOC-&ODR|=3&&8;
#endif& && && &
//OLED_RST=0;&&
//delay_ms(100);
//OLED_RST=1;&&
& && && && && && && && && &&&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_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.& && && && && && &&&
OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置&&
OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭&&
OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
& && && && && && && && && &&&OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
& && && && && && && && && &&&OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0-&0;1,0-&127;&&
OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]-&COM0;N:驱动路数
& && && && && && && && && &&&OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置&&
OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置& &&&
& && && && && && && && && &&&OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)&&
OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
& && && && && && && && && &&&OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;&&
OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率&&
OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*001,0.77*011,0.83*&&
& && && && && && && && && &&&OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
& && && && && && && && && &&&OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示& && && && && &
& && && && && && && && && &&&OLED_WR_Byte(0xAF,OLED_CMD); //开启显示
OLED_Clear(); }& &
这里代码明显比之前的例程多了,函数也比较多,这里我们仅针对几个比较重要的函数进行介绍。
首先要介绍的是我们定义在STM32内部的GRAM,u8 OLED_GRAM[128][8];此部分GRAM对应OLED模块上的GRAM。在操作的时候,我们只要修改STM32内部的GRAM就可以了,然后通过OLED_Refresh_Gram函数把GRAM一次刷新到OLED 的GRAM上。该函数代码如下:
void OLED_Refresh_Gram(void)
& && && && && &u8 i,n;& && &&&
for(i=0;i&8;i++)& & {& &
OLED_WR_Byte (0xb0+i,OLED_CMD);//设置页地址(0~7)& &
OLED_WR_Byte (0x02,OLED_CMD); //设置显示位置—列低地址,偏移了2列& &
OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址& && &
for(n=0;n&128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);&&
& && && && && &}& &
函数先设置页地址,然后写入列地址(也就是纵坐标),然后从0开始写入128个字节,写满该页,最后循环把8页的内容都写入,就实现了整个从STM32显存到OLED显存的拷贝。这里写列地址的时候,偏移了2个列,是因为SSD1306和OLED模块的连接硬件连接所致,这里我们不需要关心,记住SSD1306的2就对应OLED的0,就可以了。
OLED_Refresh_Gram函数还用到了一个外部函数OLED_WR_Byte,该函数直接和硬件相关,该函数代码如下:
#if OLED_MODE==1&&
void OLED_WR_Byte(u8 dat,u8 cmd)
& && && && && &DATAOUT(dat);& && &&&
OLED_RS=&&
OLED_CS=0;& && &
OLED_WR=0;& &
OLED_WR=1;&&
OLED_CS=1;& &&&
OLED_RS=1;& &
}& && && && &
#else&&
void OLED_WR_Byte(u8 dat,u8 cmd)
{& &
u8& && &
& && && && && &OLED_RS=& &//写命令& &
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;& && &
}&&
#endif 复制代码
这里有2个一样的函数,通过宏定义OLED_MODE来决定使用哪一个。如果OLED_MODE=1,就定义为并口模式,选择第一个函数,而如果为0,则为4线串口模式,选择第二个函数。这两个函数输入参数均为2个:dat和cmd,dat为要写入的数据,cmd则表明该数据是命令还是数据。这两个函数的时序操作就是根据上面我们对8080接口以及4线SPI接口的时序来编写的。 OLED_GRAM[128][8]中的128代表列数,也就是x坐标,而8代表的是页,每个代表8个列,从高到底对应列数从小到大。比如,我们要在x=100,y=29这个点写入1,则可以用这个句子实现: & && &OLED_GRAM[100][4]|=1&&2; 一个通用的在点(x,y)置1表达式为:& && & OLED_GRAM[x][y/8]|=1&&(7-y%8); 因此,我们可以得出下一个画点函数,void OLED_DrawPoint(u8 x,u8 y,u8 t);代码如下: void OLED_DrawPoint(u8 x,u8 y,u8 t) {
u8 pos,bx,temp=0;
if(x&127||y&63)//超出范围了.&&pos=7-y/8;&&bx=y%8; & && && && && &temp=1&&(7-bx);
if(t)OLED_GRAM[x][pos]|=&&else OLED_GRAM[x][pos]&=~& && &} 该函数有3个参数,前两个是坐标,第三个t为要写入1还是0。该函数实现了我们在OLED模块上任意位置画点的功能。&&在介绍完画点函数之后,我们介绍一下显示字符函数,OLED_ShowChar,在介绍之前,我们来介绍一下字符(ASCII字符集)是怎么显示在OLED模块上去的。要显示字符,我们先要有字符的点阵数据,ASCII常用的字符集总共有95个,从空格符开始,分别为:!&#$%&'()*+,-:;&=&?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~. 我们先要得到这个字符集的点阵数据,这里我们介绍一个款很好的字符提取软件:PCtoLCD2002完美版。该软件可以提供各种字符,包括汉字(字体和大小都可以自己设置)阵提取,且取模方式可以设置好几种,常用的取模方式,该软件都支持。该软件还支持图形模式, 也就是用户可以自己定义图片的大小,然后画图,根据所画的图形再生成点阵数据,这功能在制作图标或图片的时候很有用。 该软件的界面如下:图3.9.3.1&&PCtoLCD2002软件界面 然后我们选择设置,在设置里面设置取模方式入下图所示:
& && && && && &&&图3.9.3.2&&设置取模方式 上图设置的取模方式,在右上角的取模说明里面有,即:从第一列开始向下每取8个点作为一个字节,如果最后不足8个点就补满8位。取模顺序是从高到低,即第一个点作为最高位。如*-------取为。其实就是按如下这种方式:图3.9.3.3&&取模方式图解 从上到下,从左到右,高位在前。我们按这样的取模方式,然后把ASCII字符集按12*6大小和16*0大小取模出来(对应汉字大小为12*12和16*16,字符的只有汉字的一半大!),保存在font.h里面,每个12*6的字符占用12个字节,每个16*8的字符占用16个字节。具体见font.h部分代码(该部分我们不再这里列出来了,请大家参考光盘里面的代码)。 在知道了取模方式之后,我们就可以根据取模的方式来编写显示字符的代码了,这里我们针对以上取模方式的显示字符代码如下:&&void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode) {& && && && && &u8 temp,t,t1;&&u8 y0=y;&&chr=chr-' ';//得到偏移后的值& && && && &for(t=0;t&t++)& &&&{& & &&if(size==12)temp=asc2_1206[chr][t];&&//调用1206字体& &else temp=asc2_1608[chr][t];& &//调用1608字体& && && && && && && && && && && && & 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++;& &&&& & }& &}& && && &}& && && &&&} 该函数为字符以及字符串显示的核心部分,函数中chr=chr-' ';这句是要得到在字符点阵数据里面的实际地址,因为我们的取模是从空格键开始的,例如asc2_],代表的是空格键的点阵码。在接下来的代码,我们也是按照从上到小,从左到右的取模方式来编写的,先得到最高位,然后判断是写1还是0,画点;接着读第二位,如此循环,直到一个字符的点阵全部取完为止。这其中涉及到列地址和行地址的自增,根据取模方式来理解,就不难了。 最后,我们介绍一下初始化函数,void OLED_Init(void),该函数代码比较长,我们就不列出来了,见上面oled.c代码部分。 该函数的结构比较简单,开始是对IO口的初始化,这里我们也是用了宏定义OLED_MODE来决定要设置的IO口,其他就是一些初始化序列了,我们按照厂家提供的资料来做就可以。最后要说明一点的是,因为OLED是无背光的,在初始化之后,我们把显存都清空了,所以我们在屏幕上是看不到任何内容的,跟完全通电一个样,不要以为这就是初始化失败,要写入数据模块才会显示的。 oled.c的内容就为大家介绍到这里,将oled.c保存,然后加入到HARDWARE组下。接下来我们在oled.h中输入如下代码: #ifndef __OLED_H #define __OLED_H& && & #include &sys.h& #include &stdlib.h&& && &&&//OLED模式设置 //0:4线串行模式 //1:并行8080模式 #define OLED_MODE 1& && && && && & //-----------------OLED端口定义----------------& && && &&&#define OLED_CS PCout(9) //#define OLED_RST&&PBout(14)//在MINISTM32上直接接到了STM32的复位脚!
#define OLED_RS PCout(8) #define OLED_WR PCout(7)& &&&#define OLED_RD PCout(6)&&//PB0~7,作为数据线 #define DATAOUT(x) GPIOB-&ODR=(GPIOB-&ODR&0xff00)|(x&0x00FF); //输出& & //使用4线串行接口时使用&&#define OLED_SCLK PBout(0) #define OLED_SDIN PBout(1)& && && &
#define OLED_CMD&&0 //写命令 #define OLED_DATA 1 //写数据 //OLED控制用函数 void OLED_WR_Byte(u8 dat,u8 cmd);& && &void OLED_Display_On(void); void OLED_Display_Off(void); void OLED_Refresh_Gram(void);& && && && && && && &&&
void OLED_Init(void); & && && && && && && && && &&&void OLED_Clear(void); void OLED_DrawPoint(u8 x,u8 y,u8 t); void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot); void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size); void OLED_ShowString(u8 x,u8 y,const u8 *p);& &#endif& &该部分比较简单,OLED_MODE的定义也在这个文件里面,我们必须根据自己OLED模块BS0~2的设置(仅支持8080和4线SPI)来确定OLED_MODE的值。 保存好oled.h之后,我们就可以在主程序里面编写我们的应用层代码了,该部分代码如下: int main(void) {& &&&u8 t=0;& && && &Stm32_Clock_Init(9); //系统时钟设置&&delay_init(72);& && &//延时初始化&&uart_init(72,9600);&&//串口初始化& &LED_Init();& && &//初始化与LED连接的硬件接口&&& && && && && && && && && && && && && && & OLED_Init();& &//初始化液晶& && && &OLED_ShowString(0,0, &0.96' OLED TEST&);& &&&OLED_ShowString(0,16,&ATOM@ALIENTEK&);& &&&OLED_ShowString(0,32,&&);& & & && && && && && && && && && && && && && &&&OLED_ShowString(0,48,&ASCII:&);& &&&OLED_ShowString(63,48,&CODE:&);& & OLED_Refresh_Gram();&& t=' ';& && && && && && &while(1)& &{& && && && && && && && && && && &OLED_ShowChar(48,48,t,16,1);//显示ASCII字符& && & OLED_Refresh_Gram();& &t++; & && && && && && && && && && &(t&'~')t=' '; & && && && && && && && && && &ED_ShowNum(103,48,t,3,16);//显示ASCII字符的码值& & delay_ms(300);& &LED0=!LED0;&&}& & } 该部分代码用于在OLED上显示一些字符,然后从空格键开始不停的循环显示ASCII字符集,并显示该字符的ASCII值。注意在test.c文件里面包含oled.h头文件,同时把oled.c文件加入到HARDWARE组下,然后我们编译此工程,直到编译成功为止。
3.9.4 下载与测试
将代码下载到MiniSTM32后,可以看到DS0不停的闪烁,提示程序已经在运行了。同时可以看到OLED模块显示如下内容:
&&& && && && && &图3.9.4.1&&OLED显示内容
图3.9.4.2&&OLED显示效果 最后一行不停的显示ASCII字符以及其码值。通过这一节的学习,我们学会了ALIENTEK OLED模块的使用,在调试代码的时候,又多了一种显示信息的途径,在以后的代码中,大家可以好好利用。
完整的Word格式文档51黑下载地址:
(1.37 MB, 下载次数: 9)
16:16 上传
点击文件名下载附件
下载积分: 黑币 -5
不错,不错,等晚上回去就弄一下试试
现在都用STEMWIN了
谢谢楼主,很实用!!
Powered by

我要回帖

更多关于 ssd安全擦除指令 的文章

 

随机推荐