电子电路

ssd1306显示汉字

屏幕快照 2019-10-06 下午3.54.53.png

我是利用avr来驱动的,关于avr如何连接ssd1306。大家可以翻看手册,能够更好的理解。这里我选择的是IIC的连线方式,所以ssd1306的D1和D2我连在一起了,这也是手册里推荐的方式。

这里我选择的编译器是bascom,听说AVR STUDIO更好并且免费。bascom是收费的,所以使用前你需要购买,网上的破解版我基本上都有尝试,基本上无法使用,因为版本太低。高版本的只提供demo只能编译4K一般够用。

由于内部的驱动方式,什么屏幕点亮,清理内存,复位屏幕。等等一些操作,如果你的线连接的方式对,那么bascom会自动帮你整好整个这一套流程,不然你就得按照手册一步一步去操作。代码直接使用bascom官网提供的:

'-------------------------------------------------------------------------------
'                       SSD1306-I2C.BAS
'                     (c) MCS Electronics 1995-2015
'          Sample to demo the 128x64 I2C OLED display
'
'-------------------------------------------------------------------------------
$regfile = "m88pdef.dat"
$hwstack = 32
$swstack = 32
$framesize = 32
$crystal = 8000000
Config Clockdiv = 1                                         ' make sure the chip runs at 8 MHz
 
Config Scl = Portc.5                                       ' used i2c pins
Config Sda = Portc.4
Config Twi = 400000                                         ' i2c speed
 
I2cinit
$lib "i2c_twi.lbx"                                         ' we do not use software emulated I2C but the TWI
$lib "glcdSSD1306-I2C.lib"                                 ' override the default lib with this special one
 
#if _build < 20784
Dim ___lcdrow As Byte , ___lcdcol As Byte                 ' dim these for older compiler versions
#endif
 
Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
Cls
Setfont Font8x8tt                                           ' select font
 
Lcdat 1 , 1 , "BASCOM-AVR"
Lcdat 2 , 10 , "1995-2015"
Lcdat 8 , 5 , "MCS Electronics" , 1
Waitms 3000
 
Showpic 0 , 0 , Plaatje
 
End
 
 
$include "font8x8TT.font"                                   ' this is a true type font with variable spacing
 
 
Plaatje:
  $bgf "ks108.bgf"                                         ' include the picture data

这里的glcdSSD1306-I2C.lib库就是一个封装好的ssd1306库。如果你大致能看懂的话,那么你可以继续看,如果不行的话,那就去查些资料吧。首先要知道一点,一个汉字或者字符显示在屏幕上有这么几个要素,宽度,高度,块大小(字体)。这些东西可以去看字体方面的知识点。还有阴码,阳码,扫描方式。bascom显示字符利用了一个叫做font的字体文件,这个文件加载后你就可以使用其中的文字内容。注意它虽然叫做font但是它不是原来windows上理解的这种字体。这种概念要有。

bascom生成这种文件有两种方式:

1、ide本身的font edit 

2、Bascom AVR Font Converter

这两种方式都可以,我推荐第二个。因为它可以生成不同宽度高度和块的font文件,并且它是一键生成的方式(购买后的情况下)。

格式说明:

A font file is a plain text file.

Lets have a look at the first few lines of the 8x8 font:


Font8x8:

$asm

.db 1,8,8,0

.db 0,0,0,0,0,0,0,0 ;

.db 0,0,6,95,6,0,0,0 ; !


The first line contains the name of the font. With the SETFONT statement you can select the font. Essential, this sets a data pointer to the location of the font data.

The second line ($ASM) is a directive for the internal assembler that asm code will follow.

All other lines are data lines.

The third line contains 4 bytes: 1 (height in bytes of the font) , 8 (width in pixels of the font), 8 (block size of the font) and a 0 which was not used before the 'truetype' support, but used for aligning the data in memory. This because AVR object code is a word long.

This last position is 0 by default. Except for 'TrueType' fonts. In BASCOM a TrueType font is a font where every character can have it's own width. The letter 'i' for example takes less space then the letter 'w'. The EADOG128 library demonstrates the TrueType option.

In order to display TT, the code need to determine the space at the left and right of the character. This space is then skipped and a fixed space is used between the characters. You can replace the 0 by the width you want to use. The value 2 seems a good one for small fonts.

All other lines are bytes that represent the character.

