yjmwxwx 发表于 2017-12-9 02:17:33

STM32F030键盘输入十六进制码编程的程序

有朋友要51的我不会写,写个CORTEX-M0的。

其实应该可以在M0上编写好程序通过串口烧写到51,但是我不懂协议所以不会写。

这个程序实现键盘输入16进制并且通过数码管显示出来,每输入8个16进制数内存地址加4,支持2K编程空间,编写完同时按8和C写入FLASH,没有松手检测哦,看到数码管灭要赶快松手。写到FLASH后按0和4键进入编写好的程序。

瞎玩哦别拍砖啦

        @ stm32f030f4p6 asm
       .thumb               
         .syntax unified
.section .data       
               .equ STACKINIT,               0x20001000

        .equ shumaguanma,        0x20000000
        .equ chengxubiao,        0x20000100
        .equ chengxuzhizhen,        0x200000fc
        .equ jianpanzhizhen,        0x200000f8
        .equ anjianhao,                0x200000f4
        .equ anjiancishu,        0x200000f0
        .equ anjian32weipianyi,        0x200000ec
shumaguanmabiao:       
        .int 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e
shumaguanshuaxinbiao:
        .int 0xfe00,0xfd00,0xfb00,0xf700,0xef00,0xdf00,0xbf00,0x7f00,0
jianpansaomiaoma:
        .int 0x80,0x40,0x20,0x10
anjianma:
        .byte 0x18,0x28,0x48,0x88,0x14,0x24,0x44,0x84,0x12,0x22,0x42,0x82,0x11,0x21,0x41,0x81,0x13
.section .text
vectors:      
      .word STACKINIT         
      .word _start + 1      
      .word _nmi_handler + 1
      .word _hard_fault+ 1
      .word 0
      .word 0   
      .word 0
        .word 0
        .word 0
        .word 0
        .word 0
        .word _svc_handler +1
        .word 0
        .word 0
        .word _pendsv_handler +1
        .word 0 @_systick +1               @ 15   
        .word 0   @ _wwdg +1          @ 0
        .word 0   @_pvd +1            @ 1
        .word 0   @_rtc +1            @ 2
        .word 0   @_flash +1          @ 3
        .word 0   @ _rcc + 1          @ 4
        .word 0      @_exti0_1+1      @ 5
        .word 0      @ _exti2_3 +1      @ 6
        .word 0       @_exti4_15 +1   @ 7
        .word 0                         @ 8
        .word 0         @_dma1_1+1    @ 9
        .word 0    @_dma1_2_3 +1      @ 10
        .word 0       @_dma1_4_5 +1   @ 11
        .word 0 @_adc1 +1          @ 12
        .word 0       @_tim1_brk_up +1@ 13
        .word 0      @ _tim1_cc +1    @ 14
        .word 0         @_tim2 +1       @ 15
        .word 0          @_tim3 +1      @ 16
        .word 0                         @ 17
        .word 0                              @ 18
        .word @_tim14 +1    @ 19
        .word 0                         @ 20
        .word 0         @_tim16 +1      @ 21
        .word 0         @_tim17 +1      @ 22
        .word 0          @_i2c   +1   @ 23
        .word 0                         @ 24
        .word 0         @_spi   +1    @ 25
        .word 0                         @ 26
        .word 0         @_usart1 +1   @ 27
       
_start:
shizhong:
        ldr r0, = 0x40021000 @ rcc
        ldr r2, = 0x40022000   @FLASH访问控制
        movs r1, # 0x32
        str r1,          @FLASH缓冲 缓冲开启
        ldr r0, = 0x40021000 @ rcc
        ldr r1, = 0x100002
        str r1,
        ldr r1, = 0x1000001
        str r1,
dengrc:
        ldr r1,
        lsls r1, # 30
        bpl dengrc
dengpll:
        ldr r1,
        lsls r1, # 6
        bpl dengpll
        @0x34时钟控制寄存器 2 (RCC_CR2)
        movs r1, # 0x01
        str r1, @ HSI开14M时钟
dengdai14mshizhongwending:
        ldr r1,
        lsls r1, r1, # 30   @ 左移30位
        bpl dengdai14mshizhongwending@ 等待14M时钟稳定

neicunqingling:
        ldr r0, = 0x20000000
        movs r1, # 0
        ldr r3, = 0x1000
neicunqinglingxunhuan:
        subs r3, # 4
        str r1,
        bne neicunqinglingxunhuan

_waisheshizhong:               @ 外设时钟
        @+0x14=RCC_AHBENR
        @0=DMA @2=SRAM @4=FLITF@6=CRC @17=PA @18=PB @19=PC @20=PD @22=PF
        ldr r0, = 0x40021000
        ldr r1, = 0x460005
        str r1,

        @+0x18外设时钟使能寄存器 (RCC_APB2ENR)
        @0=SYSCFG @5=USART6EN @9=ADC @11=TIM1 @12=SPI1 @14=USART1 @16=TIM15 @17=TIM16 @18=TIM17 @22=DBGMCU
        ldr r1, = 0xa00
        str r1,
        @+0X1C=RCC_APB1ENR
        @1=TIM3 @4=TIM6 @5=TIM7 @8=TIM14 @11=WWDG @14=SPI @17=USRT2 @18=USART3 @20=USART5 @21=I2C1 @22=I2C2 @23=USB @28=PWR
               
