[家电应用] 为什么将SH69P461的PB0配置为输出口,但是却无法给它赋值呢

[复制链接]
2314|3
 楼主| gudengguzhou 发表于 2013-11-15 12:53 | 显示全部楼层 |阅读模式
se, IO, ni, hp, timer
本帖最后由 gudengguzhou 于 2013-11-17 19:50 编辑

写了一个用io来模拟uart通信的程序,将PB0配置为输出口作为uart的发送端,但是发觉一直没给他成功赋值。程序如下:
  1. List        P=69P461
  2. Romsize         =2048

  3. ;*******************************************************
  4. ;                系统寄存器
  5. ;*******************************************************
  6.         IE                       EQU        00H
  7.         IR                       EQU        01H
  8.         TM1                    EQU        03H
  9.         TL1                     EQU        06H
  10.         TH1                     EQU        07H
  11.         PORTA_DATA      EQU        08H
  12.         PORTB_DATA      EQU        09H
  13.         PIN3_2_CFG        EQU        14H
  14.         PORTA_CFG        EQU        18H
  15.         PORTB_CFG        EQU        19H
  16. ;*******************************************************
  17. ;                用户数据寄存器
  18. ;*******************************************************
  19.         CIG_SEND_IO        EQU        PIN3_2_CFG
  20.         SEND_IO                EQU        PORTB_DATA
  21.         KECY_CODE_H       EQU        32H
  22.         KECY_CODE_L       EQU        33H        
  23.         COUNT                   EQU        34H
  24.         READY_SEND         EQU        35H
  25.         BK_T0                    EQU        39H
  26.         BK_AC                    EQU        40H
  27. ;************************************************************
  28. ;                程序入口
  29. ;************************************************************        
  30.         ORG        000H
  31.         JMP        RESET                                ;reset中断入口        $000h
  32.         RTNI
  33.         RTNI
  34.         JMP        T1_SEVER                        ;timer1中断入口 $003H
  35.         RTNI
  36.         RTNI

  37. RESET:
  38.         NOP
  39.         NOP
  40.         NOP
  41.         NOP                                        ;ensure the IC is stability
  42.         LDI        KECY_CODE_H,0110B                ;
  43.         LDI        KECY_CODE_L,1000B        
  44.         LDI        CIG_SEND_IO,0000B                ;将PORTB0配置为I/O口,作为uart的发送端
  45.         LDI        PORTB_CFG,0001B                        ;将PORTB0配置为输出口
  46.         LDI        TL1,06H;03H;08H(9600)                ;定时26us中断一次(使用内部4M振荡器)
  47.         LDI        TH1,0EH;0FH;09H(9600)                                ;
  48.         LDI        TM1,07H                                ;分频比1:1并启动timer1
  49.         LDI        AD_RESULT_L,0
  50.         LDI        AD_RESULT_H,0
  51. MAIN:
  52.         LDI        IR,0
  53.         ORIM        IE,0000B                        ;开AD,timer0定时中断
  54.         CALL        SEND_CHAR                        ;将按下的按键键值通过串口发送出去        
  55. MAIN_LOOP:
  56.         JMP        MAIN
  57.                
  58. ;*************************************************
  59. ;                timer1中断服务程序
  60. ;*************************************************
  61. T1_SEVER:
  62.         LDA        BK_T0,00H                        ;保存AC的值
  63.         ANDIM        IR,1101B                        ;清timer1中断请求以防多次触发中断
  64.         LDI         READY_SEND,1
  65.         STA        BK_T0,00H                        ;恢复AC的值                        
  66.         RTNI
  67.         RTNI

  68.         
  69. ;**************************************************
  70. ;                uart发送8位数据
  71. ;**************************************************
  72. SEND_CHAR:
  73.         NOP        
  74.         LDI        SEND_IO,00H                ;发送起始位(此指令执行完之后SEND_IO的值并没有为0)
  75.       ....................
  76. 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   ...
  1. ;*******************************************************
  2.         PORTA_DATA        EQU        08H
  3.         PORTB_DATA        EQU        09H
  4.         PIN5_4_CFG        EQU        15H
  5.         PORTA_CFG        EQU        18H
  6.         PORTB_CFG        EQU        19H
  7.        
  8. ;*****************************************************

  9.         ORG        000H
  10.         JMP        RESET
  11.         RTNI

  12. RESET:
  13.         NOP
  14.         NOP
  15.         NOP
  16.         NOP
  17.         LDI        PIN5_4_CFG,0000B                ;将PORTA2配置为I/O口
  18.         ORIM        PORTA_CFG,0100B                        ;将PORTA3配置为输出口
  19. MAIN:
  20.         LDI        PORTA_DATA,00H       
  21.         NOP
  22.         JMP        MAIN

  23. END
谢谢版主,不过主要问题是无法给io口赋值。刚才我用了以下的代码试了一下,发觉还是无法给io口赋值,您再帮我看看,哪儿出了问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部