打印
[家电应用]

为什么将SH69P461的PB0配置为输出口,但是却无法给它赋值呢

[复制链接]
1708|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gudengguzhou|  楼主 | 2013-11-15 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
se, IO, ni, hp, timer
本帖最后由 gudengguzhou 于 2013-11-17 19:50 编辑

写了一个用io来模拟uart通信的程序,将PB0配置为输出口作为uart的发送端,但是发觉一直没给他成功赋值。程序如下:
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
沙发
MaHaiJun| | 2013-11-18 09:04 | 只看该作者
用UART通讯,最好将程序放在Timer中断中实现

使用特权

评论回复
板凳
MaHaiJun| | 2013-11-18 09:05 | 只看该作者
;-----------------------------------------------------                     
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  

使用特权

评论回复
地板
gudengguzhou|  楼主 | 2013-11-18 11:53 | 只看该作者
MaHaiJun 发表于 2013-11-18 09:05
;-----------------------------------------------------                     
Timer0ISR:
        STA   ...
;*******************************************************
        PORTA_DATA        EQU        08H
        PORTB_DATA        EQU        09H
        PIN5_4_CFG        EQU        15H
        PORTA_CFG        EQU        18H
        PORTB_CFG        EQU        19H
       
;*****************************************************

        ORG        000H
        JMP        RESET
        RTNI

RESET:
        NOP
        NOP
        NOP
        NOP
        LDI        PIN5_4_CFG,0000B                ;将PORTA2配置为I/O口
        ORIM        PORTA_CFG,0100B                        ;将PORTA3配置为输出口
MAIN:
        LDI        PORTA_DATA,00H       
        NOP
        JMP        MAIN

END
谢谢版主,不过主要问题是无法给io口赋值。刚才我用了以下的代码试了一下,发觉还是无法给io口赋值,您再帮我看看,哪儿出了问题

使用特权

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

本版积分规则

14

主题

18

帖子

0

粉丝