io_she_zhi:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @a(0x48000000)b(0x48000400)c(0x48000800)d(0x48000c00)f(0x48001400)
        @ 输入(00),通用输出(01),复用功能(10),模拟(11)
        @偏移0x4 = 端口输出类型 @ (0 推挽),( 1 开漏)
        @偏移0x8 = 输出速度00低速, 01中速, 11高速
        @偏移0xC = 上拉下拉 (00无上下拉,01 上拉, 10下拉)
        @偏移0x10 = 输入数据寄存器
        @偏移0x14 = 输出数据寄存器
        @偏移0x18 = 端口开0-15置位
        @偏移0x28 = 端口关
        @0X20 = 复用低
        @GPIO口0(0-3位)每个IO口占用4位
        @ AF0 = 0X0000, AF1 = 0X0001, AF2 = 0X0010 AF3 = 0X0011, AF4 = 0X0100
        @ AF5 = 0X0101, AF6 = 0X0111, AF7 = 0X1000
        @0x24 = 复用高
        @GPIO口8 (0-3位)每个IO口占用4位
        @ AF0 = 0X0000, AF1 = 0X0001, AF2 = 0X0010 AF3 = 0X0011, AF4 = 0X0100
        @ AF5 = 0X0101, AF6 = 0X0111, AF7 = 0X1000
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        ldr r0, = 0x48000000
        ldr r1, = 0x28045500
        str r1,
        ldr r2, = 0x240000aa
        str r2,
       
       
        ldr r0, = 0x48001400
        movs r1, # 0x05
        str r1,

        ldr r0, = anjian32weipianyi
        movs r1, # 28
        str r1,
       
       
_shiyan111:
        ldr r0, = 0x48000010
        ldrb r1,
        cmp r1, # 0x13                        @把编好的程序写到FLASH,空间2K
        beq _xieflash
        ldr r0, = 0x48000010
        ldrb r1,
        cmp r1, # 0x1c                       
        beq _jiqimachengxu                @跳转到机器码程序
        bl _juzhenjianpan
        ldr r6, = anjiancishu
        ldr r7,
        cmp r7, # 16
        bls _tiaoguoanjianzizeng
        movs r7, # 0
        str r7,
        ldr r0, = chengxubiao
        ldr r1, = chengxuzhizhen
        ldr r2,
        ldr r4, = anjian32weipianyi
        ldr r5,
        ldr r3, = anjianhao
        ldr r3,
        ldr r6,
        lsls r3, r3, r5
        orrs r3, r3, r6
        str r3,
        subs r5, r5, # 0x04
        bpl _anjianyiwei
        movs r5, # 28
        adds r2, r2, # 0x04
        str r2,
_anjianyiwei:       
        str r5,


_tiaoguoanjianzizeng:       
        ldr r3, = chengxubiao
        ldr r2, = chengxuzhizhen
        ldr r2,
        ldr r0,
        ldr r2, = shumaguanma
        bl _zhuanshumaguanma
        movs r0, # 8
        lsls r0, r0, # 2
        bl _xieshumaguan
        b _shiyan111

_juzhenjianpan:
        push {r0-r5}
        ldr r0, = jianpansaomiaoma
        ldr r1, = jianpanzhizhen
        ldr r3, = anjianhao
        ldr r4, = 0x48000000
        ldr r2,
        adds r2, r2, # 4
        cmp r2, # 16
        bne _tiaochuanjiansaomiao
        movs r2, # 0
_tiaochuanjiansaomiao:
        str r2,
        ldrb r1,
        strb r1,

        ldrb r1,
        lsls r2, r1, # 28
        lsrs r2, r2, # 28
        movs r2, r2
        beq _meianjian
        ldr r0, = anjianma
        movs r6, # 0
_zhaoanjianma:       
        ldrb r2,
        cmp r1, r2
        beq _youanjian
        adds r6, r6, # 1
        cmp r6, # 16
        beq _meianjian
        b _zhaoanjianma
_youanjian:
        ldr r0, = anjiancishu
        ldr r1,
        adds r1, r1, # 1
        str r1,
        str r6,
       
_meianjian:       
        pop {r0-r5}
        bx lr

_jiqimachengxu:
        ldr r0, = 0x8000800
        mov pc, r0
_xieflash:                        @ flsh解锁
        ldr r0, = 0x40022000
        ldr r1, = 0x45670123
        str r1,
        ldr r1, = 0xcdef89ab
        str r1,
                                        @擦除2页
        movs r5, # 2
        ldr r4, = 0x8000800
        movs r7, # 1
        lsls r7, r7, # 10
