求51单片机数码管动态显示“6688”的汇编程序~电路图如下~谢谢~

如题所述

s1 bit p0.0 ;数码管位定义
s2 bit p0.1
s3 bit p0.2
s4 bit p0.3
s5 bit p0.4
s6 bit p0.5
s7 bit p0.6
s8 bit p0.7

led_data equ p2 ;数码管数据定义

org 00h ;程序开始
jmp main ;主程序开始处

org 030h ;主程序从30H开始
main: MOV sp,#30h ;设置堆栈
lcall rest ;调用初始化程序
lcall pro_8led ;调用数码管显示程序
jmp main ;返回

;********* 初始化程序 **************

rest:MOV a,#00h ;清寄存器
MOV b,#00h ;清寄存器
MOV p0,#0 ;禁止数码管显示
MOV p2,#255 ;
MOV p1,0ffh ;禁止LED显示
clr beep ;禁止蜂鸣器
ret ;返回

;******** 数码管显示程序 ***************
pro_8led:
MOV b,#32 ;一共显示32个数字
clr psw.3 ;重新设置寄存器组
setb psw.4 ;

MOV r0,#00h ;数据显示从0开始
MOV r1,#01h ;数码管从第1个开始
loop:MOV p0,r1 ;点亮当前数码管
MOV a,r0 ;准备第一个数据
MOV dptr,#tab_nu ;获得表头
MOVc a,@a+dptr ;得到第一个数据
MOV led_data,a ;输出到显示数据口

lcall delay ; 500 ms 延时
lcall delay ; 1 s 延时
inc r0 ;准备下一个数据
MOV a,r1 ;准备下一位数码管
rlc a ;设置下一个数码管
jc c1 ;8位全部显示,转移
MOV r1,a ;否则,设置下一位
djnz b,loop ;32个数没有显示完,返回显示
ret ;否则返回主程序

c1: MOV r1,#1 ;8位显示完,重新开始循环
clr c ;设置显示位
djnz b,loop ;32位显示完则返回重新显示
ret ;否则返回到主程序
;************* 数码管显示 *******************************

;************* 软件延时 500ms *****************************
delay: push psw ; 保存原来的寄存器内容
clr psw.3 ;
clr psw.4 ; 设置新的寄存器组
MOV r0,#2 ; 延时参数1
MOV r1,#250 ; 延时参数2
MOV r2,#2 ; 延时参数3
dl1:djnz r0,dl1 ; 延时循环1
MOV r0,#250 ;
dl2:djnz r1,dl1 ; 延时循环2
MOV r0,#240 ;
MOV r1,#248 ;
dl3:djnz r2,dl1 ; 延时循环3
nop ; 定时精度调整
pop psw ; 恢复原来的寄存器
ret ; 返回
;**********************************************************

;**********************************************************
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推

tab_nu:
db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 数字0-7 不带小数点代码
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 数字8-f 不带小数点代码
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 数字0-7 带小数点代码
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 数字8-f 带小数点代码

  end
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-16
如果你这也只是为了固定显示这个就没有意思了,你关键是要理解是怎么实现这个动太显示功能那才叫学懂了,什么叫动态显示。。。
我说一下,看你能懂不如果不懂再问吧,首先你把显示全清了,然后输出位码,再送DU码,然后加一个延时,再关了这位,再输出下一个位码再送DU码,,后面的都是一样的,只要让这个一直循环下去就可以动态显示了,
第2个回答  2012-05-15

ORG 0000H                     ;  附仿真图  仿真通过

       MOV  31H,#06H

       MOV  32H,#06H

       MOV  33H,#08H

       MOV  34H,#08H

       ACALL   D0

       JMP     $-2

D0:    MOV  R0,#31H

       MOV   R2,#11111110B

       MOV    DPTR,#TAB

D1:   MOV    R3, #250

       DJNZ   R3, $

       ORL    P3,#00001111B

       MOV   A,@R0

       MOVC   A,@A+DPTR

       MOV    P1, A

