你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

显示屏的程序求助大神帮忙看看什么问题

[复制链接]
xjhylg 提问时间:2020-8-12 00:41 /
超市门口垃圾桶里捡的电子秤拆出显示屏,用STM8S103F3P6编了HT1621的模拟时钟的汇编程序,程序能运行,屏能显示,但有问题,现在的情况是BCD码转换第一个转换的数据会有底数比如小时=1解码后应该是R1=0,R2=0,R3=1,但实际上R1=10,R2=2,R3=5,第一次写STM8的汇编程序,边学边写,折腾一天也没找到原因,求助坛里大神帮忙看看问题出在哪里。 1.jpg 2.jpg
程序如下
stm8/

        #include "mapping.inc"
        #include "STM8S103F3P.inc"

        #DEFINE        LCDSDA        PD_ODR,#1        ;
        #DEFINE        LCDSCK        PD_ODR,#2        ;
        #DEFINE        LCDCS        PD_ODR,#3        ;
       
        #DEFINE        SECFLAG        FLAG,#0        ;
;        #define        txflag        flag,#1

        segment 'ram0'

FLAG                DS.B        1        ;

R1                        DS.B        1        ;
R2                        DS.B        1        ;
R3                        DS.B        1        ;
R4                        DS.B        1        ;
R5                        DS.B        1        ;
R6                        DS.B        1        ;
R7                        DS.B        1        ;
R8                        DS.B        1        ;

SECOND                DS.B        1        ;
MINUTE                DS.B        1        ;
HOUR                DS.B        1        ;
DAY                        DS.B        1        ;

TEMP                DS.B        1        ;
TEMP1                DS.B        1        ;
TEMP2                DS.B        1        ;

LCDDD                DS.B        16        ;

        segment 'rom'
main:
               
;        NOP
;        NOP
       
; initialize SP
        ldw         X,#stack_end
        ldw         SP,X

        ; clear stack
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
        ldw         X,#stack_start
clear_stack:
        clr         (X)
        incw         X
        cpw         X,#stack_end       
        jrule         clear_stack

        ; 下面初始化IO端口
        ; PD3设置成推挽输出
        ; PD7设置成悬浮输入
        LD      A,#$08
        LD      PA_DDR,A        ; 将PD3设置成输出
        LD      A,#$08
        LD      PA_CR1,A        ; 将PD3设置成推挽输出
        LD      A,#00
        LD      PA_CR2,A        ;
       
        LD      A,#$7E
        LD      PD_DDR,A        ; 将PD3设置成输出
        LD      A,#$7E
        LD      PD_CR1,A        ; 将PD3设置成推挽输出
        LD      A,#00
        LD      PD_CR2,A        ;
       
        ; 初始化A/D模块
;        LD      A,#$00
;        LD      ADC_CR2,A                ; A/D结果数据左对齐
;        LD      A,#$00
;        LD      ADC_CR1,A                ; ADC时钟=主时钟/2=1MHZ
                                                                ; ADC转换模式=单次
                                                                ; 禁止ADC转换
;        LD      A,#$03
;        LD      ADC_CSR,A                 ; 选择通道3
;        LD      A,#$20
;        LD      ADC_TDRL,A

        ; 下面初始化定时器4                                       
        LD      A,#$01      
        LD      TIM2_EGR,A          ; 允许产生更新事件
        LD      A,#$06                        ;1=2分频=1徽秒,2=4=2,3=8=4,4=16=8,5=32=16,6=64=32,7=128=64
        LD      TIM2_PSCR,A         ; 计数器时钟=主时钟/4=2MHZ/4
                                                        ;
        ; 设定重装载时的寄存器值
        ; 注意必须保证先写入高8位,再写入低8位
        LD      A,#$7a               
        LD      TIM2_ARRH,A         ; 设定重装载时的寄存器值的高8位
        LD      A,#$12
        LD      TIM2_ARRL,A         ; 设定重装载时的寄存器值的低8位
        LD      A,#$7a
        LD      TIM2_CNTRH,A        ; 设定计数器的初值的高8位
        LD      A,#$12
        LD      TIM2_CNTRL,A        ; 设定计数器的初值的低8位
                                                        ; 定时周期=60000*1=60mS
        LD      A,#$01
                                                        ; b0 = 1,允许计数器工作
                                                        ; b1 = 0,允许更新
        LD             TIM2_CR1,A          ; 设置控制器,启动定时器
        LD      A,#$01              ; 允许更新中断
        LD      TIM2_IER,A  

        RIM                     ; 允许CPU全局中断
       
        CALL    DELAY_MS                ; 延时100MS
       
        CALL        LCDINIT
       
        CALL        DDINIT
       
        CALL        LCDDIS
       
        CALL    DELAY_MS                ; 延时100MS
        CALL    DELAY_MS                ; 延时100MS
        CALL    DELAY_MS                ; 延时100MS
               
        MOV                DAY,#11
        MOV                HOUR,#12
        MOV                MINUTE,#34
        MOV                SECOND,#56