看不懂的话直接右键翻译,知道这些后你还是无法显示汉字,因为你不知道怎么去索引font的汉字位置,我也是翻来翻去看到的。打开ide的font edit。你会发现一个ascii。

屏幕快照 2019-10-06 下午4.12.45.png

可以看到有32和33,所以直接lcdat 1,1,chr(32)就可以索引到“王”这个汉字

整个代码

Cls
Setfont Font16x16
Lcdat 0,0,chr(32);
Setfont Font8x8tt 
Lcdat 8,16, "And" 
Setfont Font16x16
Lcdat 0,16+8+8+8-3,chr(33);
Setfont Font8x8tt 
Lcdat 8,16+8+8+8-3+16, "PCB"
Waitms 3500
Cls

批量制作汉字的话可以利用PCtoLcd,配置模式如下:

屏幕快照 2019-10-06 下午4.15.21.png

这是ssd1306芯片的取模方式的配置。其他的需要自己看手册。这样就会生成db代码。然后把db代码放到一个font文件里,载入到font edit 就可以看到效果。 如果遇到错误建议删除空行。

关于集成电路IO引脚电平

具体的IO引脚的实现可以百度,有很多电路图,会用到场效应管和其它元器件来实现IO接口。这里讨论的是IO输入和输出高电平。特别是对电平的一些理解。

IO引脚有两种模式:输入输出。

输入:外部到单片机内部

输出:单片机内部到外部

IO一般输入输出指的是电平输入输出。

电平的解释:两点的电功率或者电压之比的对数。

电压:两点间的电势或者电位的差。(实际很好理解,一个电源一个电阻串联,测电阻两端电压是多少,根据欧姆定律很容易算出。电压就是我们正常生活中的,只不过概念理解起来很多。涉及到一个又一个细小概念分支)

电位:又叫做电势或电位,单位是V。(涉及到静电学和电动力学,自行百度。)

电功率:电流在单位时间内所做的功,单位:瓦特 简称:瓦 符号:W 表示方式:P(公式上)

电能:电流以各种形式做功的能力,单位:度 学名:KW.H 也就是一小时消耗多少千瓦。

电功率和电能看这容易混淆,学校的知识我也忘得差不多了,百度了很多,发现有一个解释比较容易理解。

电能是路程,电功率是速度。一个人一个小时可以跑100米这是速度,而这100米是路程。某元器件的电能是100电能,那么在一个小时内他可以产生100K的电功率。在两个小时就是200K的电功率。

对数:幂的逆运算。比如2的3次方是8。那么8以2为底的对数就是3。

电平也分为高电平和低电平,高电平代表:1,低电平代表:0。由于1和0是二进制,所以就可以组成一些运算,比如逻辑门:非门、或门、与门等。高电平是大于3v,低电平是小于1.5v而1.5-3v之间的是中间电平,一般不做处理。

高低电平用方形图表示

屏幕快照 2019-09-23 上午12.53.40.png

由于是连续的产生电压或者电功率所以电平也是连续的,方形图表示的话也会是一直连续下去这里只给出一个,连续的方形图也可以叫做脉冲。这里引出一个概念叫做总线,总线可以用来传输数据,具体的实现方式实际也是利用电平。视频资料:https://www.bilibili.com/video/av7230090?from=search&seid=5145470121650526078。还有一点,图形上看着是直棱直角的直线,实际电流过程中比如在刚通电的时候,电流是不稳的所以画出来的线应该是有波动的。不过这种波动非常小或者说非常快的趋于平稳,所以画图的时候近似的画成直线,但是实际中它并非直线。

上拉电阻:上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。这里的信号指的是模拟信号例如声音或者数字信号例如1和0的高低电平,设计到模电和数电。想更深入的了解可以看一看模电和数电,这里我还没看,所以没办法解释信号。

上拉电阻一般接在电源位置起到拉高电平输出,下拉是接在接地端,起到拉低电平的作用,可以通过欧姆定律串并联来理解。

钳位:钳位是指将某点的电位限制在规定电位的措施。

总的来说,上拉电阻我接上以后这点的电平会变高,因为会分压,分到很大一部分的电压,所以相对于某一点,我是高电平。

一张图理解一下(个人理解):

屏幕快照 2019-09-23 上午1.22.51.png


