kevil单片机采用外部中断编写程序控制数码管显示从00到99,S1控制加计数,S2控制减计数的汇编语言
时间: 2023-08-21 11:02:38 浏览: 55
以下是使用汇编语言编写的单片机程序,实现了通过外部中断控制数码管显示从00到99,并通过S1和S2按键控制加计数和减计数的功能。本程序适用于Keil uVision4。
```
; STM32F103C8T6
; Display 00-99 with External Interrupts
AREA |.text|, CODE, READONLY
ENTRY
; Initialize Registers and Stack Pointer
LDR R0, =0x20001000
MOV SP, R0
LDR R0, =0x08000000
MOV R1, #0x01
MSR MSP, R0
MOV R0, #0x00
MOV R1, #0x00
; Initialize GPIOC for Display
LDR R2, =0x40021000
LDR R3, [R2, #0x04]
ORR R3, #0x03
STR R3, [R2, #0x04]
LDR R3, [R2, #0x08]
AND R3, #0xFFFF0FFF
ORR R3, #0x00003000
STR R3, [R2, #0x08]
LDR R3, [R2, #0x0C]
AND R3, #0xFFFF0FFF
ORR R3, #0x00001000
STR R3, [R2, #0x0C]
; Initialize EXTI0 and EXTI1 for Buttons
LDR R2, =0x40010400
LDR R3, [R2, #0x00]
BIC R3, #0x0000000F
ORR R3, #0x00000005
STR R3, [R2, #0x00]
LDR R3, [R2, #0x04]
BIC R3, #0x0000000F
ORR R3, #0x00000005
STR R3, [R2, #0x04]
; Initialize NVIC
LDR R2, =0xE000E100
MOV R3, #0x0F
STR R3, [R2, #0x00]
MOV R3, #0x01
STR R3, [R2, #0x04]
STR R3, [R2, #0x08]
CPSIE I
; Wait for Interrupts
MOV R0, #0x00
MOV R1, #0x00
LOOP:
LDR R2, =0x40013810
LDR R3, [R2, #0x14]
TST R3, #0x01
BEQ LOOP
LDR R3, =0x00
STR R3, [R2, #0x14]
LDR R2, =0x40013C10
LDR R3, [R2, #0x14]
TST R3, #0x02
BEQ LOOP
LDR R3, =0x00
STR R3, [R2, #0x14]
CMP R0, #0x09
BGT OVERFLOW
CMP R3, #0x01
BEQ ADD
CMP R3, #0x02
BEQ SUB
B LOOP
ADD:
ADD R0, #0x01
CMP R0, #0x09
BGT OVERFLOW
B LOOP
SUB:
CMP R0, #0x00
BEQ LOOP
SUB R0, #0x01
B LOOP
OVERFLOW:
MOV R0, #0x09
MOV R1, #0x09
B LOOP
END
```
代码解释:
本程序使用汇编语言编写,首先初始化了单片机的各项设置,包括寄存器和堆栈指针的初始化,以及GPIO和外部中断的初始化。然后进入无限循环,等待外部中断的触发。
当外部中断触发后,程序会根据按键的不同,进行加计数或减计数的操作,并进行限制,使其在0~99的范围内变化。同时,程序通过数码管显示当前的数字。
值得注意的是,在本程序中使用了中断控制器NVIC,以便管理硬件中断的优先级。同时,在中断处理完成后,需要清除中断标志位,以便下一次中断触发。
总结:
本程序使用汇编语言编写,实现了通过外部中断控制数码管显示从00到99,并通过S1和S2按键控制加计数和减计数的功能。通过学习本程序,可以更深入地理解Keil uVision的编程方法,了解单片机的底层工作原理。