PIC16f877a 串口程序问题

2019-03-25 19:49发布

各位老师好,我是惠州的小肖。^_^平时有空就搞一下单片机。。对单片机这一块我就一菜鸟。。这不我照着李学海老师的书上我测试了一串口通信程序。李学海老师写的串口程序是用的汇编语言。。我试着把这程序用C语言改写。。可就是不能实现同样的功能(不可以进入中断程序)。。附件有ASM和C写的。ASM写的可以通过。在硬件上测试也通过了。。。C语言改写的编译通过,但硬件上测试通不过。好苦恼,几天晚上都睡不着。。试了很多次都发现不了问题,您们帮我看看好吗?(我用的是MPLAB IDE V8.10和PIC  C Compiler,程序实现的的功能是通过超级终端显示键盘输入的键值)。。谢啦!!

VAL_US   equ  .249
VAL_MS  equ   .200
;***********************************
STATUS   equ   3h
Z        equ   2h
INTCON   equ   0bh
PORTC    equ   07h
TRISC    equ     87h
TRISD    equ     88h
PORTD    equ   08h
RP0      equ   5h
PIR1     equ   0ch
PIE1     equ    8ch
RCSTA    equ    18h
TXSTA    equ    98h
SPBRG    equ    99h
RCREG    equ    1ah
TXREG    equ    19h
GIE      equ     7
PEIE     equ     6
RCIF     equ       5
RCIE     equ     5
;**************************************
count    equ     0x70
count_ms equ   0x71
;**************************************

  ORG   0X0000
GOTO   Startup
  ORG    0x0004
;**************************************
BTFSS   PIR1, RCIF
GOTO    Err_Exit
MOVF   RCREG, 0
MOVWF  TXREG
Err_Exit   retfie
;**************************************
Startup  
       bsf   STATUS,RP0
       clrf   TRISD
       bsf  TRISC,6
       bsf   TRISC,7
       movlw  .12
       movwf  SPBRG
       movlw  b'00100100'
       movwf   TXSTA
       bsf       PIE1, RCIE
       bcf      STATUS, RP0
       movlw b'10010000
       movwf  RCSTA
       bsf         INTCON,GIE
        bsf        INTCON, PEIE
;**************************************
     main  clrwdt
           incf    PORTD,f
           call    delay_ms
           call    delay_ms
           goto    main
;**************************************
delay_ms:
                  movlw       VAL_MS
                  movwf       count_ms
loop_ms           call        delay_us
                  decfsz      count_ms,f
                  goto        loop_ms
                  return
;**************************************
  delay_us:
                nop
                movlw    VAL_US
                movwf    count
loop_us         nop
                decfsz   count,f
                goto     loop_us
                return
                end
;**************************************






#device PIC16F877A
#fuses  NOWDT, PUT,XT, BROWNOUT, NOLVP, NOPROTECT, NOCPD, NOWRT, NODEBUG
#id CHECKSUM
#device icd=true
#include "pic16F87.h"

#use delay (clock = 4000000)
//--------------------------------------------------------------

void  Initial_USART(void)
  {
     TRISC=0xc0;
     TRISD=0;
     SPBRG=0x0c;
     TXSTA=0X24;
     RCIE=1;
     RCSTA=0X90;
     GIE=1;
     PEIE=1;
     PORTD=0;
   }


void main()
{

  Initial_USART();
   while(1)
     {
       restart_wdt();
       PORTD++;
       delay_ms(1000);
      
     }
   
}


#INT_RDA
     void serial_isr()
     
    {   
         if(RCIF==1)
             TXREG=RCREG;
         else
           TXREG=RCREG;

    }
   

   






   




               
    此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
alohaha
1楼-- · 2019-03-26 06:27
 精彩回答 2  元偷偷看……
ltfss
2楼-- · 2019-03-26 11:01
在上班,没有时间看完你的程序,太长了
dcqqok
3楼-- · 2019-03-26 11:51
1. 汇编中断服务代码:
   BTFSS  PIR1, RCIF  
   GOTO    Err_Exit
   MOVF  RCREG, 0
   MOVWF  TXREG
   
   Err_Exit  retfie
2。C中断服务代码
    if(RCIF==1)
      TXREG=RCREG;
    else
      //TXREG=RCREG;
您要仔细阅读汇编代码,领会其实际操作本质,然后在写C代码。
   注意:维护别人的代码需要勇气,维护自己的代码需要智慧。
guoguoguo
4楼-- · 2019-03-26 12:50
无语了。。。。。。。

一周热门 更多>