用汇编语言编写控制51单片机第一个数码管轮流显示零到九的代码,用到延时子程序和查表法
时间: 2024-02-09 20:11:27 浏览: 87
好的,以下是用汇编语言编写控制51单片机第一个数码管轮流显示零到九的代码,使用了延时子程序和查表法:
```
; 51单片机第一个数码管轮流显示0~9
; 使用P0口控制数码管显示,使用延时子程序和查表法实现数码管的轮流显示
ORG 0 ; 程序起始地址
MOV P0, #0 ; 初始化P0口输出低电平
MOV TH0, #0 ; 定时器初值
MOV TL0, #0 ; 定时器初值
SETB ET0 ; 开启定时器0中断
SETB EA ; 开启总中断
MOV R0, #0 ; 初始化计数器,用于控制数码管显示的数字
LOOP: ; 主循环
MOV A, R0 ; 将计数器的值赋给累加器A
ANL A, #0x0F ; 只保留A的低4位
MOV R1, A ; 将A的值赋给R1,用于查表
MOV A, P0 ; 保存P0口的输出状态
CALL DELAY ; 调用延时子程序,延时一段时间
MOV P0, #0 ; 将P0口输出低电平
INC R0 ; 计数器加1
CJNE R0, #10, LOOP ; 如果计数器不等于10,则跳转到主循环,否则程序结束
DELAY: ; 延时子程序
MOV R2, #250 ; 初始化计数器R2
DELAY_LOOP:
DJNZ R2, DELAY_LOOP ; 循环250次
RET ; 返回
TABLE: ; 查表法,用于控制数码管的显示
DB 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
TIMER0_ISR: ; 定时器0中断服务程序
MOV A, R1 ; 将R1的值作为表的索引,查找对应的数码管显示值
MOV A, TABLE(A) ; 从表中获取数码管显示值
MOV P0, A ; 将数码管显示值输出到P0口,控制数码管显示
RETI ; 返回中断结束
END ; 程序结束
```
上述代码中,我们仍然使用P0口控制数码管显示,使用定时器0中断实现数码管的轮流显示。不同的是,在主循环中,我们使用延时子程序实现了延时功能,使数码管显示的数字可以在一定的时间间隔内切换。同时,我们使用了查表法来控制数码管的显示,将数码管显示值保存在一个表中,每次定时器0中断服务程序被触发时,从表中获取对应的数码管显示值,并将其输出到P0口,控制数码管显示。程序将会循环执行10次,分别显示0~9,然后结束程序。
阅读全文