数码管连接电路如图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 数码管的笔段分布图引脚P07P06P05P04P03P02P01P00数字 码型笔段dpgfedcb a0011111 10 3FH0000011 01 06H0101101 12 5BH0100111 13 4FH0110011 04 66H0110110 15 6DH0111110 16 7DH0000011 17 07H0111111 18 7FH0110111 19 6FH1000000 0小数点80H只要把上面的相关数,改成学好就可以了。
程序如下:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV DPTR,#TAB ;表首址送DPTR
MOV R1, #0
MOV R2, #0
M1:
MOV R0, #50
LOOP:
CALL DIS
DJNZ R0, LOOP
MOV A, R3
ADD A, #1
DA A
CJNE A, #60H, SSS
CLR A
SSS:
MOV R3, A ;计数值
MOV B, #16
DIV AB
MOV R2, A
MOV R1, B
SJMP M1
;-------------------------------------------------------
DIS: ;显示程序
MOV A, R2 ;显示十位
MOVC A, @A+DPTR
CLR P21
MOV P1, A
SETB P20 ;十位的位选
CALL DLY
MOV A, R1 ;个位显示
MOVC A, @A+DPTR
CLR P20 ;关闭十位的显示
MOV P1, A
SETB P21 ;个位的位选
CALL DLY
RET
;-------------------------------------------------------
TAB: DB 0xc0,0xf9,0xa4,0xb0,0x99 ;共阳极0~9
DB 0x92,0x82,0xf8,0x80,0x90
DLY: MOV R6, #14H ;10ms延时
D1: MOV R7, #0F8H
DJNZ R7, $
DJNZ R6, D1
RET
;-------------------------------------------------------
#include<stc89c51RCh>
#define uchar unsigned char
#define uint unsigned int
int counter=0;
sbit w0=P2^7;
sbit w1=P2^6;
sbit w2=P2^5;
sbit w3=P2^4;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay_nms(uint z) //延时子
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void DisplayShumaguan(uchar shuzi)
{
w0=1;
w1=0;
w2=0;
w3=0;
P0=table[shuzi];
delay_nms(40);
w0=0;
w1=1;
w2=0;
w3=0;
P0=table[(shuzi+1)];
delay_nms(40);
w0=0;
w1=0;
w2=1;
w3=0;
P0=table[(shuzi+2)];
delay_nms(40);
w0=0;
w1=0;
w2=0;
w3=1;
P0=table[(shuzi+3)];
delay_nms(40);
}
void main()
{
uchar ii[4]={1,2,3,4};
while(1)
{
DisplayShumaguan(ii);
}
}
写那么长干嘛,p1口接数码管扫描。p0口接8段字符显示,已测试正常。
ORG 0000H
STAER: MOV DPTR,#K1
MOV 41H,#00H
MOV 42H,#00H
MOV R2,#0FFH
A2: ACALL A1;调用显示子程序
DJNZ R2,A2
MOV R2,#0FFH
INC 41H
MOV A,41H
CJNE A,#0AH,A2
MOV 41H,#00H
INC 42H
MOV A,42H
CJNE A,#0AH,A2
LJMP STAER;满100就清零重新开始
A1: MOV P0,#0FFH
MOV P1,#0FEH;取个位数的7段代码
MOV A,41H
MOVC A,@A+DPTR
MOV P0,A ;送出个位的7段代码
ACALL LOOP
MOV P0,#0FFH
MOV P1,#0FDH
MOV A,42H
MOVC A,@A+DPTR
ACALL LOOP
RET
LOOP: MOV R3,#100;1毫秒延时按12MHZ计算
D1: MOV R4,#10
D2: DJNZ R4,D2
DJNZ R3,D1
RET
K1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;实验板上的7段数码管0~9数字的共阴显示代码
END
注释比程序还麻烦,自己看了
以上就是关于微机课设:汇编语言七段数码管动态显示固定两位数字(学号)8255全部的内容,包括:微机课设:汇编语言七段数码管动态显示固定两位数字(学号)8255、动态数码管 汇编 60进制、求一个51单片机汇编程序,让四个数码管动态显示1 2 3 4,不是静态轮流显示,简单点有代表性,注释好,谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)