标题: 关于单片机数码管位选问题的详细分析 [打印本页]

作者: lx驾    时间: 2018-12-30 13:35
标题: 关于单片机数码管位选问题的详细分析
  看过普中的视频教程,设置数码管位选时定义了三个接口,LSA=P2^2,LSB=P2^3,LSC=P2^4(赋值为二进制),然后有人的程序直接定义了P2一个接口(赋值为十六进制),竟然也可以。想知道为什么,并且有什么区别。


作者: 2547694235    时间: 2018-12-30 14:48
可以就是可以 没为什么
作者: mosqu    时间: 2018-12-30 15:46
段选吧
3个IO口的用了138编码器,001控制第一段(就是8的第一横),002控制第二段等等
P2整个的0xfe = 1111 1110 一位控制一段,8段控制等等
作者: 杨雪飞    时间: 2018-12-30 15:55
对于这个问题,首先你要了解一下硬件,比如下图数码管的原理,其实就是7个LED,分共阴和共阳数码管。共阴数码管就是七个数码管共用一个接地引脚,七个LED显示七个段,所以,点亮七个LED也叫段选,这里共阴的数码管在段选a-g分别接高电位,公用引脚接低电位,这样就可以点亮选定的LED显示数字,例如,b、c接高电位,COM接低电位,就显示数字1,以此类推。(共阳数码管电位是相反的,另外所说七段是没有显示小数点的情况,有些数码管直接把DP和公共引脚连在一起是无法显示的)


所谓的位选,就是提供给公共的引脚以相应的电压,比如上图的共阴数码管,位选就是给在一起的几个数码管其中的某一位提供对应的电位,比如下边的1、2、3、4就是位选,a-g是段选。



明白了这个数码管的用法之后,那么来说下普中开发板教程里所写的那几行,因为普中开发板的教程从开始写第一个点亮一个LED程序的时候就为后边使用74LS138译码器做准备,所以第一个例程就开始用LSA   LSB  LSC这样的语句,其实开始并没有用。74LS138译码器是用三个引脚通过不同的电平组合来输出8个引脚的电平变化。这样可以利用单片机的三个IO口来解决需要8个IO口的解决法案。




如果直接使用单片机的IO口来驱动数码管,那么首先需要7-8个引脚来驱动段(8段包括小数点)。然后有几位就需要几个IO口来控制位,只有位和段同时有电位差的时候数码管的该段才被点亮,这就是数码管的动态显示原理。

单片机驱动的时候,从低位至高位依次接入数码管的段,假如用P0口,那么P0.0 - P0.3  P0.4 - P0.7分成两组,分别为8 4 2 1,8 4 2 1 ,他们全部点亮的时候就是共阴数码管的话输出全部为高电平,也就是P0.0 - P0.7(小数点也点亮)全部为高电平,那么值就是8+4+2+1,8+4+2+1,就是16,16。16进制就是FF,写成C语音就是P0 = 0xFF; 其他的自己研究吧,共阳数码管相反,就是数码管一个8字加小数点全部点亮C语言写的程序就是:
P0 = 0x00;

如果使用LSA   LSB  LSC的方式编码按上边38译码器的真值表来确定0-F这16个数字的码表来写上边的程序就可以了,这个你就自己去思考吧。

作者: unsigned_char_    时间: 2018-12-30 16:00
定义P2一个接口意思就是同时对8个接口的值一起控制,所以当端口赋值为0x01相当于00000001,即选中P2.0,定义0x02即0000 0010就是选中P2.1,0x04即0000 0100就是选中P2.2……以此类推,直到0x80即1000 0000,选中P2.7。
作者: lx驾    时间: 2018-12-30 22:26
unsigned_char_ 发表于 2018-12-30 16:00
定义P2一个接口意思就是同时对8个接口的值一起控制,所以当端口赋值为0x01相当于00000001,即选中P2.0,定 ...

还想知道为什么选中后相应数码管就会亮?
作者: 微扬    时间: 2019-1-1 19:47
CPU可以自动将16进制转为2进制使用,或者说机器只认识2进制
作者: jifengjian1    时间: 2019-11-7 19:07
unsigned_char_ 发表于 2018-12-30 16:00
定义P2一个接口意思就是同时对8个接口的值一起控制,所以当端口赋值为0x01相当于00000001,即选中P2.0,定 ...

如果要全选呢 怎么让他全部亮




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1