OLED显示驱动
<div class='showpostmsg'><p>将OLED驱动完善了一下,可以支持多种字体显示,目前支持:</p><ul>
<li>6x8</li>
<li>8x16</li>
<li>12x24</li>
<li>16x32</li>
</ul>
<p> </p>
<p></p>
<p><strong>驱动程序:</strong></p>
<p>**** Hidden Message *****</p>
<p><br />
<b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">dcexpert</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b></p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p> <strong>Demo</strong></p>
<pre>
<code class="language-python">from machine import I2C, Pin
from oled import OLED12864_I2C
i2c = I2C(-1, scl = Pin(27, pull = Pin.PULL_UP), sda = Pin(13, pull = Pin.PULL_UP))
oled = OLED12864_I2C(i2c)
oled.text(0, 0, '0123456789')
oled.Font('Font_8x16')
oled.text(0, 1, '0123456789')
oled.Font('Font_12x24')
oled.text(0, 3, '0123456789')</code></pre>
<p> </p>
<p>各路大神各显神通</p>
<p>谢谢,特意注册来看看</p>
stategrid 发表于 2020-2-4 16:44
谢谢,特意注册来看看
<p>欢迎一起学习交流</p>
<p>好东西就得收藏</p>
<p>OLED显示驱动 [<a href="javascript:;" onclick="display('subjecthide');display('subjectbox');$('subject').value='RE: OLED显示驱动'">修改</a>]</p>
<table cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td>
<p>好东西就得學習收藏</p>
</td>
</tr>
</tbody>
</table>
<p>对代码的一些解析,我是菜鸟加外行,请大家指教</p>
<p>首先这个屏幕分辨率是128*64,点阵显示方式从def text_6x8看是从左到右,横坐标扫描到128后就转下一行的起点即x=0,y+1.</p>
<p>x > 120而不是 x > 126,我认为是为了避免超出范围?</p>
<p>然后这些显示屏的显示方式是开辟一个缓冲区,有些是在显示屏的控制器,有些是mcu的内存,还有些是两者都有。缓冲区的大小和屏幕一样128*64,即对应屏幕每个点。</p>
<p>通过改写缓冲区,把改写结果送到硬件接口,就可以显示字符。</p>
<p>接下来就是从font里寻找对应的字符位置,看要改写那些内容。这部分代码看不明白</p>
<p> def char_6x8(self, x=0, y=0, ch=32, c=1):<br />
try:<br />
ind = x + y * 128 + 1<br />
n = (min(127, max(ord(ch), 32)) -32)*5<br />
for i in range(5):<br />
screen = Font_6x8 if c else Font_6x8^0xFF<br />
screen = 0 if c else 0xFF<br />
self.set_pos(x, y)<br />
self.i2c.writeto(self.ADDR, b'\x40' + screen)<br />
except:<br />
return</p>
<p> </p>
<p>def text_6x8(self, x=0, y=0, s='', c=1, wrap=0):<br />
for i in range(len(s)):<br />
self.char(x, y, s, c)<br />
x += 6<br />
if wrap and x > 120:<br />
x = 0<br />
y += 1</p>
<p>看看这个好不好用</p>
stategrid 发表于 2020-2-8 04:58
对代码的一些解析,我是菜鸟加外行,请大家指教
首先这个屏幕分辨率是128*64,点阵显示方式从def text_6 ...
<p>使用i2c或spi方式时,因为不能读取oled内部缓存数据,所以需要在外部开一个128x64/8=1024字节的缓冲区。</p>
<p> </p>
<p>因为字体不大,直接放入ram中,速度比较快。如果显示中文,字库较大,最好就放在flash中,或者用专用字库芯片。</p>
<p>厉害了。学习一下</p>
<p>谢谢分享</p>
谢谢大佬,学习学习 <table cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td>
<p>好东西就得收藏</p>
</td>
</tr>
</tbody>
</table>
<p>学习</p>
<p>看看什么情况</p>
<p>学习</p>
<p>看看学习下</p>
<p> </p>
<p>谢谢楼主分享了</p>