单片机 汇编 LED数码管动态显示

单片机 汇编 LED数码管动态显示,第1张

dbuf equ 30h ;置存储区首址

temp equ 40h ;置缓冲区首址

org 00h

mov 30h,#2 ;存入数据

mov 31h,#0

mov 32h,#1

mov 33h,#0

mov 34h,#7

mov 35h,#1

mov r0,#dbuf

mov r1,#temp

mov r2,#6 ;六位显示器

mov dptr,#segtab ;段码表首地址

dp00: mov a,@r0 ;取要显示的数据

movc a,@a+dptr ;查表取段码

mov @r1,a ;段码暂存

inc r1

inc r0

djnz r2,dp00

disp0: mov r0,#temp ;显示子程序

mov r1,#6 ;扫描6次

mov r2,#01h ;从第一位开始

dp01: mov a,@r0

mov p0,a ;段码输出

mov a,r2 ;取位码

mov p1,a ;位码输出

acall delay ;调用延时

mov a,r2

rl a

mov r2,a

inc r0

djnz r1,dp01

sjmp disp0

segtab: db 3fh,06h,5bh,4fh,66h

db 6dh,7dh,07h,7fh,6fh

delay: mov r4,#03h ;延时子程序

aa1: mov r5,0ffh

aa: djnz r5,aa

djnz r4,aa1

ret

end

嘿嘿 你是想显示2位数字 即 1 和 9 吧 程序基本问题不大

只是延时子程序 要在最后加上一条子程序返回指令 即 RET

否则 程序在调用子程序后 将无法正确返回到你的主程序上。

DELAY: MOV R0,#5H

DELAY2: MOV R1,#50H

DELAY3: MOV R2,#50H

DJNZ R2,$

DJNZ R1,DELAY3

DJNZ R0,DELAY2

RET (修改)

END

呵呵 满意 就选满意回答

NAME T3 ;I/O口扩展实验一

PORT EQU 0CFA0H ;片选地址CS0

CSEG AT 0000H

LJMP START

CSEG AT 4100H

START: MOV A,#11H ;两个红灯亮,黄灯、绿灯灭

ACALL DISP ;调用273显示单元(以下雷同)

ACALL DE3S ;延时3秒

LLL: MOV A,#12H ;东西路口绿灯亮;南北路口红灯亮

ACALL DISP

ACALL DE10S ;延时10秒

MOV A,#10H ;东西路口绿灯灭;南北路口红灯亮

ACALL DISP

MOV R2,#05H ;R2中的值为黄灯闪烁次数

TTT: MOV A,#14H ;东西路口黄灯亮;南北路口红灯亮

ACALL DISP

ACALL DE02S ;延时02秒

MOV A,#10H ;东西路口黄灯灭;南北路口红灯亮

ACALL DISP

ACALL DE02S ;延时02秒

DJNZ R2,TTT ;返回TTT,使东西路口;黄灯闪烁五次

MOV A,#11H ;两个红灯亮,黄灯、绿灯灭

ACALL DISP

ACALL DE02S ;延时02秒

MOV A,#21H ;东西路口红灯亮;南北路口绿灯亮

ACALL DISP

ACALL DE10S ;延时10秒

MOV A,#01H ;东西路口红灯亮;南北路口绿灯灭

ACALL DISP

MOV R2,#05H ;黄灯闪烁五次

GGG: MOV A,#41H ;东西路口红灯亮;南北路口黄灯亮

ACALL DISP

ACALL DE02S ;延时02秒

MOV A,#01H ;东西路口红灯亮;南北路口黄灯灭

ACALL DISP

ACALL DE02S ;延时02秒

DJNZ R2,GGG ;返回GGG,使南北路口;黄灯闪烁五次

MOV A,#03H ;两个红灯亮,黄灯、绿灯灭

ACALL DISP

ACALL DE02S ;延时02秒

JMP LLL ;转LLL循环

DE10S: MOV R5,#100 ;延时10秒

JMP DE1

DE3S: MOV R5,#30 ;延时3秒

JMP DE1

DE02S: MOV R5,#02 ;延时02秒

DE1: MOV R6,#200

DE2: MOV R7,#126

DE3: DJNZ R7,DE3

DJNZ R6,DE2

DJNZ R5,DE1

RET

DISP: MOV DPTR,#PORT ;273显示单元

CPL A

MOVX @DPTR,A

RET

END

你看看行不行 如果不行你自己再稍微改一下吧 反正大概就这些了

START:MOV R5,#00H ;次数计数单元R5,后面的程序应该看得懂了,都是教科书式的

MAIN: MOV A,R5

MOV DPTR,#TAB

MOV A,@A+DPTR

LCALL DISPLAY

CJNE,R5,#10,START ;次数到,从头再来

LJMP MAIN

DISPLAY: ;数码管显示子程序