_flashmang:
        ldr r2,
        lsls r2, r2, # 31
        bmi _flashmang
        movs r1, # 2
        str r1,
        str r4,
        movs r1, # 0x42
        str r1,
        add r4, r4, r7
        subs r5, # 1
        bne _flashmang
                                                @写FLASH
        ldr r7, = 0x8000800
        ldr r4, = 0x20000100
        movs r5, # 0
        movs r6, # 0x01
        lsls r6, r6, # 9
_flashmang1:
        ldr r2,
        lsls r2, r2, # 31
        bmi _flashmang1
        movs r1, # 1
        str r1,
        ldrh r3,
        strh r3,
        adds r5, r5, # 2
_flashmang2:
        ldr r2,
        lsls r2, r2, # 31
        bmi _flashmang2
        ldrh r3,
        strh r3,
        adds r5, r5, # 2
        subs r6, r6, # 1
        bne _flashmang1
_flashmang3:
        ldr r2,
        lsls r2, r2, # 31
        bmi _flashmang3
        movs r1, # 2
        str r1,
        ldr r3, = 0x8009c00         @ 擦去更新的一页
        str r3,
        movs r1, # 0x42
        str r1,
_flashmang4:
        ldr r2,
        lsls r2, r2, # 31
        bmi _flashmang4
        @movs r1, # 0x80
        @str r1,                           @flsh上锁
        ldr r0, = 0xe000ed0c
        ldr r1, = 0x05fa0004
        str r1,                           @复位


       
_zhuanshumaguanma:                        @ 转数码管码
                @ R0要转的数据,R2结果表首地址
        push {r0-r7,lr}
        ldr r7, = shumaguanmabiao
        movs r1, # 0
_xunhuanqiuma:
        movs r4, # 28
        subs r4, r4,r1
        mov r5, r0
        lsls r5, r5, r4
        lsrs r5, r5, # 28
        lsls r5, r5, # 2
        ldr r6,
        str r6,
        adds r1, r1, # 0x04
        cmp r1, # 32
        bne _xunhuanqiuma
       
       
        pop {r0-r7,pc}

       
_xieshumaguan:                       @ r0=位数 @数码管码
        push {r0-r7,lr}
        movs r7, # 0
        mov r6, r0
        ldr r5, = shumaguanma
        ldr r2, = shumaguanshuaxinbiao
_shumaguanshuaxin:
        ldr r3,
        ldr r4,
        orrs r4, r4, r3
        mov r0, r4
        bl _xie595
        addsr7, r7, # 4
        cmp r7, r6
        bls _shumaguanshuaxin
        pop {r0-r7,pc}

_xie595:       @ R0=要写的数据
        push {r0-r7,lr}
        mov r5, r0
        ldr r0, =0x200
        movs r6, # 0x02
        movs r7, # 0x01
        movs r3, # 16   @16位
        movs r1, # 0x01
_xunhuan595:
        ldr r2, = 0x48001400
        str r7,
        bl _yanshi
        tst r5, r1
        bne _xie595_0
        ldr r2, = 0x48000000
        str r0,
        b _suocun595
_xie595_0:
        ldr r2, = 0x48000000
        str r0,
_suocun595:
        bl _yanshi
        lsrs r5, # 1
        ldr r2, = 0x48001400
        str r7,
        bl _yanshi
        subs r3, r3, # 1
        bne _xunhuan595
        ldr r2, = 0x48001400
        str r6,
        bl _yanshi
        ldr r2, = 0x48001400
        str r6,
        bl _yanshi
        pop {r0-r7,pc}
       

_yanshi:
        push {r7,lr}
        ldr r7, = 30
_yanshi11:
        subs r7, # 1
        bne _yanshi11
        pop {r7,pc}

_chufa:                        @软件除法
        @ r0 除以 r1 等于 商(r0)余数R1
        push {r1-r4,lr}
        cmp r0, # 0
        beq _chufafanhui
        cmp r1, # 0
        beq _chufafanhui
        mov r2, r0
        movs r3, # 1
        lsls r3, r3, # 31
        movs r0, # 0
        mov r4, r0
_chufaxunhuan:
        lsls r2, r2, # 1
        adcs r4, r4, r4
        cmp r4, r1
        bcc _chufaweishubudao0
        adds r0, r0, r3
        subs r4, r4, r1
_chufaweishubudao0:
        lsrs r3, r3, # 1
        bne _chufaxunhuan
_chufafanhui:
        pop {r1-r4,pc}
       
_nmi_handler:
        bx lr
_hard_fault:
        bx lr
_svc_handler:
        bx lr
_pendsv_handler:
        bx lr

       


yjmwxwx 发表于 2017-12-9 02:41:43





EHeaven 发表于 2017-12-9 09:18:20

头回见到用汇编写的ARM程序!高手!不过编写好的程序直接给51用,就我知道的来说,应该不行吧……

zystbbs 发表于 2017-12-9 10:29:04

51还是c简单吧。
页: [1]
查看完整版本: STM32F030键盘输入十六进制码编程的程序