利用单片机来制作一个按钮按下次数的计数器并两位数码显示。在单片机的P3.7管脚接一个按钮,作为手动计数的按钮,用单片机的 P1.0-P1.7和 P2.0-P2.7 接数码管,作为 00-99 计数显示。设计2位数码管电路(采用LED7)用汇编语言
时间: 2024-03-02 21:50:28 浏览: 148
下面是一个基于 8051 单片机的汇编代码实现:
```assembly
ORG 0H
MOV P3,#0FFH ; 将 P3 置为输入模式,P3.7 作为手动计数的按钮
MOV P1,#0H ; 将 P1 置为输出模式,用于控制数码管的位选
MOV P2,#0H ; 将 P2 置为输出模式,用于控制数码管的段选
MOV TMOD,#01H ; 设置计数器模式为模式 1
MOV TH0,#0FC ; 设置计数器初始值为 65535-100 = 0FC9Bh
MOV TL0,#0Bh ; 设置计数器初始值为 65535-100 = 0FC9Bh
SETB TR0 ; 启动计数器
SETB EA ; 全局中断使能
SETB ET0 ; 定时器 0 中断使能
MAIN:
NOP ; 主程序空循环
; 定时器中断服务程序
TIMER0_ISR:
INC COUNT ; 计数器加一
MOV A, COUNT ; 将计数器的值存储到累加器中
CJNE A, #100, SKIP ; 如果计数器的值不等于 100,则跳过下面的语句
CLR COUNT ; 将计数器清零
SKIP:
CALL DISPLAY ; 更新数码管的显示
RETI ; 返回中断结束
; 更新数码管显示的子程序
DISPLAY:
MOV A, COUNT ; 将计数器的值存储到累加器中
DIV AB, #10 ; 将计数器的值除以 10,商存储在 B 中,余数存储在 A 中
MOV P1, #0FEH ; 打开第一个数码管的显示
MOV P2, DIGITS+A ; 将余数的对应的码表值送到段选端口
ACALL DELAY ; 等待一段时间,以防止闪烁
MOV P1, #0FDH ; 打开第二个数码管的显示
MOV P2, DIGITS+B ; 将商的对应的码表值送到段选端口
ACALL DELAY ; 等待一段时间,以防止闪烁
RET ; 返回主程序
; 延时子程序,用于等待一段时间,以防止数码管闪烁
DELAY:
MOV R7, #10H
DELAY_LOOP:
DJNZ R7, DELAY_LOOP_1
DJNZ R6, DELAY_LOOP
RET
DELAY_LOOP_1:
NOP
RET
COUNT DB 0 ; 计数器的初始值为 0
DIGITS DB 0C0H, 0F9H, 0A4H, 0B0H, 099H, 092H, 082H, 0F8H, 080H, 090H ; 0-9 的码表
END
```
在上面的代码中,我们首先将 P3 设置为输入模式,用于连接手动计数的按钮;将 P1 和 P2 设置为输出模式,用于控制数码管的位选和段选;然后设置定时器 0 的模式为模式 1,以 10ms 的时间间隔产生中断。
在主程序中,我们只是使用了一个 NOP 语句,因为计数器和数码管的显示都是在中断服务程序中完成的。在定时器 0 中断服务程序中,我们先将计数器加一,然后判断计数器的值是否等于 100,如果等于,则将计数器清零;接着调用 DISPLAY 子程序来更新数码管的显示。
在 DISPLAY 子程序中,我们首先将计数器的值除以 10,商存储在 B 中,余数存储在 A 中,然后依次将余数和商对应的码表值送到两个数码管的段选端口,在每次送数码值之后,都会等待一段时间,以防止数码管闪烁。
最后,我们定义了一个 COUNT 变量来存储计数器的值,初始值为 0;同时定义了一个 DIGITS 数组来存储 0-9 的码表值。
阅读全文