关于汇编编写51开发板动态数码管的总结

一、原理图

        首先知道连接的引脚是最关键的,从图片可以看出来,控制显示信号的是p0~P7,这个称为段选,而上面的LED1~LED8则是控制是否显示的,称为位选。简单来说就是段选对应值,位选对应是否亮

        LED1~LED8由连接到了74HC138译码器,这样就成了由P22、P23、P24三位引脚控制了,而三位正好对应8种,000对应LED1,001对应LDE2,010对应LDE3,011对应LED4,100对应LED5,101对应LED6,10对应LED7,111对应LED8。通过对P22、P23、P24的赋值从而选择对应的LED

二、两种查表方式

汇编中有两种查表方式

一种是 MOVC A,@A+PC

另一种是 MOVC A,@A+DPTR

        都是寄存器间接寻址,字面意思上就是A的值叫上PC或者DPTR中的值再传回A.第一种呢,我下面的代码用的就是这种,下面会说。PC寄存器就是储存下一条指令的地址的

第二种,举个例子就明白了

首先定义一个码表

ORG 1000H

DB 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90

接着把码表的位置给DPTR

MOV DPTR,#1000H

给A赋初值

MOV A,#1

MOV A,@A+DPTR

这是A的值变成了码表的0XF9,显示在共阳极数码管上就是1

三、代码编写

首先,一定一定一定要搞清楚你的数码管模块是共阳极还是共阴极。

区分方法如下:

1.发光单元连接方式不同,按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。

2.工作原理不同,共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

3.数码管公共极的连接不同,共阳数码管在应用时应将公共极COM接到+5V,共阴数码管在应用时应将公共极COM接到地线GND上。

下面代码奉上:

ORG 0000H
LJMP START
ORG 0030H

START:
MOV 20H,#2
MOV 21H,#0
MOV 22H,#2
MOV 23H,#2

MAIN:LCALL DISP
AJMP MAIN

DISP: MOV A,20H  
ACALL SEG7;  //查表操作
MOV P0,A
MOV p2,#00H


ACALL DLY
MOV A,21H
ACALL SEG7
MOV p0,A
MOV P2,#04H

ACALL DLY
MOV A,22H
ACALL SEG7
MOV p0,A
MOV P2,#08H

ACALL DLY
MOV A,23H
ACALL SEG7
MOV P0,A
MOV P2,#0CH
ACALL DLY
RET

DLY:MOV R7,#2
D1:MOV R6,#40
DJNZ R6,$
DJNZ R7,D1
RET

SEG7:INC A
MOVC A,@A+PC
RET
DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
END

        在数码管上显示2022四个数字,我这个是共阴极的数码管。其中SEG7为查表操作的子程序,PC就是下面的码表。因为码表是从0开始的,因此,要取0就得是1,要取2就得是3,因此A必须要加1,因为A是偏移量。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的51单片机电子钟汇编语言数码管显示代码示例: ``` ; 定义常量 LED_DATA EQU P1 ; 数码管数据口 LED_CTRL EQU P2 ; 数码管控制口 ; 定义变量 LED_SEG DB 0xFF, 0xFF, 0xFF, 0xFF ; 数码管段码值 LED_POS DB 0, 1, 2, 3 ; 数码管位选值 ; 程序入口 MAIN: ; 初始化 MOV LED_CTRL, #0x00 ; 数码管控制口初始值为0 ; 主循环 LOOP: ; 获取当前时间 ; 这里省略了 RTC 模块的代码 ; 显示小时 MOV A, RTC_HOUR_VAL ; 获取小时值 MOV LED_DATA, LED_SEG + A ; 设置数码管段码值 MOV LED_CTRL, #0x01 << LED_POS ; 设置数码管位选值 CALL DELAY ; 延时一段时间 ; 显示分钟 MOV A, RTC_MIN_VAL ; 获取分钟值 MOV LED_DATA, LED_SEG + A ; 设置数码管段码值 MOV LED_CTRL, #0x01 << LED_POS ; 设置数码管位选值 CALL DELAY ; 延时一段时间 ; 显示秒钟 MOV A, RTC_SEC_VAL ; 获取秒钟值 MOV LED_DATA, LED_SEG + A ; 设置数码管段码值 MOV LED_CTRL, #0x01 << LED_POS ; 设置数码管位选值 CALL DELAY ; 延时一段时间 ; 跳回主循环 SJMP LOOP ; 延时函数 DELAY: MOV R7, #255 DELAY1: MOV R6, #255 DELAY2: DJNZ R6, DELAY2 DJNZ R7, DELAY1 RET ``` 该示例代码使用了51单片机的P1口和P2口来控制数码管的显示。其中,LED_SEG定义了数码管的段码值,LED_POS定义了数码管每个位的位选值。在主循环中,通过获取当前时间并设置数码管数据和位选值来实现数码管的显示。DELAY函数仅仅是一个简单的延时函数,用于实现一定的延时效果。请注意,该代码仅仅是一个简单的示例,实际的电子钟需要更多的功能和更复杂的代码来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值