LOOP:
        BTJF        SECFLAG,LOOP
        BRES        SECFLAG
        CALL        TIMEPRO
        CALL        LCDDIS
       
        JRA                LOOP

LCDDIS:
        BRES        LCDCS
       
        CALL        LCDWR101
        CALL        LCDWR000000
       
        CLRW        X                                ;
        MOV                TEMP1,#16                ;
        LDW                Y,#LCDDD                ;
LD010:                               
        LD                A,(Y)                        ;
        LD                XL,A                        ;
        LD                A,(NUMTAB,X)        ;
        CALL        LCDWRBYTE                ;
        INCW        Y                                ;
        DEC                TEMP1                        ;
        JRNE        LD010                        ;
       
        BSET        LCDCS
       
        RET
       
DDINIT:
        LDW                X,#LCDDD
        MOV                TEMP,#16
DI010:       
        LD                A,#17
        LD                (X),A
        INCW        X
        DEC                TEMP
        JRNE        DI010
       
        RET

TIMEPRO:
        MOV                TEMP,DAY
        CALL        BCD8BIT
        MOV                {LCDDD+11},R1
        MOV                {LCDDD+10},R2
        MOV                {LCDDD+9},R3
       
        MOV                TEMP,DAY
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+11},R1
        MOV                {LCDDD+10},R2
        MOV                {LCDDD+9},R3
       
        MOV                TEMP,HOUR
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+8},R1
        MOV                {LCDDD+7},R2
        MOV                {LCDDD+6},R3
       
        MOV                TEMP,MINUTE
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+5},R1
        MOV                {LCDDD+4},R2
        MOV                {LCDDD+3},R3
       
        MOV                TEMP,SECOND
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+2},R1
        MOV                {LCDDD+1},R2
        MOV                LCDDD,R3
       
        RET

;*******************8位 二 进 制 的 数 值 转 化 为 BCD码 ***************************
;把 8 位二进制的数值转化为 BCD 码
;要转换的数值放在 TEMP 中
;转换结果的高位在 R1, 中位在 R2,低位在 R3
BCD8BIT.L     
        LD                 A,TEMP   
        LD                 XL,A     
        LD                 A,#100     
        DIV         X,A     
        LD                 R4,A     
        LD                 A,XL     
        LD                 R1,A     
        LD                 A,R4     
        LD                 XL,A     
        LD                 A,#10     
        DIV         X,A     
        LD                 R3,A     
        LD                 A,XL     
        LD                 R2,A     

        RET
       
