汇编语言实现 LED 指示灯控制,根据计算结果 Y 的不同情况点亮不同的 LED
以下是使用汇编语言编写的程序,用于根据计算结果 Y 的不同情况,控制三个 LED 指示灯亮灭,分别对应 Y 为整数、Y 小于 1 和 Y 大于 1 的情况。程序还包含四舍五入子程序,用于处理计算结果的余数。
ORG 0x0000 ;程序起始地址
MOV DPTR, #0x4000 ;将DPTR寄存器的值设置为0x4000,即将要存放被除数的内存地址
MOV R0, #10 ;将R0寄存器的值设置为10,即除数
MOV R1, #0 ;将R1寄存器的值设置为0,即商的初始值
DIV_LOOP:
MOVX A, @DPTR ;将DPTR所指内存单元的值读入A寄存器,即读取被除数
INC DPTR ;DPTR寄存器的值加1,指向下一个内存单元
DIV AB ;A除以B,商存入A寄存器,余数存入B寄存器
JC ROUND ;如果余数大于等于除数,则调用四舍五入子程序
ADD A, R1 ;将商累加到A寄存器中
MOV R1, A ;将A寄存器中的值存入R1寄存器中,即更新商的值
SJMP DIV_LOOP ;跳转到DIV_LOOP,即继续除法运算
ROUND:
MOV A, R1 ;将商的值存入A寄存器中
RL A, #1 ;将A寄存器中的值左移一位,即将商乘以2
JC ROUND1 ;如果左移后高位为1,即商乘以2后大于1,则跳转到ROUND1
ROUND2:
INC R1 ;将商加1
SJMP END ;跳转到END,即程序结束
ROUND1:
INC R1 ;将商加1
CJNE R1, #100, ROUND2 ;如果商小于100,则跳转到ROUND2,否则直接跳转到END
END:
MOV A, R1 ;将商的值存入A寄存器中
CMP A, #1 ;将A寄存器中的值与1进行比较
JZ INTEGER ;如果相等,则跳转到INTEGER
JB FRACTION ;如果A寄存器中的值小于1,则跳转到FRACTION
DEC A ;将A寄存器中的值减1
SJMP FRACTION ;跳转到FRACTION
INTEGER:
SETB P1.0 ;使L1灯亮
SJMP DELAY ;跳转到DELAY
FRACTION:
DJNZ A, FRACTION ;将A寄存器中的值减1,如果不为0,则跳转到FRACTION
SETB P1.1 ;使L2灯亮
SJMP DELAY ;跳转到DELAY
ROUNDING:
DJNZ A, ROUNDING ;将A寄存器中的值减1,如果不为0,则跳转到ROUNDING
SETB P1.2 ;使L3灯亮
SJMP DELAY ;跳转到DELAY
DELAY:
MOV R2, #0x40 ;将R2寄存器的值设置为0x40,即延时1秒的计数器的初始值
DELAY_LOOP:
DJNZ R2, DELAY_LOOP ;将R2寄存器中的值减1,如果不为0,则跳转到DELAY_LOOP
RET ;子程序结束,返回主程序
END
程序说明:
- 程序首先将被除数的地址存入DPTR寄存器,并设置除数和商的初始值。
- 循环读取被除数并执行除法运算,将商累加到R1寄存器中。
- 如果余数大于等于除数,则调用ROUND子程序进行四舍五入处理。
- 四舍五入子程序根据商的值判断是否需要加1,并最终将商存入A寄存器中。
- 根据商的值,程序控制不同的LED灯亮灭:
- 若商为整数,则点亮L1灯;
- 若商小于1,则点亮L2灯;
- 若商大于1,则点亮L3灯。
- 程序最后调用DELAY子程序进行1秒的延时。
程序功能:
本程序实现了根据计算结果 Y 的不同情况,控制三个 LED 指示灯亮灭的功能。程序包含四舍五入子程序,能够对计算结果进行更精确的处理。
注意事项:
- 该程序仅供参考,具体的硬件连接和电路设计需根据实际情况进行调整。
- 程序中的寄存器和内存地址需要根据实际硬件平台进行修改。
- 程序中使用的LED灯需要连接到相应的IO端口。
- 程序中的延时时间可以通过修改R2寄存器的值进行调整。
原文地址: https://www.cveoy.top/t/topic/nWwW 著作权归作者所有。请勿转载和采集!