Chinaunix首页 | 论坛 | 博客
  • 博客访问: 658860
  • 博文数量: 205
  • 博客积分: 7891
  • 博客等级: 少将
  • 技术积分: 2168
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-29 13:16
文章分类

全部博文(205)

文章存档

2015年(4)

2014年(5)

2013年(1)

2012年(4)

2011年(51)

2010年(86)

2009年(45)

2008年(9)

分类:

2008-10-10 13:05:12

再说MCU——数码管显示(单片机入门级教程二)

20081010 1247

本应该早点写的,没想等到现在了,十一假期,再加上篮球赛,似乎假装很忙的样子。心态散了,就容易怠慢,人性的弱点。

OK, never claver and get to business(废话少说)。

这次说数码管的显示。说到数码管可谓是见的太多了,电子表上的那个“日日日日日日”,但是数码管结构是什么样子的呢?

学过数电(数字电子技术)的人都会知道,这个“日.”(一个数字8和一个小数点,由于没有研究过本博客如何插入图片,先将就下啦)是由七段发光二极管,还有一个圆点型发光二极管组成的,故又称为七段LED显示器,按上右下左中点的顺序分别是abcdefgh。与之对应的D0,D2,D3,D4,D5,D6,D7,自左向右位权依次增高。而数字里的012 9,就是由这前7个段组成的,另外不同的组合还可以显示字母或其他符号。

数码管中二极管的接法分两种,共阳极和共阴极,所谓的共阳共阴就是把这些二极管的阳/阴极接在一起,而在另一段接入低/高电平使二极管点亮。在此我们以共阴极为例。

简单说明一下,0就是使a,b,c,d,e,f,六段二极管点亮,即D5D4D3D2D1D0,也就是0011 1111,用十六进制表示为3FH,其他的依次类推。。。

在此给出可能会用到的,但还是希望读者可以自己推一下:

0——3FH1——06H2——5BH3——4FH4——66H5——6DH6——7DH7——07H

8——7FH9——6FHA——77Hb——7CHC——39Hd——5EHE——79HF——71H

灭——00H

把实验板中的P1P0口接在数码管模块上就可以开始做了。

现在给出以下程序

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN:MOV R1,#010H      ;想想给R1赋一个10是什么意思?

     LCALL DELAY

LOOP:MOV A,R1

     MOV DPTR,#TAB

     MOVC A,@A+DPTR   ;此段为查表程序,可以逐次调用TAB(名字可改)内的数据

     MOV P1,A

     LCALL DELAY

     DJNZ R1,LOOP

     LJMP MAIN

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       等待多长时间。(假设为12M晶振)  

   D2:MOV R5,#005H

   D3:DJNZ R5,D3

      DJNZ R6,D2

      DJNZ R7,D1

      RET

      END

这个程序其实很简单,就是用来控制一个一位数码管显示09数字。实验板上有按键矩阵,如果通过控制按键而使灯亮呢?也就是按几显示几,好的,现在就开始吧,把P1口上的8根线分别接到按键模块上,P0接到数码管上,Just now

 

ORG 0000H

AJMP START

ORG 0030H

START:MOV P1,#0FFH

MAIN:MOV A,P1

     LCALL DELAY      

     MOV 30H,P1

     CJNE A,30H,MAIN    ;CJNE数据比较指令,与30H内容地址不等转移

     JNB ACC.0,L1        ;JNB,位控制转移指令,位状态为“0转移,此句就是ACC中的

     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 MAIN

  L2:MOV P0,#06H

     LJMP MAIN

  L3:MOV P0,#5BH

     LJMP MAIN

  L4:MOV P0,#4FH

     LJMP MAIN

  L5:MOV P0,#66H

     LJMP MAIN  

  L6:MOV P0,#6DH

     LJMP MAIN

  L7:MOV P0,#7DH

     LJMP MAIN

  L8:MOV P0,#07H

     LJMP MAIN

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段数码管的动态显示,因为这个在实际应用中会比静态显示(上面第一个实验为数码管静态显示实验)广泛的多,动态显示所要达到的目的地就是让很多位同时显示数字,

通常将所有位的段选线相应地并联在一起,由一个单片机的8I/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

这样一个动态显示的模块就完成了。以后如果需要扩展的话,该怎么办呢?。。。

 

 

阅读(1420) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-10-19 21:37:18

单片机的汇编程序

chinaunix网友2008-10-12 10:26:13

这是什么啊