打印
[其它应用]

赋值不成功

[复制链接]
643|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanglli|  楼主 | 2018-1-7 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了一个用io来模拟uart通信的程序,将PB0配置为输出口作为uart的发送端,但是发觉一直没给他成功赋值
沙发
lium| | 2018-1-7 15:03 | 只看该作者
什么片子?

使用特权

评论回复
板凳
guoyt| | 2018-1-7 15:08 | 只看该作者
程序看看吧

使用特权

评论回复
地板
zhanglli|  楼主 | 2018-1-7 15:10 | 只看该作者

List        P=69P461
Romsize         =2048
;*******************************************************
;                系统寄存器
;*******************************************************
        IE                       EQU        00H
        IR                       EQU        01H
        TM1                    EQU        03H
        TL1                     EQU        06H
        TH1                     EQU        07H
        PORTA_DATA      EQU        08H
        PORTB_DATA      EQU        09H
        PIN3_2_CFG        EQU        14H
        PORTA_CFG        EQU        18H
        PORTB_CFG        EQU        19H
;*******************************************************
;                用户数据寄存器
;*******************************************************
        CIG_SEND_IO        EQU        PIN3_2_CFG
        SEND_IO                EQU        PORTB_DATA
        KECY_CODE_H       EQU        32H
        KECY_CODE_L       EQU        33H        
        COUNT                   EQU        34H
        READY_SEND         EQU        35H
        BK_T0                    EQU        39H
        BK_AC                    EQU        40H
;************************************************************
;                程序入口
;************************************************************        
        ORG        000H
        JMP        RESET                                ;reset中断入口        $000h
        RTNI
        RTNI
        JMP        T1_SEVER                        ;timer1中断入口 $003H
        RTNI
        RTNI
RESET:
        NOP
        NOP
        NOP
        NOP                                        ;ensure the IC is stability
        LDI        KECY_CODE_H,0110B                ;
        LDI        KECY_CODE_L,1000B        
        LDI        CIG_SEND_IO,0000B                ;将PORTB0配置为I/O口,作为uart的发送端
        LDI        PORTB_CFG,0001B                        ;将PORTB0配置为输出口
        LDI        TL1,06H;03H;08H(9600)                ;定时26us中断一次(使用内部4M振荡器)
        LDI        TH1,0EH;0FH;09H(9600)                                ;
        LDI        TM1,07H                                ;分频比1:1并启动timer1
        LDI        AD_RESULT_L,0
        LDI        AD_RESULT_H,0
MAIN:
        LDI        IR,0
        ORIM        IE,0000B                        ;开AD,timer0定时中断
        CALL        SEND_CHAR                        ;将按下的按键键值通过串口发送出去        
MAIN_LOOP:
        JMP        MAIN
               
;*************************************************
;                timer1中断服务程序
;*************************************************
T1_SEVER:
        LDA        BK_T0,00H                        ;保存AC的值
        ANDIM        IR,1101B                        ;清timer1中断请求以防多次触发中断
        LDI         READY_SEND,1
        STA        BK_T0,00H                        ;恢复AC的值                        
        RTNI
        RTNI
        
;**************************************************
;                uart发送8位数据
;**************************************************
SEND_CHAR:
        NOP        
        LDI        SEND_IO,00H                ;发送起始位(此指令执行完之后SEND_IO的值并没有为0)
      ....................
END

使用特权

评论回复
5
guoyt| | 2018-1-7 15:13 | 只看该作者
用UART通讯,最好将程序放在Timer中断中实现

使用特权

评论回复
6
zhanglli|  楼主 | 2018-1-7 15:15 | 只看该作者

能详细说说吗

使用特权

评论回复
7
guoyt| | 2018-1-7 15:25 | 只看该作者

;-----------------------------------------------------                     
Timer0ISR:
        STA                   zACC                  
        ldi                   rzIRQ                ,0x00
;-------------------------------------------------
        lda                nUARTFlag
        baz                NormalTimer0
        ba3                ?txdStop
        ba2                ?txdTB8
        ba1                ?txdData
;;        ba0                ?txdStart        
    ?txdStart:;--------------------------------------------------------------- step 1
            ldi                nUARTFlag        ,0010b                //switch to step 2            
        jmp                ?busLow
    ?txdData:;---------------------------------------------------------------- step 2
            sbim                zUartBitLen        ,0x01
            bnz                $+2
            ldi                nUARTFlag        ,0100b                //switch to step 3
            lda                nUARTDataL
            sta                zIntTmp
            shr        
            sta                nUARTDataL
            lda                nUARTDataH
            shr
            sta                nUARTDataH
            bnc                $+2
            orim                nUARTDataL        ,1000b
            lda                zIntTmp
            ba0                ?busHigh
            jmp                ?busLow
    ?txdTB8:;----------------------------------------------------------------- step 3  
            ldi                nUARTFlag        ,1000b                //switch to step 4
        jmp                ?busLow
    ?txdStop:;---------------------------------------------------------------- step 4        
        ldi                nUARTFlag        ,0000b                //switch to step 0        
    ?busHigh:;-----------------------------------------------------------------------        
            orim                rzPB                ,0001b
            jmp                NormalTimer0
    ?busLow:;------------------------------------------------------------------------
            andim                rzPB                ,1110b
;---------------------------------------------------
NormalTimer0:
               adim                zInt_C                ,01
               sbi                zInt_C                ,04
               bnc                Exit_Timer0
               ldi                zInt_C                ,00
        LDI                   rzWDT                ,0x0B            
        adim                  zDelayL        ,0x01                  ;;channel 1 main loop time counter
        eor                zDelayL
        adcm                zDelayH
        adim                zLEDTime        ,01                ;64ms
        bnc                Exit_Timer0
        ldi                nDispVolt        ,06                ;;for test!
        lda                nDispVolt
        sta                nUARTDataL
        sta                nUARTDataH
        eorim                nUARTDataH        ,0x0f        
            ldi                zUartBitLen        ,0x08
        ldi                nUARTFlag        ,01
        orim                rzPB                ,0001b                ;;busy signal!
Exit_Timer0:
        LDI                   rzIE                ,0x04                ;timer0 ISR Enable!
        LDA                   zACC                  
        rtni  

使用特权

评论回复
8
zhanglli|  楼主 | 2018-1-7 15:28 | 只看该作者
谢谢,不过主要问题是无法给io口赋值。刚才我用了以下的代码试了一下,发觉还是无法给io口赋值

使用特权

评论回复
9
guoyt| | 2018-1-7 15:31 | 只看该作者

那我也无能为力了

使用特权

评论回复
10
zhuww| | 2018-1-7 15:34 | 只看该作者
额  有有C语言写的代码吗?汇编都不是很懂呀

使用特权

评论回复
11
zhanglli|  楼主 | 2018-1-7 15:39 | 只看该作者
好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先        

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1016

主题

9386

帖子

1

粉丝