各位老师好,我是惠州的小肖。^_^平时有空就搞一下单片机。。对单片机这一块我就一菜鸟。。这不我照着李学海老师的书上我测试了一串口通信程序。李学海老师写的串口程序是用的汇编语言。。我试着把这程序用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;
}
此帖出自
小平头技术问答
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代码。
注意:维护别人的代码需要勇气,维护自己的代码需要智慧。
一周热门 更多>