LCALL DLY10MS

DLY10MS: ;数码管显示延时

TAB: DB ;数码管七段码表

SMG_1 EQU P10 ;P1为位选

SMG_2 EQU P11

SMG_3 EQU P12

SMG_4 EQU P13

ORG 0100H

JMP MAIN

ORG 0200H

MAIN:

call disp ;调用子程序

LJMP MAIN

DELAY:

MOV R5,#25

M1: MOV R6,#30

DJNZ R6,$

DJNZ R5,M1

RET

TMP:

DB 0C0H,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H

disp: ;原来中间的部分,现在,是一个子程序

MOV DPTR,#TMP

CLR A ;千位显示0

CLR SMG_1

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

CPL SMG_1

INC DPTR

CLR A ;百位显示1

CLR SMG_2

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

CPL SMG_2

INC DPTR

CLR A ;十位显示2

CLR SMG_3

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

CPL SMG_3

INC DPTR

CLR A ; 个位显示3

CLR SMG_4

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

CPL SMG_4

ret ;后面,要加上这句

END

稍稍做了一些改动:

/温度数码显示模块/

DISP1:

MOV R1, #70H

MOV R0, #74H

MOV R5, #0FEH

PLAY:

MOV DPTR, #TAB

MOV P2, #0FFH ;原来是 P1

MOV A, @R1

MOVC A, @A+DPTR

MOV P1, A

MOV A, @R0

MOVC A, @A+DPTR

MOV P0, A

MOV P2, R5

MOV A, R5

JB ACC1, LOOP1

CLR P17

CLR P07

LOOP1:

CALL DL1MS

INC R1

INC R0

JNB ACC3, ENDOUT

RL A

MOV R5, A

MOV A, 73H

数码管连接电路如图1所示,P0口输出码型,P2口输出位选。锁存器74HC573起驱动作用,提供驱动电流供数码管发光。译码器74HC138将位选地址转换成位选信号,例如当前是第5个数码管显示,那么P2口输出位选地址05H,译码器输入CBA=110,输出位选信号Y7-Y0=11101111,其中Y5=0,第5个数码管选通并显示,其它数码管不显示。实验时将J6的左边两个引脚针(1和2)用跳冒连接,锁存器11脚接VCC,关闭锁存功能。

数码管显示方式为动态扫描方式,当P0口送第一个数0的码型到锁存器时,P2送位选地址01H,即Y0=0,只有第一个数码管亮,显示0,其他数码管不显示。当P0口送第二个数1的码型到锁存器时,P2送位选地址02H,即Y1=0,只有第二个数码管亮,显示1,其他数码管不显示。即每次只有一个数码管点亮,8个数码管是轮流被点亮的,轮流点亮的间隔时间很短(一般用延时程序延时几个毫秒),由于视觉的暂留现象,看到的却好象全都点亮着,这就是动态扫描。

数码管显示数字的码型由数码管的数据脚a~dp决定,图2为数码管的笔段分布图,由于是共阴极的,所以当a~dp为高电平时相应的笔段会亮,电路中P10~P17分别接数码管的abcdefgdp,得到0~9这10个数字的码型如表1所示。

图2 数码管的笔段分布图

引脚 P07 P06 P05 P04 P03 P02 P01P00数字  码型

笔段 dp g f e d c b   a

0 0 1 1 1 1 1   1 0     3FH

0 0 0 0 0 1 1    0 1     06H

0 1 0 1 1 0 1   1 2      5BH

0 1 0 0 1 1 1  1 3      4FH

0 1 1 0 0 1 1   0 4      66H

0 1 1 0 1 1 0   1 5      6DH

0 1 1 1 1 1 0  1 6     7DH

0 0 0 0 0 1 1  1 7      07H

0 1 1 1 1 1 1  1 8       7FH

0 1 1 0 1 1 1  1 9       6FH

1 0 0 0 0 0 0  0 小数点80H

只要把上面的相关数,改成学好就可以了。

以下程序实现6位数码管,每一位依次循环显示0--9

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV P2,#0FEH

MOV A,#00H

MOV DPTR,#TAB

LOOP:

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

INC A

CJNE A,#0AH,LOOP

MOV A,P2

RL A

MOV P2,A

JB ACC6,SS1

MOV P2,#0FEH

SS1:

CLR A

SJMP LOOP

DELAY:

MOV R1,#2

L1: MOV R2,#200

L2: MOV R3,#200

L3: DJNZ R3,L1

DJNZ R2,L2

DJNZ R1,L3

RET SJMP $

ORG 0080H

TAB:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

END

以上就是关于单片机 汇编 LED数码管动态显示全部的内容,包括:单片机 汇编 LED数码管动态显示、51单片机汇编问题 数码管动态显示 代码如下、急求单片机数码管显示交通灯倒计时的汇编程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9308389.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存