C51单片机实验——LED数码管显示(proteus+asm)

数码管对应表请添加图片描述

Proteus电路图

在这里插入图片描述
8个LED数码管为共阴极
P1.0为段选信号口,P1.1为位选信号口

asm代码

ORG		0000H
LJMP	MAIN

ORG		0100H
MAIN:	MOV		R0,#08H		;初始化
		MOV		R1,#7FH
		CLR		P1.0		;控制端复位
		CLR		P1.1
		MOV		DPTR,#TABLE	;指向表头
		
LOOP:	
		MOV		A,R1		;位选控制
		MOV		P0,A		;输出位信号
		SETB	P1.1		;上升沿
		CLR		P1.1

		MOV		A,R0		;段选控制
		MOVC	A,@A+DPTR
		MOV		P0,A		;输出段信号
		SETB	P1.0		;上升沿
		CLR		P1.0
		
		MOV		A,R1		;恢复A
		RR		A			;位选向左循环移动
		MOV		R1,A
		DJNZ	R0,DELAY	;判断数据表是否到头	
		MOV		R0,#08H		;到头复位

DELAY:	MOV 	30H,#2		;延时1ms
		MOV 	31H,#234
NEXT:	DJNZ 	31H,NEXT	;延时循环
		DJNZ 	30H,NEXT
		SJMP	LOOP

TABLE:	DB  00H,76H,79H,38H,38H,5CH,40H,40H,40H

END

注:数据表中第一个元素为无效值

效果图

在这里插入图片描述

  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C51单片机LED数码管显示的程序设计步骤如下: 1. 定义端口 首先,需要定义使用的端口和引脚。如下所示: ```c sbit P2_0 = P2^0; // 数码管的A引脚 sbit P2_1 = P2^1; // 数码管的B引脚 sbit P2_2 = P2^2; // 数码管的C引脚 sbit P2_3 = P2^3; // 数码管的D引脚 sbit P2_4 = P2^4; // 数码管的E引脚 sbit P2_5 = P2^5; // 数码管的F引脚 sbit P2_6 = P2^6; // 数码管的G引脚 sbit P2_7 = P2^7; // 数码管的DP引脚 sbit P1_0 = P1^0; // 第1个数码管的选择引脚 sbit P1_1 = P1^1; // 第2个数码管的选择引脚 sbit P1_2 = P1^2; // 第3个数码管的选择引脚 sbit P1_3 = P1^3; // 第4个数码管的选择引脚 ``` 2. 定义数码管显示的数字 接着,需要定义要显示的数字。例如,要显示数字1234,可以这样定义: ```c unsigned char code ledData[]={ 0x3f, // 0 0x06, // 1 0x5b, // 2 0x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f, // 9 }; ``` 其中,ledData数组存储了0到9的数字对应的LED数码管的状态。 3. 主函数中的程序设计 在主函数中,需要做以下几个步骤: - 初始化 - 数码管扫描显示 - 循环延时 初始化代码如下: ```c void init(){ P1_0 = P1_1 = P1_2 = P1_3 = 1; // 数码管选择引脚初始化为高电平 P2 = 0xff; // 数码管显示引脚初始化为低电平 } ``` 数码管扫描显示代码如下: ```c void display(unsigned char *p){ unsigned char i; for(i=0; i<4; i++){ switch(i){ case 0: P1_0 = 0; break; case 1: P1_1 = 0; break; case 2: P1_2 = 0; break; case 3: P1_3 = 0; break; } P2 = *(p+i); delay(1); // 扫描显示周期为1ms P2 = 0xff; // 关闭数码管 switch(i){ case 0: P1_0 = 1; break; case 1: P1_1 = 1; break; case 2: P1_2 = 1; break; case 3: P1_3 = 1; break; } } } ``` 循环延时代码如下: ```c void delay(unsigned int i){ while(i--); } ``` 4. 调用函数 最后,在主函数中调用上述函数即可完成数码管的显示。例如,要显示数字1234,可以这样写: ```c void main(){ init(); while(1){ display(ledData+1); display(ledData+2); display(ledData+3); display(ledData+4); } } ``` 注意,这里使用了ledData+1、ledData+2、ledData+3、ledData+4,因为ledData数组的第一个元素对应数字0,所以要从第二个元素开始显示数字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值