分类:
2008-10-10 13:05:12
再说MCU——数码管显示(单片机入门级教程二)
本应该早点写的,没想等到现在了,十一假期,再加上篮球赛,似乎假装很忙的样子。心态散了,就容易怠慢,人性的弱点。
OK, never claver and get to business(废话少说)。
这次说数码管的显示。说到数码管可谓是见的太多了,电子表上的那个“日日日日日日”,但是数码管结构是什么样子的呢?
学过数电(数字电子技术)的人都会知道,这个“日.”(一个数字8和一个小数点,由于没有研究过本博客如何插入图片,先将就下啦)是由七段发光二极管,还有一个圆点型发光二极管组成的,故又称为七段LED显示器,按上右下左中点的顺序分别是a,b,c,d,e,f,g,h。与之对应的D0,D2,D3,D4,D5,D6,D7,自左向右位权依次增高。而数字里的0,1,2 …9,就是由这前7个段组成的,另外不同的组合还可以显示字母或其他符号。
数码管中二极管的接法分两种,共阳极和共阴极,所谓的共阳共阴就是把这些二极管的阳/阴极接在一起,而在另一段接入低/高电平使二极管点亮。在此我们以共阴极为例。
简单说明一下,0就是使a,b,c,d,e,f,六段二极管点亮,即D5D4D3D2D1D0,也就是0011 1111,用十六进制表示为3FH,其他的依次类推。。。
在此给出可能会用到的,但还是希望读者可以自己推一下:
0——3FH,1——06H,2——5BH,3——4FH,4——66H,5——6DH,6——7DH,7——07H,
8——7FH,9——6FH,A——77H,b——7CH,C——39H,d——5EH,E——79H,F——71H,
灭——00H
把实验板中的P1,P0口接在数码管模块上就可以开始做了。
现在给出以下程序
ORG 0000H
AJMP
ORG 0030H
MAIN:MOV R1,#010H ;想想给R1赋一个10是什么意思?
LCALL DELAY
MOV DPTR,#TAB
MOVC A,@A+DPTR ;此段为查表程序,可以逐次调用TAB(名字可改)内的数据
MOV P1,A
LCALL DELAY
DJNZ R1,
LJMP
TAB:DB 00H,3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
DELAY:MOV R7,#0FFH ;还是延时程序,比平时用的稍微长了一些,有兴趣可以自己算算
D1:MOV R6,#0FFH 等待多长时间。(假设为
D2:MOV R5,#005H
D3:DJNZ R5,D3
DJNZ R6,D2
DJNZ R7,D1
RET
END
这个程序其实很简单,就是用来控制一个一位数码管显示0~9数字。实验板上有按键矩阵,如果通过控制按键而使灯亮呢?也就是按几显示几,好的,现在就开始吧,把P1口上的8根线分别接到按键模块上,P0接到数码管上,Just now:
ORG 0000H
AJMP START
ORG 0030H
START:MOV P1,#0FFH
LCALL DELAY
MOV 30H,P1
CJNE A,30H,MAIN ;CJNE数据比较指令,与30H内容地址不等转移
JNB ACC.0,L1 ;JNB,位控制转移指令,位状态为“
JNB ACC.1,L2 0位为0则转移到L1
JNB ACC.2,L3
JNB ACC.3,L4
JNB ACC.4,L5
JNB ACC.5,L6
JNB ACC.6,L7
JNB ACC.7,L8
L1:MOV P0,#3FH
LJMP
L2:MOV P0,#06H
LJMP
L3:MOV P0,#5BH
LJMP
L4:MOV P0,#4FH
LJMP
L5:MOV P0,#66H
LJMP
L6:MOV P0,#6DH
LJMP
L7:MOV P0,#7DH
LJMP
L8:MOV P0,#07H
LJMP
DELAY:MOV R7,#50
D1:MOV R6,#100
D2:DJNZ R6,D2
DJNZ R7,D1
RET
END
简单说明一下,MAIN中前4句是用于去抖动的语句,当手按动按键的时候,会有一个抖动,要消除抖动,原理很简单,就是检测大约十毫秒后按键的状态有没有变化。
MOV A,P1 ;这句用于检测P1口,也就是键盘上的信号
LCALL DELAY ;调用延时程序,用过好多次了,不过,这次的DELAY设置为10ms左右
自己设计下
MOV 30H,P1 ;重新检测P1口信号,并送入RAM中的30H
CJNE A,30H,MAIN ;比较这两次的信号是否一直
这样一个防抖动的程序就完了,是不是没有想的那么难,其实好多事情都是这样,毛爷爷不是说了嘛,一切反动派都是纸老虎!(未完,待续)
续:
现在做一下多位8段数码管的动态显示,因为这个在实际应用中会比静态显示(上面第一个实验为数码管静态显示实验)广泛的多,动态显示所要达到的目的地就是让很多位同时显示数字,
通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O控制,形成段选线的多路复用。而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”。虽然每一个时刻只能选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多为数码管同时被点亮了。
我们以6位数码管为例来说明。也就是“日日日日日日”这种形式。
同样以共阴极为例。
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV R1,#00H
MOV P0,#07FH
LOOP:MOV A,R1
MOV DPTR,#TAB ;查表指令
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
MOV A,P0
RL A
MOV P0,A
INC R1
CJNE R1,#07H,LOOP
LJMP MAIN
TAB:DB 00H,03FH,06H,5BH,4FH,66H,6DH
DELAY:MOV R7,#010H
D1:MOV R6,#05H
D2:DJNZ R6,D2
DJNZ R7,D1
RET
END
这样一个动态显示的模块就完成了。以后如果需要扩展的话,该怎么办呢?。。。