外部中断0:按下KEY1,在四位数码管闪烁显示“ERR-”(汇编语言)

 ORG     0000H
    LJMP    START
    ORG     000BH
LJMP    TM0_ISR             ;定时器0中断程序入口    
ORG     0030H
START:
    ACALL   TM0_INIT
    MOV     DPTR,   #TAB1
    MOV     R1  ,   #01H        ;用于选择显示的表
    SETB    EA
MAIN:
ACALL   XZTAB               ;选择显示的字形码表    
ACALL   DTSEG               ;动态数码管显示
    AJMP    MAIN
TM0_INIT:
    ANL     TMOD,   #0F0H       ;初始化定时器0
ORL     TMOD,   #01H        ;设置定时器0工作方式1
MOV     TL0 ,   #00H        ;?设置定时器初值 50ms
    MOV     TH0 ,   #4CH        ;设置定时器初值
CLR     TF0                 ;清除TF0标志
SETB    TR0                 ;定时器0开始计时
SETB    ET0                 ;开启T0溢出中断
RET
XZTAB:
    XZTAB1:
        CJNE    R1  ,   #1  ,   XZTAB2  ;根据R1的值选择字形码表
        MOV     DPTR,   #TAB1          
        RET

    XZTAB2:
        CJNE    R1  ,   #2  ,   XZTAB_RET
        MOV     DPTR,   #TAB2
    XZTAB_RET:
        RET
DTSEG:
    MOV     R2  ,   #0          ;R2清0

FOUR:
    ANL     P2  ,   #0E3H     ;P2.2 P2.3 P2.4置0
    ORL     P2  ,   #1CH      ;选择左边第1位数码管显示
    MOV     A   ,   R2
    MOVC    A   ,   @A+DPTR
    MOV     P0  ,   A        ;字形码输出到数码管
    LCALL   DELAY100US
    MOV     P0  ,   #00H     ;消影
THREE:
    INC     R2
    ANL     P2  ,   #0E3H
    ORL     P2  ,   #18H
    MOV     A   ,   R2
    MOVC    A   ,   @A+DPTR
    MOV     P0  ,   A
    LCALL   DELAY100US
    MOV     P0  ,   #00H;
TWO:
    INC     R2
    ANL     P2  ,   #0E3H
    ORL     P2  ,   #14H
    MOV     A   ,   R2
    MOVC    A   ,   @A+DPTR
    MOV     P0  ,   A
    LCALL   DELAY100US
    MOV     P0  ,   #00H;
ONE:
    INC     R2
    ANL     P2  ,   #0E3H
    ORL     P2  ,   #10H
    MOV     A   ,   R2
    MOVC    A   ,   @A+DPTR
    MOV     P0  ,   A
    LCALL   DELAY100US
    MOV     P0  ,   #00H;
    RET
TM0_ISR:
    MOV     TL0 ,   #00H        ;重装定时器初值50ms
    MOV     TH0 ,   #4CH        ;重装定时器初值 
    INC     R0
    CJNE    R0  ,   #20 ,RETURN 
    MOV     R0  ,   #0
    INC     R1          
    CJNE    R1  ,   #3  ,RETURN ;1~3循环
    MOV     R1  ,   #1
RETURN:
    RETI
DELAY100US:			
	PUSH 30H
	MOV 30H,#41
NEXT100US:
	DJNZ 30H,NEXT100US
	POP 30H
	RET
TAB1:
    DB      79H,31H,31H,40H,79H,31H,31H,40H
TAB2:
    DB      00H,00H,00H,00H,00H,00H,00H,00H



    END;

运行结果如下: 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个UCOSIII外部中断控制key0、key1、key2按键的代码示例: ```c #include "stm32f4xx.h" #include "ucos_ii.h" #define KEY0_GPIO_PORT GPIOA #define KEY0_GPIO_PIN GPIO_Pin_0 #define KEY0_EXTI_LINE EXTI_Line0 #define KEY0_EXTI_PORT EXTI_PortSourceGPIOA #define KEY0_EXTI_PIN EXTI_PinSource0 #define KEY0_EXTI_IRQ EXTI0_IRQn #define KEY1_GPIO_PORT GPIOE #define KEY1_GPIO_PIN GPIO_Pin_2 #define KEY1_EXTI_LINE EXTI_Line2 #define KEY1_EXTI_PORT EXTI_PortSourceGPIOE #define KEY1_EXTI_PIN EXTI_PinSource2 #define KEY1_EXTI_IRQ EXTI2_IRQn #define KEY2_GPIO_PORT GPIOE #define KEY2_GPIO_PIN GPIO_Pin_3 #define KEY2_EXTI_LINE EXTI_Line3 #define KEY2_EXTI_PORT EXTI_PortSourceGPIOE #define KEY2_EXTI_PIN EXTI_PinSource3 #define KEY2_EXTI_IRQ EXTI3_IRQn static OS_EVENT* key_sem; void Key_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); GPIO_InitStructure.GPIO_Pin = KEY0_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(KEY0_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure); SYSCFG_EXTILineConfig(KEY0_EXTI_PORT, KEY0_EXTI_PIN); SYSCFG_EXTILineConfig(KEY1_EXTI_PORT, KEY1_EXTI_PIN); SYSCFG_EXTILineConfig(KEY2_EXTI_PORT, KEY2_EXTI_PIN); EXTI_InitStructure.EXTI_Line = KEY0_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE; EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = KEY2_EXTI_LINE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0f; NVIC_InitStructure.NVIC_IRQChannel = KEY0_EXTI_IRQ; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQ; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = KEY2_EXTI_IRQ; NVIC_Init(&NVIC_InitStructure); } void Key_ISR(uint8_t key) { OS_ERR err; EXTI_ClearITPendingBit(key == 0 ? KEY0_EXTI_LINE : key == 1 ? KEY1_EXTI_LINE : KEY2_EXTI_LINE); OSSemPost(key_sem, OS_OPT_POST_ALL, &err); } void Key_Task(void* pdata) { OS_ERR err; uint8_t key; while (1) { OSSemPend(key_sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err); if (GPIO_ReadInputDataBit(KEY0_GPIO_PORT, KEY0_GPIO_PIN) == RESET) { key = 0; } else if (GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == RESET) { key = 1; } else if (GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == RESET) { key = 2; } // 处理按键按下事件 printf("Key%d pressed!\r\n", key); } } int main(void) { OS_ERR err; OSInit(); Key_Init(); key_sem = OSSemCreate(0, &err); OSTaskCreate(Key_Task, NULL, OSTaskStkChk, 10, 0, NULL, &err); OSStart(); return 0; } void HardFault_Handler(void) { while (1); } ``` 上述代码中,`Key_Init()`函数用于初始化三个按键所对应的GPIO口、中断线和中断服务函数。在中断服务函数`Key_ISR()`中,使用`OSSemPost()`函数发送信号量,以通知任务处理按键按下事件。而在任务函数`Key_Task()`中,则使用`OSSemPend()`函数等待信号量,并在信号量被触发时通过GPIO口读取按键状态,从而确定是哪个按键被按下,并处理相应的事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风起晨曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值