天天看点

单片机——8位数码管循环显示0-7

电路设计

单片机——8位数码管循环显示0-7

汇编

思路:设置段控表和数控表,利用查表法依次输出到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);
		}
	}		
}
           

继续阅读