当IO为输出的时候,A点相对于B点的电压一定要小,所以这里要输出低电平。如果输出高电平,也就是A点的电压比b点的电压大的话,那么LED是不会亮的。因为LED的负极比正极电压还大了。这里的LED是负极接IO正极接VCC。

如果是LED正极接IO,而负极接地,那么就要输出高电平。因为A点相对于接地端的电压一定要大。才能让电流流通。

而作为输入的时候我觉得是A点的电压相对于集成电路内部的电平也就是电功率或者电压的比值。这里的B点只是一个参考,也可能这个B点在LED负极的前一点。




跑马灯电路板仿真

222222.gif

工具

Proteus:MCU仿真软件

ICC AVR : AVR单片机代码编写软件

元器件

ATMEGA-8 :AVR MCU

LED:发光二极管

电源:这里用VCC代替

元器件在proteus的名字

LED-RED

ATMEGA8

CHIPRES470R

这里的VCC是逻辑端子,没有具体的物理(实体)模型,只是电路图中代表电源,所有取名一样的端子将会在PCB中进行连接。另外电路图中没有加入电阻,所以对二极管的输入电流没有做控制,实际操作中需要加上的。另外还有物理端子,代表有实体的物理模型。

ATMEGA-8上面有很多的输入输出(I\O)端口,这里用的是PD1、PD3、PD4端口。代码使用ICC AVR 来编写,不同的版本有不同的书写方式。新版本好像套了一个开源的编辑器,旧的版本还是自己的编辑器。大概了解一下就可以了。然后就是编译输出为HEX,这些设置都可以在Project---Option里进行设置。

微信截图_20190920144931.png

还有需要注意的是ICC AVR 编辑器需要先新建工程,才能编译文件。不新建工程的话,即使代码写完,也无法编译。

跑马灯代码

#include <iom8v.h>
void delay_1ms(void){
    unsigned int i;
    for(i=1;i<(unsigned int )(1144-2);i++);
} 
void delay_1ma(unsigned int n){
    unsigned int i=0;
    while(i<n){
        delay_1ms();
        i++;
    }
}
void main(){
    unsigned char i;
    DDRD=0xFF; //设置D端口为输出模式 还有输入模式0xFF
    while(1){
        PORTD =~(1<<1); // << 是位移操作 相应位置对应的端口 1000 : 1<<4 即第四位  
        delay_1ma(30); // 延迟
           PORTD =~(1<<3);  
            delay_1ma(30);
            PORTD =~(1<<4);
            delay_1ma(30);
    }
}

关于输出高电平点亮led的解释

0824ab18972bd4079415dc097d899e510eb30977.png

 当I/O口输出高电平时,LED两端的电位相同,因此电压为0V,不能构成电流回路,所以LED不亮。当I/O口输出低电平时,LED左侧电位为0,而右侧则在R1的上拉作用下电位提高,因此LED两端有正向电压,可以点亮发光。

  MCS-51单片机的I/O口具有比较强的灌电流能力,但拉电流能力却很弱,所以并不适合用输出高电平的方法点亮LED,大多采用这种负逻辑的驱动方法。


为了更好的理解下面是说明书中的内容

本节所有的寄存器和位以通用格式表示:小写的 “x” 表示端口的序号,而小写的 “n” 代表

位的序号。但是在程序里要写完整。例如, PORTB3 表示端口 B 的第 3 位,而本节的通

用格式为 PORTxn。物理 I/O 寄存器和位定义列于 P63“I/O 端口寄存器的说明 ” 。

每个端口都有三个 I/O 存储器地址 : 数据寄存器 – PORTx、 数据方向寄存器 – DDRx 和端

口输入引脚 – PINx。数据寄存器和数据方向寄存器为读 / 写寄存器,而端口输入引脚为只

读寄存器。但是需要特别注意的是,对 PINx 寄存器某一位写入逻辑 "1“ 将造成数据寄存

器相应位的数据发生 "0“ 与 “1“ 的交替变化。当寄存器 MCUCR 的上拉禁止位 PUD 置位

时所有端口引脚的上拉电阻都被禁止。

编译好HEX文件以后,双击proteus仿真软件中的MCU ATmega8 图形 然后选择这个HEX。

微信截图_20190920151047.png

然后点击仿真就可以了 ,电源VCC逻辑端子的话,可以点击终端模式选择POWER就可以了。


个人理解,如有错误还望指出。