一段数码管动态显示一行六位数字的程序,求解析所有代码含义。越详细越好

一段数码管动态显示一行六位数字的程序,求解析所有代码含义。越详细越好,第1张

;这个程序的基本流程是:

;1把content中的数字对应的断码找出,并依次存放到LEDBuf中

;2依次送LEDBuf中的断码到LED上,LED显示对应字符

OUTBIT equ 08002h ;将位码送至此地址,位码表示显示哪一位LED管

OUTSEG equ 08004h ;将断码送至此地址,断码表示在指定的LED管上显示什么字符

data segment

Content db 1,2,3,0dh,0eh,0fh ;要显示的数字

LEDBuf db 6 dup() ;要显示的数字对应的断码

;LEDMAP给出的是断码表,表示16进制数到断码的映射。总共16个,分别表示0-f。

;比如第一个3fh就是0的断码,断码送到LED中,LED会自动显示0。

LEDMAP:

db 3fh,06h,5bh,4fh,66h,6dh,7dh,,07h

db 7fh,6fh,77h,7ch,39h,5eh, 79h,71h

data ends

code segment

assume cs:code, ds:data

;Delay的目的就是为了让LED灯上的内容停留,以便看清

Delay proc

push cx

mov cx,100h

loop $ ;这里的循环目的是暂停一段时间,让LED上的数字停留,以便人看清

pop cx

ret

Delay endp

;DisplayLED做的事:把LEDbuf中内容全部显示到LED灯上。LEDbuf中6个断码,对应6个LED灯。

DisplayLED proc near

mov bx, offset LEDBuf

mov cx, 6 ;总共显示6个断码

mov ah, 00100000b ;位码,00100000b中1的位置指示了要显示的数位,当前是1在左起第六个,也就是显示6号LED灯

;后面有shr指令会将这个00100000b右移,这样变成00010000,显示5号LED,以此类推。

DLoop: mov dx, OUTBIT

mov al, 0

out dx,al ;将0送端位码端口,表示当前不选中任何LED,即关闭LED

mov al, [bx] ;将LEDbuf中的一个断码,送入al

mov dx, OUTSEG

out dx,al ;送断码,表示要在LED中显示这个字符

mov dx, OUTBIT

mov al, ah

out dx, al ;送位码,表示要显示哪一个LED灯

call Delay ;上面送完断码,位码后,在相应的LED上就显示相应的字符,Delay可以让这个字符停留一段时间,视觉滞留。

shr ah, 1 ;位码右移,显示下一个LED

inc bx ;bx加1,那么[bx]就指向LEDbuf中的下一个断码

loop Dloop ;这个Dloop循环把LEDbuf中的六个断码依次全部送到对应LED上显示

ret

DisplayLED endp

;Start:程序的入口,从这里开始运行程序

Start proc near

mov ax, data

mov ds, ax

mov cx,6 ;显示六个字符

mov ah,0 ;ah是content中的偏移量,从0->5,分别找出content中各个字节内容

mov si,offset ledbuf

redo: mov bx,offset content

mov al,ah ;后面的xlat指令要使用al

xlat ;xlat的作用al<-[bx+al],也就是将bx这个地址(content)起的第al个字节内容送到al中

mov bx,offset ledmap

xlat ;将此时al中的数字对应的断码找出,并放到al中。(数字a对应的断码就是ledmap起第a个字节的数据)

mov [si],al ;将找到的断码放到LEDbuf中

inc si ;LEDbuf地址加1,存放下一个断码

inc ah ;找content中下一个数字的断码

loop redo ;整个redo循环做的事:把content中数字对应的断码放到LEDbuf中,循环最后结果是LEDbuf变成:06h,5bh,4fh,5eh,79h,71h

show: call displayled

jmp show ;在LED上一直显示这6个字符

start endp

code ends

end start

因为在有参调用中,程序开头有一些计算过程,例如计算要显示的每一位数值,要占用较长的时间,动态扫描到最后一个数码管后重新循环时再次计算程序开头的计算过程,这段时间都是最后一个数码管在显示,所以最后一个数码管显示时间较其他数码管长,比较亮。或者是在主程序中,display()前有一段代码要执行,占用较长时间,效果和前面讲的相同。

#include<reg52h>

#define uint unsigned int

#define uchar unsigned char

uchar num,temp,H;

sbit wei=P2^7;

sbit duan=P2^6;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void main()

{

wei=1;

P1=0xc0;

wei=0x0;

P1=0;

duan=1;

P1=0x00;

duan=0;

while(1)

{

P3=0xfe;

H=0;

temp=P3;

//P0=table[num];

if(temp!=0xfe)

{

switch(temp)

{

case 0xee: num=0; break;

case 0xde: num=1; break;

case 0xbe: num=2; break;

case 0x7e: num=3; break;

}

}

P3=0xfd;

H=0;

temp=P3;

if(temp!=0xfd)

{

switch(temp)

{

case 0xed: num=4; break;

case 0xdd: num=5; break;

case 0xbd: num=6; break;

case 0x7d: num=7; break;

}

}

P3=0xfb;

H=0;

temp=P3;

if(temp!=0xfb)

{

switch(temp)

{

case 0xeb: num=8; break;

case 0xdb: num=9; break;

case 0xbb: num=10; break;

case 0x7b: num=11; break;

}

}

P3=0xf7;

H=0;

temp=P3;

if(temp!=0xf7)

{

switch(temp)

{

case 0xe7: num=12; break;

case 0xd7: num=13; break;

case 0xb7: num=14; break;

case 0x77: num=15; break;

}

}

duan=1;

P1=table[num];

duan=0;

}

我这是个按键点亮数码管的。单个的太简单了。没试过。如果这个对你没帮助,你留言给我我帮你在写一个当个点亮的程序给你,。

以上就是关于一段数码管动态显示一行六位数字的程序,求解析所有代码含义。越详细越好全部的内容,包括:一段数码管动态显示一行六位数字的程序,求解析所有代码含义。越详细越好、单片机数码管动态显示程序最后一位很亮是怎么回事、单个数码管显示程序怎么编写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9336163.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存