AT89C51单片机怎么用汇编语言让4个数码管同时显示1234?

共阳极接法,位选端为P2口,abcdefg为P2口,求个汇编语言程序

1、首先我们先打开keil。

2、接着,我们要定义好库函数,void main(){while(1)//不断循环显示{dispaly();}}void dispaly(){P0=smg[1];//选择显示数字几,P1=0x7f;//控制是否点亮数码管。

3、接着,我们加上一条循环语句。delay(5);//显示5毫秒P0=0XFF;//消影P0=smg[2];P1=0xbf;delay(5);P0=0XFF;P0=smg[3]。

4、最后,我们把先前定义的延时语句delayms写好。

5、最后,点击这里进行编译,生成一个hex文件。

6、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以点亮动态数码管了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-07-17

ORG 00H

AJMP MAIN

ORG 30H

MAIN: LCALL DISP

MOV 20H,#1

MOV 21H,#2

MOV 22H,#3

MOV 23H,#4

AJMP MAIN

DISP: MOV A,20H  

ACALL SEG7

MOV P0,A

SETB P2.0

ACALL DLY

CLR P2.0

MOV A,21H  

ACALL SEG7

MOV P0,A

SETB P2.1

ACALL DLY

CLR P2.1

MOV A,22H 

ACALL SEG7

MOV P0,A

SETB P2.2

ACALL DLY

CLR P2.2

MOV A,23H 

ACALL SEG7

MOV P0,A

SETB P2.3

ACALL DLY

CLR P2.3

RET 

DLY: MOV R7,#2

D1: MOV R6,#40

DJNZ R6,$

DJNZ R7,D1

RET

SEG7: INC A

MOVC A,@A+PC

RET

DB        0C0H;0

DB        0F9H;1

DB        0A4H;2

DB        0B0H;3

DB        099H;4

DB        092H;5

DB        082H;6

DB        0F8H;7

DB        080H;8

DB        090H;9

END

扩展资料:

注意事项

1、至少包括4个功能:时间清零,启动计时,暂定计时,继续计时。

2、计时最小单位0.1 秒,最大计时时间999.9秒,

3、用数码管显示时间,同时要求按下任何一个功能键必须有声音提示。

4、使用方法: 设有启动键K1和暂停/清零键K2。按k1启动计时,按k2则暂停计时,再按k2则清零。

5、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起。

另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

本回答被网友采纳
第2个回答  2010-12-09

ORG 00H

 AJMP MAIN

 ORG 30H

MAIN: LCALL DISP

 MOV 20H,#1

 MOV 21H,#2

 MOV 22H,#3

 MOV 23H,#4

 AJMP MAIN

DISP: MOV A,20H  

 ACALL SEG7

 MOV P0,A

 SETB P2.0

 ACALL DLY

 CLR P2.0

 MOV A,21H  

 ACALL SEG7

 MOV P0,A

 SETB P2.1

 ACALL DLY

 CLR P2.1

 MOV A,22H 

 ACALL SEG7

 MOV P0,A

 SETB P2.2

 ACALL DLY

 CLR P2.2

 MOV A,23H 

 ACALL SEG7

 MOV P0,A

 SETB P2.3

 ACALL DLY

 CLR P2.3

 

 RET 

DLY: MOV R7,#2

D1: MOV R6,#40

 DJNZ R6,$

 DJNZ R7,D1

 RET

SEG7: INC A

 MOVC A,@A+PC

 RET

     DB        0C0H;0

        DB        0F9H;1

        DB        0A4H;2

        DB        0B0H;3

        DB        099H;4

        DB        092H;5

        DB        082H;6

        DB        0F8H;7

        DB        080H;8

        DB        090H;9

       

       END

本回答被提问者采纳
第3个回答  2010-12-09
自己要学会仿制写程序,懂了原理之后就容易理解了,我说一下原理吧:
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
第4个回答  推荐于2017-09-04
通常的办法是扫描显示,这样的话,用12个IO口就可以实现了,8位段码加上4位位码。程序如下:
DAT EQU 30H
SCANLED EQU 34H
ORG 0000H

LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
MOV TH0,#0F4H
MOV TL0,#048H
MOV P2,#00H
MOV SCANLED,#0
MOV 30H,#1
MOV 31H,#2
MOV 30H,#3
MOV 31H,#4
SETB EA

SETB ET0
SETB TR0
SJMP $

;--------------------
T0ISR:
CLR TR0

MOV TH0,#0F4H
MOV TL0,#048H
SETB TR0

MOV DPTR,#LEDTAB
MOV R0,#DAT

MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T001
MOV P2,#01H
SJMP T0DIS
T001:
DEC A
JNZ T002
MOV P2,#02H
SJMP T0DIS
T002:
DEC A
JNZ T003
MOV P2,#04H
SJMP T0DIS
T003:
MOV P2,#08H
T0DIS:
MOV A,@R0
MOVC A,@A+DPTR
CPL A
MOV P0,A
INC SCANLED
MOV A,SCANLED
ANL A,#03H
MOV SCANLED,A
POP ACC
RETI
;--------------------
LEDTAB:
DB 0C0H ;"0" 00H
DB 0F9H ;"1" 01H
DB 0A4H ;"2" 02H
DB 0B0H ;"3" 03H
DB 99H ;"4" 04H
DB 92H ;"5" 05H
DB 82H ;"6" 06H
DB 0F8H ;"7" 07H
DB 80H ;"8" 08H
DB 90H ;"9" 09H
;--------------------

END
相似回答