D2:    MOV    A, R2

       MOV   P3, A

       RL   A

       MOV   R2,A

       INC    R0

       JB   ACC.4,D1

       RET

TAB:     DB 3FH,06H,5BH,4FH

         DB 66H,6DH,7DH,07H

         DB 7FH,6FH,77H,7CH

         DB 39H,5EH,79H,71H

         DB 40H

         END

追问

锁存器控制部分在程序哪里 啊?

追答

按照上图不需要锁存 呀,用上图 加 上面的程序,显示上图的结果。

追问

关键是我们的题目,要求用锁存器啊~不用锁存器动态显示我也会啊~

追答

扩展数据线,当外部数据存储器用。( 并口 需要 8 + 3 个 IO 口,串口 用 595 需要 3 个 IO 口)

51单片机显示八位数码管的C语言程序
1、最开始,我们先打开keil。2、接着,我们要定义好库函数,想要实现动态数码灯,这个步骤是很重要的。3、接着,我们加上一条循环语句。4、最后,我们把先前定义的延时语句delayms写好。5、最后,点击这里进行编译,生成一个hex文件。6、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以...

51单片机数码管滚动显示
include <reg52.h> define uchar unsigned char define uint unsigned int uchar code SEG_B_List[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};\/\/共阳数码管代码表"0-9","空"define StuNumLeng 14 \/\/学号长度,加了2个空格 uchar StuNum[StuNumLeng]={10,2...

51单片机驱动数码管的电路图怎么画?
这是全自动洗衣机电路图,请参考数码管的接入,按其接入的I\/O口,编程驱动即可。

基于51单片机利用八个数码管花样显示如下
其实很简单,你把1--8对应的共阴极或共阳极的编码寻在一个数组里(C语言)或者表里(汇编语言查表法),在P0口和P2口接上8个7段数码管,P2口做位选,P0口做段选,每次从表中查询你要显示的数据的编码写到P0口,再把你要在哪一个数码管上显示写到P2口(比如位选为低电平有效,向P2口写入0xFE...

51单片机 控制四位数码管 汇编程序
哦,,数码管 有共阳极,共阴极的,你是那一种 ;显示缓冲单元在72H—75H DISPLAY:MOV DPTR,#TAB CLR P3.3 MOV A,72H MOVC A,@A+DPTR LOP1:MOV P2,A LCALL DL1MS SETB P3.3 CLR P3.2 MOV A,73H MOVC A,@A+DPTR LOP2:MOV P2,A LCALL DL1MS SETB P3.2 CLR P3.1 MOV A,74H...

51单片机怎样用键盘控制数码管显示
51单片机怎样用键盘控制数码管显示的方法。如下参考:1.首先,编写代码并点亮数码管。2.在编写源代码之后,确保原始代码是正确的。3.确认代码正确后,进入下一步,就是在这一行代码(箭头所指)中,删除这四个单词。4.然后如图所示,四个单词已被删除,只要修改相应的代码编号即可。5.表示数字0的代码在...

在51单片机上如何让数码管流水式的显示16进制数,
这个简单啊,你建一个表就行了,直接取表数据放上去显示。数码管用动态扫描。下面是AVR的代码,你参考一下就行了。include <iom64v.h> include <macros.h> define SEG PORTA \/\/ 数码管段码 define SCAN PORTC \/\/ 数码管位选 define uchar unsigned char define uint unsigned int \/\/\/...

51单片机的共阴数码管怎么显示数字(c语言)
要让51单片机共阴数码管显示数字,只需要将单片机的P2端口输出数字对应的段码即可。以显示数字“0”为例,c语言程序如下:include<reg52.h> define uchar unsigned char define uint unsigned int \/\/数码管的段码编码 Uchar table[10] ={0x3f,0x06,...

单片机 汇编 LED数码管动态显示
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 d...

51单片机动态显示学号后8位
table[10]={...};\/\/0-9的七段码 while(1){for(i=0;i<8;i++){weila=1;\/\/打开位锁存器P0=1<

相似回答