STM32 汇编语言,按键控制数码管显示 下载本文

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;按键控制数码管显示;;;;;;;;;;;;;;;;;;;;; ;;共阳极接在PE口(PE[0..7]);;;;;;;;;;;;;;;;;;;;;;;;; ;;按下按键则显示加1,显示0~F;;;;;;;;;;;;;;;;;;;;;;;;;

;;2011-5-3 by 追梦 ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BIT2 EQU 0X00000004 BIT6 EQU 0X00000040 BIT8 EQU 0X00000100

GPIOE EQU 0X40011800 ;GPIOE 地址 GPIOE_CRL EQU 0X40011800 ;低配置寄存器 GPIOE_CRH EQU 0X40011804 ;高配置寄存器

GPIOE_ODR EQU 0X4001180C ;输出,偏移地址0Ch

GPIOE_BSRR EQU 0X40011810 ;低置位,高清除偏移地址10h GPIOE_BRR EQU 0X40011814 ;清除,偏移地址14h IOPEEN EQU BIT6 ;GPIOE使能位 IOPAEN EQU BIT2 ;GPIOA使能位 KEY EQU BIT8 ;按键在PA.8 GPIOA EQU 0X40010800

GPIOA_CRH EQU 0X40010804 ;高配置寄存器 GPIOA_IDR EQU 0X40010808 RCC_APB2ENR EQU 0X40021018

STACK_TOP EQU 0X20002000

AREA RESET,CODE,READONLY DCD STACK_TOP ;MSP主堆栈指针 DCD START ;复位,PC初始值 ENTRY ;指示开始执行 START LDR R1,=RCC_APB2ENR LDR R0,[R1] ;读 LDR R2,=IOPEEN ORR R0,R2 ;改 LDR R2,=IOPAEN ORR R0,R2 ;改 STR R0,[R1] ;写,使能GPIOA,E时钟 ;PE[0..7] 8个引脚均设置成推挽式输出 LDR R0,=0x33333333 LDR R1,=GPIOE_CRL STR R0,[R1] ;PA.8--KEY 浮空输入 MOV R0,#0X04 LDR R1,=GPIOA_CRH

STR R0,[R1] LDR R1,=GPIOE_ODR MOV R0,#0XFF STR R0,[R1] ;初始时数码管无显示 LDR R2,=GPIOA_IDR ;R2用于扫描按键 LDR R5,=DPYTABLE LOOP LDR R3,[R2] AND.W R3,#KEY CMP R3,#0 BNE LOOP PUSH {R0} MOV R0,#10 BL.W DELAY_NMS ;延时10ms用于消除抖动 POP {R0} LDR R3,[R2] AND.W R3,#KEY CMP R3,#0 BNE LOOP ADD R4,#1 CMP R4,#15 BLE KEYIN MOV R4,#0 KEYIN LDRB R0,[R5,R4] EOR R0,#0XFF STR R0,[R1] WAIT_TO_UP ;等待按键弹起 LDR R3,[R2] AND.W R3,#KEY CMP R3,#0 BEQ WAIT_TO_UP B LOOP

;延时R0(ms),误差((R0-1)*4+12)/8us ;延时较长时,误差小于0.1% DELAY_NMS PUSH {R1} ;2个周期 DELAY_NMSLOOP SUB R0,#1 MOV R1,#1000 DELAY_ONEUS SUB R1,#1

NOP NOP NOP CMP R1,#0 BNE DELAY_ONEUS CMP R0,#0 BNE DELAY_NMSLOOP POP {R1} BX LR

;子程序,将R0低八位右循环移一位,高位不变 ByteRor1

PUSH {R1,R2,R3} LDR R3,=0XFFFFFF00 LSR R1,R0,#1 AND R1,#0X0000007F AND R2,R0,#0X01 LSL R2,#7 ORR R1,R2 AND R0,R3 ORR R0,R1 POP {R1,R2,R3} BX LR

;共阴极数码管的码表,使用时先取反 DPYTABLE DCB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,'\\0' END