;BCD16BIT:        ;16位二进制--BCD码
;入口参数:BINDATA DS.W(16位二进制数存放在BINDATA变量中)
;出口参数:BCDDATA DS.B 5(非压缩形式的BCD存放在以BCDDATA DS.B开始的RAM存储区中
;使用资料:A,X,Y
;        LDW        X,BINDATA
;        LDW        Y,#10000
;        DIVW        X,Y
;        LD        A,XL                ;
;        LD        {BCDDATA+0},A        ;
       
;        LDW        X,Y                ;
;        LDW        Y,#1000
;        DIVW        X,Y
;        LD        A,XL                ;
;        LD        {BCDDATA+1},A        ;
       
;        LDW        X,Y                ;
;        LD        A,#100
;        DIV        X,A                ;
;        EXG        A,XL                ;
;        LD        {BCDDATA+2},A        ;
       
;        LD        A,#10
;        DIV        X,A                ;
;        LD        {BCDDATA+4},A        ;
;        LD        A,XL
;        LD        {BCDDATA+3},A

;        RET
               
LCDINIT:
        LD                A,#$06                        ;打开偏压发生器
        CALL        LCDWRCOM
       
        LD                A,#$02                        ;打开系统时钟
        CALL        LCDWRCOM
       
        LD                A,#$52                        ;1/3 偏压4 背极
        CALL        LCDWRCOM
       
        RET

LCDWR1000:
        BSET        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSCK
        BSET        LCDSCK
       
        RET

LCDWR101:
        BSET        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BSET        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        RET
       
LCDWR000000:
        BRES        LCDSDA
        MOV                TEMP,#06
LCDWR06:
        BRES        LCDSCK
        BSET        LCDSCK
        DEC                TEMP
        JRNE        LCDWR06
       
        RET

LCDWRCOM:
        BRES        LCDCS
       
        CALL        LCDWR1000
        CALL        LCDWRBYTE
        BSET        LCDCS
        BSET        LCDSDA
       
        RET

LCDWRBYTE:
        MOV                TEMP,#08
LCDWB000:
        RLC                A
        BCCM        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
        DEC                TEMP
        JRNE        LCDWB000
       
        RET

; 函数功能:延时
; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ
; 输出参数:无
; 返 回 值:无
; 备    注:无
DELAY_MS.L
    PUSH    A                     ; 将入口参数保存到堆栈中
    LD      A,#250                ; 寄存器A<-250,作为下面的循环数  
DELAY_MS_1.L
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    DEC     A                     ; 寄存器A<-A-1,本条指令执行之间为1T
    JRNE    DELAY_MS_1            ; 若不等于0,则循环,
                                     ; 本条指令执行时间为2T(跳时)或1T(不跳时)
    POP     A                     ; 从堆栈中恢复入口参数
    DEC     A                     ; 将要延时的MS数-1  
        JRNE    DELAY_MS              ; 若不等于0,则循环

        RET                           ; 函数返回  
       
; 下面是定时器2的中断服务程序
Timer2_Update_ISR.L                                       
        LD      A,#0        ; 清除更新标志
        LD      TIM2_SR1,A                                            
       
        BSET        SECFLAG

        BCPL        PA_ODR,#3
       
        INC                SECOND
        LD                A,SECOND
        CP                A,#60
        JRNE        T2ISREND
        CLR                SECOND
        INC                MINUTE
        LD                A,MINUTE
        CP                A,#60
        JRNE        T2ISREND
        CLR                MINUTE
        INC                HOUR
        LD                A,HOUR
        CP                A,#24
        JRNE        T2ISREND
        CLR                HOUR       
T2ISREND:
        IRET                ; 中断返回

; 下面是定时器4的中断服务程序
TIMER4_ISR.L                                       
        LD      A,#0            ; 清除更新标志
        LD      TIM4_SR,A                                            

;        BCPL        PA_ODR,#3
       
        IRET                    ; 中断返回

; 16位显示对应16个字节,显示屏第一位显示对应最后一个字节,第一个字节对应最后一位显示
;第1位显示和第5位显示没有小数点,小数点对应两个箭头,第6位和第10位也没有小数点,也是对应两个箭头
;11位,12位,16位显示也没有小数点,对应三段电池显示
NUMTAB:
        DC.B $7D,$60,$3E,$7A,$63,$5B,$5F,$70
        DC.B $7F,$7B,$77,$4F,$1D,$6E,$1F,$17,$02,$FF,$00
;hcbadegf
;01111101-0(7D)
;01100000-1(60)
;00111110-2(3E)
;01111010-3(7A)
;01100011-4(63)
;01011011-5(5B)
;01011111-6(5F)
;01110000-7(70)
;01111111-8(7F)
;01111011-9(7B)
;01110111-A(77)
;01001111-b(4F)
;00011101-C(1D)
;01101110-d(6E)
;00011111-E(1F)
;00010111-F(17)
;00000010--(02)

        interrupt NonHandledInterrupt
NonHandledInterrupt:

        IRET

        segment 'vectit'
        dc.l {$82000000+main}                                        ; reset        复位
        dc.l {$82000000+NonHandledInterrupt}        ; trap        软件中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq0        TLI 外部最高级中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq1        AWU 自动唤醒HALT模式中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq2        CLK 时钟控制
        dc.l {$82000000+NonHandledInterrupt}        ; irq3        EXTI0 端口A 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq4        EXTI1 端口B 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq5        EXTI2 端口C 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq6        EXTI3 端口D 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq7        EXTI4 端口E 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq8        CAN RX中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq9        CAN TX/ER/SC中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq10        SPI 发送完成
        dc.l {$82000000+NonHandledInterrupt}        ; irq11        TIM1更新/上溢出/下溢出/触发/刹车
        dc.l {$82000000+NonHandledInterrupt}        ; irq12        TIM1捕获比较
        dc.l {$82000000+Timer2_Update_ISR}                ; irq13        TIM2更新上溢出
        dc.l {$82000000+NonHandledInterrupt}        ; irq14        TIM2捕获比较
        dc.l {$82000000+NonHandledInterrupt}        ; irq15        TIM3        更新/上溢出
        dc.l {$82000000+NonHandledInterrupt}        ; irq16        TIM3        捕获/比较
        dc.l {$82000000+NonHandledInterrupt}        ; irq17        UART1        发送完成
        dc.l {$82000000+NonHandledInterrupt}        ; irq18        UART1        接收寄存器满
        dc.l {$82000000+NonHandledInterrupt}        ; irq19        I2C                I2C中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq20        UART2/3 发送完成
        dc.l {$82000000+NonHandledInterrupt}        ; irq21        UART2/3 接始寄存器满
        dc.l {$82000000+NonHandledInterrupt}        ; irq22        ADC 转换结束
        dc.l {$82000000+TIMER4_ISR}                                ; irq23        TIM4更新/上溢出
        dc.l {$82000000+NonHandledInterrupt}        ; irq24        FLASH 编程结束/禁止编程
        dc.l {$82000000+NonHandledInterrupt}        ; irq25       
        dc.l {$82000000+NonHandledInterrupt}        ; irq26       
        dc.l {$82000000+NonHandledInterrupt}        ; irq27       
        dc.l {$82000000+NonHandledInterrupt}        ; irq28       
        dc.l {$82000000+NonHandledInterrupt}        ; irq29       

        end



收藏 评论4 发布时间:2020-8-12 00:41

举报

4个回答
陌路夕颜 回答时间:2020-8-12 09:24:40
汇编这个估计没几个人帮得了你了 这个驱动IC是串行接口吧,对着手册上的时序图在研究一下吧

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

xjhylg 回答时间:2020-8-12 09:33:31
搞定了,T2中断里加了A的入栈和出栈,是不是这个原因不管了。反正程序正常了。

正常的程序如下。程序可用于STM8汇编的学习和入门。
stm8/

        #include "mapping.inc"
        #include "STM8S103F3P.inc"

        #DEFINE        LCDSDA        PD_ODR,#1        ;
        #DEFINE        LCDSCK        PD_ODR,#2        ;
        #DEFINE        LCDCS        PD_ODR,#3        ;
       
        #DEFINE        SECFLAG        FLAG,#0        ;
;        #define        txflag        flag,#1

        segment 'ram0'

FLAG                DS.B        1        ;

R1                        DS.B        1        ;
R2                        DS.B        1        ;
R3                        DS.B        1        ;
R4                        DS.B        1        ;
R5                        DS.B        1        ;
R6                        DS.B        1        ;
R7                        DS.B        1        ;
R8                        DS.B        1        ;

SECOND                DS.B        1        ;
MINUTE                DS.B        1        ;
HOUR                DS.B        1        ;
DAY                        DS.B        1        ;

TEMP                DS.B        1        ;
TEMP1                DS.B        1        ;
TEMP2                DS.B        1        ;

LCDDD                DS.B        16        ;

        segment 'rom'
main:
               
;        NOP
;        NOP
       
; initialize SP
        ldw         X,#stack_end
        ldw         SP,X

        ; clear stack
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
        ldw         X,#stack_start
clear_stack:
        clr         (X)
        incw         X
        cpw         X,#stack_end       
        jrule         clear_stack

        ; 下面初始化IO端口
        ; PD3设置成推挽输出
        ; PD7设置成悬浮输入
        LD      A,#$08
        LD      PA_DDR,A        ; 将PD3设置成输出
        LD      A,#$08
        LD      PA_CR1,A        ; 将PD3设置成推挽输出
        LD      A,#00
        LD      PA_CR2,A        ;
       
        LD      A,#$7E
        LD      PD_DDR,A        ; 将PD3设置成输出
        LD      A,#$7E
        LD      PD_CR1,A        ; 将PD3设置成推挽输出
        LD      A,#00
        LD      PD_CR2,A        ;
       
        ; 初始化A/D模块
;        LD      A,#$00
;        LD      ADC_CR2,A                ; A/D结果数据左对齐
;        LD      A,#$00
;        LD      ADC_CR1,A                ; ADC时钟=主时钟/2=1MHZ
                                                                ; ADC转换模式=单次
                                                                ; 禁止ADC转换
;        LD      A,#$03
;        LD      ADC_CSR,A                 ; 选择通道3
;        LD      A,#$20
;        LD      ADC_TDRL,A

        ; 下面初始化定时器4                                       
        LD      A,#$01      
        LD      TIM2_EGR,A          ; 允许产生更新事件
        LD      A,#$06                        ;1=2分频=1徽秒,2=4=2,3=8=4,4=16=8,5=32=16,6=64=32,7=128=64
        LD      TIM2_PSCR,A         ; 计数器时钟=主时钟/4=2MHZ/4
                                                        ;
        ; 设定重装载时的寄存器值
        ; 注意必须保证先写入高8位,再写入低8位
        LD      A,#$7a               
        LD      TIM2_ARRH,A         ; 设定重装载时的寄存器值的高8位
        LD      A,#$12
        LD      TIM2_ARRL,A         ; 设定重装载时的寄存器值的低8位
        LD      A,#$7a
        LD      TIM2_CNTRH,A        ; 设定计数器的初值的高8位
        LD      A,#$12
        LD      TIM2_CNTRL,A        ; 设定计数器的初值的低8位
                                                        ; 定时周期=60000*1=60mS
        LD      A,#$01
                                                        ; b0 = 1,允许计数器工作
                                                        ; b1 = 0,允许更新
        LD             TIM2_CR1,A          ; 设置控制器,启动定时器
        LD      A,#$01              ; 允许更新中断
        LD      TIM2_IER,A  

        RIM                     ; 允许CPU全局中断
       
        CALL    DELAY_MS                ; 延时100MS
       
        CALL        LCDINIT                        ;
       
        CALL        DDINIT                        ;
       
        CALL        LCDDIS                        ;
       
        CALL    DELAY_MS                ; 延时100MS
        CALL    DELAY_MS                ; 延时100MS
        CALL    DELAY_MS                ; 延时100MS
               
        MOV                DAY,#0
        MOV                HOUR,#12
        MOV                MINUTE,#34
        MOV                SECOND,#56

LOOP:
        BTJF        SECFLAG,LOOP
        BRES        SECFLAG
        CALL        TIMEPRO
        CALL        LCDDIS
       
        JRA                LOOP

LCDDIS:
        BRES        LCDCS
       
        CALL        LCDWR101
        CALL        LCDWR000000
       
        CLRW        X                                ;
        MOV                TEMP1,#16                ;
        LDW                Y,#LCDDD                ;
LD010:                               
        LD                A,(Y)                        ;
        LD                XL,A                        ;
        LD                A,(NUMTAB,X)        ;
        CALL        LCDWRBYTE                ;
        INCW        Y                                ;
        DEC                TEMP1                        ;
        JRNE        LD010                        ;
       
        BSET        LCDCS
       
        RET
       
DDINIT:
        LDW                X,#LCDDD
        MOV                TEMP,#16
DI010:       
        LD                A,#17
        LD                (X),A
        INCW        X
        DEC                TEMP
        JRNE        DI010
       
        RET

TIMEPRO:
        MOV                TEMP,DAY
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+11},R1
        MOV                {LCDDD+10},R2
        MOV                {LCDDD+9},R3
       
        MOV                TEMP,HOUR
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+8},R1
        MOV                {LCDDD+7},R2
        MOV                {LCDDD+6},R3
       
        MOV                TEMP,MINUTE
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+5},R1
        MOV                {LCDDD+4},R2
        MOV                {LCDDD+3},R3
       
        MOV                TEMP,SECOND
        CALL        BCD8BIT
        MOV                R1,#16
        MOV                {LCDDD+2},R1
        MOV                {LCDDD+1},R2
        MOV                LCDDD,R3
       
        RET

