汇编51单片机实现p3控制流水灯停止和继续,停止需要永久停止并且考虑到延时防抖
时间: 2023-06-02 13:03:01 浏览: 226
以下是汇编代码实现p3控制流水灯停止和继续的功能:
; 定义常量
DELAY_TIME EQU 50000 ; 延时时间,单位为us
BUTTON_PIN EQU P3.2 ; 按钮所在的引脚
; 定义变量
LED_PATTERN DB 0FH ; 初始流水灯模式为0FH
IS_STOPPED DB 0 ; 初始状态为未停止
; 初始化程序
INIT:
MOV P3, #0 ; 将P3引脚全部置为低电平
MOV TMOD, #01H ; 设置Timer0为模式1(16位定时器)
MOV TH0, #0 ; 设置Timer0计数器初值为0
MOV TL0, #0 ; 设置Timer0计数器初值为0
SETB TR0 ; 启动Timer0
SETB EA ; 允许中断
SETB ET0 ; 允许Timer0中断
SETB EX0 ; 允许外部中断0
SETB IT0 ; 外部中断0设置为下降沿触发
MOV LED_PATTERN, #0FH ; 初始化流水灯模式为0FH
MOV IS_STOPPED, #0 ; 初始化状态为未停止
JMP MAIN ; 跳转到主程序
; 外部中断0服务程序
BUTTON_INTERRUPT:
CLR BUTTON_PIN ; 清零按钮引脚
MOV A, BUTTON_PIN ; 读取按钮引脚
CJNE A, #0, SKIP_DEBOUNCE ; 跳过去抖判断
MOV R2, #0 ; 清零计数器
DEBOUNCE_LOOP:
MOV A, BUTTON_PIN ; 读取按钮引脚
CJNE A, #0, BUTTON_INTERRUPT_EXIT ; 如果按钮已松开,则跳出循环
INC R2 ; 计数器加1
CJNE R2, #10, DEBOUNCE_LOOP ; 如果计数器不等于10,则继续抖判断
MOV IS_STOPPED, #1 ; 将状态设置为已停止
JMP BUTTON_INTERRUPT_EXIT ; 跳出中断服务程序
SKIP_DEBOUNCE:
JMP BUTTON_INTERRUPT_EXIT ; 跳出中断服务程序
BUTTON_INTERRUPT_EXIT:
RETI ; 退出中断服务程序
; Timer0中断服务程序
TIMER0_INTERRUPT:
MOV TH0, #-DELAY_TIME/65536 ; 设置Timer0计数器初值高位
MOV TL0, #-DELAY_TIME&0FFFFH ; 设置Timer0计数器初值低位
MOV A, LED_PATTERN ; 读取流水灯模式
RLC A ; 循环左移
MOV LED_PATTERN, A ; 更新流水灯模式
MOV P3, LED_PATTERN ; 更新P3引脚输出
CLR TF0 ; 清除Timer0中断标志
RETI ; 退出中断服务程序
; 主程序
MAIN:
SJMP $ ; 循环等待中断请求
阅读全文