电路设计
汇编
思路:设置段控表和数控表,利用查表法依次输出到P0 P2
ORG 0000H
MAIN: MOV R0,#00H
L0: MOV A,R0
MOV DPTR,#3000H
MOVC A,@A+DPTR; 查表得段控
MOV P0,A
MOV A,R0
ADD A,#8
MOVC A,@A+DPTR; 查表得位控
MOV P2,A
INC R0
ACALL DELAY
CJNE R0,#08H,L0
LJMP MAIN
ORG 0200H
DELAY:MOV R2,#10; 延时子程序
D0: MOV R3,#100
D1: MOV R4,#250
DJNZ R4,$
DJNZ R3,D1
DJNZ R2,D0
RET
ORG 3000H
TAB: DB 192,249,164,176,153,146,131,248
DB 1,2,4,8,16,32,64,128; 定义段控表和位控表
END
注意:先查表把数据给P0,然后再次查表之前,还要重新将A的值复原,因为上次查表,将查表后的数据存放到A里了,所以不能直接查表;并且要给A加上一个偏移量8
C语言
思路:分别定义段控、位控数组,直接循环分别赋值
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
int a[8]={1,2,4,8,16,32,64,128}; //定义位控数组
int b[8]={64,121,36,48,25,18,3,120}; //定义段控数组,分别对应显示的数字0-7
void DelayMS(uint x) //延时子函数
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void main()
{
int i;
while(1)
{
for(i=0;i<8;i++)
{
P0=b[i]+128; //增加偏移量,保证P0.7,即dp=1
P2=a[i];
DelayMS(400);
}
}
}