;8位 二 进 制 的 数 值 转 化 为 BCD码
;把 8 位二进制的数值转化为 BCD 码
;要转换的数值放在 TEMP 中
;转换结果的高位在 R1, 中位在 R2,低位在 R3
BCD8BIT:   
        LD                 A,TEMP   
        LD                 XL,A     
        LD                 A,#100     
        DIV         X,A     
        LD                 R4,A     
        LD                 A,XL     
        LD                 R1,A     
        LD                 A,R4     
        LD                 XL,A     
        LD                 A,#10     
        DIV         X,A     
        LD                 R3,A     
        LD                 A,XL     
        LD                 R2,A     

        RET
       
;BCD16BIT:        ;16位二进制--BCD码
;入口参数:BINDATA DS.W(16位二进制数存放在BINDATA变量中)
;出口参数:BCDDATA DS.B 5(非压缩形式的BCD存放在以BCDDATA DS.B开始的RAM存储区中
;使用资料:A,X,Y
;        LDW        X,BINDATA
;        LDW        Y,#10000
;        DIVW        X,Y
;        LD        A,XL                ;
;        LD        {BCDDATA+0},A        ;
       
;        LDW        X,Y                ;
;        LDW        Y,#1000
;        DIVW        X,Y
;        LD        A,XL                ;
;        LD        {BCDDATA+1},A        ;
       
;        LDW        X,Y                ;
;        LD        A,#100
;        DIV        X,A                ;
;        EXG        A,XL                ;
;        LD        {BCDDATA+2},A        ;
       
;        LD        A,#10
;        DIV        X,A                ;
;        LD        {BCDDATA+4},A        ;
;        LD        A,XL
;        LD        {BCDDATA+3},A

;        RET
               
LCDINIT:
        LD                A,#$06                        ;打开偏压发生器
        CALL        LCDWRCOM
       
        LD                A,#$02                        ;打开系统时钟
        CALL        LCDWRCOM
       
        LD                A,#$52                        ;1/3 偏压4 背极
        CALL        LCDWRCOM
       
        RET

LCDWR1000:
        BSET        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSCK
        BSET        LCDSCK
       
        RET

LCDWR101:
        BSET        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BRES        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        BSET        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
       
        RET
       
LCDWR000000:
        BRES        LCDSDA
        MOV                TEMP,#06
LCDWR06:
        BRES        LCDSCK
        BSET        LCDSCK
        DEC                TEMP
        JRNE        LCDWR06
       
        RET

LCDWRCOM:
        BRES        LCDCS
       
        CALL        LCDWR1000
        CALL        LCDWRBYTE
        BSET        LCDCS
        BSET        LCDSDA
       
        RET

LCDWRBYTE:
        MOV                TEMP,#08
LCDWB000:
        RLC                A
        BCCM        LCDSDA
        BRES        LCDSCK
        BSET        LCDSCK
        DEC                TEMP
        JRNE        LCDWB000
       
        RET

; 函数功能:延时
; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ
; 输出参数:无
; 返 回 值:无
; 备    注:无
DELAY_MS:
    PUSH    A                     ; 将入口参数保存到堆栈中
    LD      A,#250                ; 寄存器A<-250,作为下面的循环数  
DELAY_MS_1:
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    NOP                           ; 用空操作指令进行延时4T
    DEC     A                     ; 寄存器A<-A-1,本条指令执行之间为1T
    JRNE    DELAY_MS_1            ; 若不等于0,则循环,
                                     ; 本条指令执行时间为2T(跳时)或1T(不跳时)
    POP     A                     ; 从堆栈中恢复入口参数
    DEC     A                     ; 将要延时的MS数-1  
        JRNE    DELAY_MS              ; 若不等于0,则循环

        RET                           ; 函数返回  
       
; 下面是定时器2的中断服务程序
Timer2_Update_ISR:                               
        PUSH          A
        LD      A,#0        ; 清除更新标志
        LD      TIM2_SR1,A                                            
       
        BSET        SECFLAG

        BCPL        PA_ODR,#3
       
        INC                SECOND
        LD                A,SECOND
        CP                A,#60
        JRNE        T2ISREND
        CLR                SECOND
        INC                MINUTE
        LD                A,MINUTE
        CP                A,#60
        JRNE        T2ISREND
        CLR                MINUTE
        INC                HOUR
        LD                A,HOUR
        CP                A,#24
        JRNE        T2ISREND
        CLR                HOUR       
T2ISREND:
        POP                A
        IRET                ; 中断返回

; 下面是定时器4的中断服务程序
TIMER4_ISR:                                       
        LD      A,#0            ; 清除更新标志
        LD      TIM4_SR,A                                            

;        BCPL        PA_ODR,#3
       
        IRET                    ; 中断返回

; 16位显示对应16个字节,显示屏第一位显示对应最后一个字节,第一个字节对应最后一位显示
;第1位显示和第5位显示没有小数点,小数点对应两个箭头,第6位和第10位也没有小数点,也是对应两个箭头
;11位,12位,16位显示也没有小数点,对应三段电池显示
NUMTAB:
        DC.B $7D,$60,$3E,$7A,$63,$5B,$5F,$70
        DC.B $7F,$7B,$77,$4F,$1D,$6E,$1F,$17,$02,$FF,$00
;hcbadegf
;01111101-0(7D)
;01100000-1(60)
;00111110-2(3E)
;01111010-3(7A)
;01100011-4(63)
;01011011-5(5B)
;01011111-6(5F)
;01110000-7(70)
;01111111-8(7F)
;01111011-9(7B)
;01110111-A(77)
;01001111-b(4F)
;00011101-C(1D)
;01101110-d(6E)
;00011111-E(1F)
;00010111-F(17)
;00000010--(02)

        interrupt NonHandledInterrupt
NonHandledInterrupt:

        IRET

        segment 'vectit'
        dc.l {$82000000+main}                                        ; reset        复位
        dc.l {$82000000+NonHandledInterrupt}        ; trap        软件中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq0        TLI 外部最高级中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq1        AWU 自动唤醒HALT模式中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq2        CLK 时钟控制
        dc.l {$82000000+NonHandledInterrupt}        ; irq3        EXTI0 端口A 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq4        EXTI1 端口B 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq5        EXTI2 端口C 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq6        EXTI3 端口D 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq7        EXTI4 端口E 外部中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq8        CAN RX中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq9        CAN TX/ER/SC中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq10        SPI 发送完成
        dc.l {$82000000+NonHandledInterrupt}        ; irq11        TIM1更新/上溢出/下溢出/触发/刹车
        dc.l {$82000000+NonHandledInterrupt}        ; irq12        TIM1捕获比较
        dc.l {$82000000+Timer2_Update_ISR}                ; irq13        TIM2更新上溢出
        dc.l {$82000000+NonHandledInterrupt}        ; irq14        TIM2捕获比较
        dc.l {$82000000+NonHandledInterrupt}        ; irq15        TIM3        更新/上溢出
        dc.l {$82000000+NonHandledInterrupt}        ; irq16        TIM3        捕获/比较
        dc.l {$82000000+NonHandledInterrupt}        ; irq17        UART1        发送完成
        dc.l {$82000000+NonHandledInterrupt}        ; irq18        UART1        接收寄存器满
        dc.l {$82000000+NonHandledInterrupt}        ; irq19        I2C                I2C中断
        dc.l {$82000000+NonHandledInterrupt}        ; irq20        UART2/3 发送完成
        dc.l {$82000000+NonHandledInterrupt}        ; irq21        UART2/3 接始寄存器满
        dc.l {$82000000+NonHandledInterrupt}        ; irq22        ADC 转换结束
        dc.l {$82000000+TIMER4_ISR}                                ; irq23        TIM4更新/上溢出
        dc.l {$82000000+NonHandledInterrupt}        ; irq24        FLASH 编程结束/禁止编程
        dc.l {$82000000+NonHandledInterrupt}        ; irq25       
        dc.l {$82000000+NonHandledInterrupt}        ; irq26       
        dc.l {$82000000+NonHandledInterrupt}        ; irq27       
        dc.l {$82000000+NonHandledInterrupt}        ; irq28       
        dc.l {$82000000+NonHandledInterrupt}        ; irq29       

        end


评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

guoyuli 回答时间:2020-8-13 21:00:26
历害!
小小超 回答时间:2020-8-14 14:56:18
汇编看得头晕。。。。我倒是有运行没问题的 C语言。。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版