电脑和PIC16F877串口232通信问题。
用高奇的ICD,电脑用“超级终端”发送接受数据,电脑发送的数据是ASCII码吗?比如键盘的“1”是“31H”?ICD的液晶显示程序要求送ASCII码还是原码?
我写的程序如下:调试时受到的数据和接受到的不一样,比如 我按键盘的“1” ,收到是“y”或者“9”。
请大家帮我看看到底是怎么回事?
ORG 0
NOP
GOTO Start
;********************************************
; 中断处理程序 *
;********************************************
org 4;中断入口
INTDISP
btfss PIR1, RCIF ;检查是否为USART发出的中断
goto Main ;不是,返回
movf RCREG, 0 ;是,从USART中接受数据
movwf TXREG ;并且转发回去
call putcLCD ;接受到的数据显示在LCD上
RETFIE
;************************************************
org 10
;*******************************************************************
;*LCD 模块子程序 *
;*******************************************************************
;InitLCD——初始化LCD模块 *
;*******************************************************************
InitLCD
bcf STATUS,RP0 ; Bank 0
bcf STATUS,RP1
clrf LCD_DATA ; 清 LCD 数据 & 控制位
bsf STATUS,RP0 ; Bank 1
movlw 0xc1 ; 设置RB1~RB5为输出
movwf LCD_DATA
bcf TRISA,5
bcf STATUS,RP0 ;
movlw 0x00 ;
movwf LCD_DATA
bsf LCD_CNTL2, E
bcf LCD_CNTL2, E
movlw 0x08 ;
movwf LCD_DATA
bsf LCD_CNTL2, E
bcf LCD_CNTL2, E
call LongDelay
call LongDelay
movlw b'00101000'
call SendCmd
movlw DISP_ON ; 开显示
call SendCmd
movlw ENTRY_INC ; 设置指针移动方式
call SendCmd
movlw DD_RAM_ADDR ; 设置起始地址
call SendCmd
InitLCDEnd ;
bcf STATUS,RP0 ;
call clrLCD
return
;*******************************************************************
;*putcLCD—— 将字符数据送入 LCD *
;* 本程序将字符数据分成了高半字节和低半字节分别输入 *
;* 先送入的是高半字节 *
;*******************************************************************
putcLCD
movwf Byte ; 存 WREG 到 Byte 寄存器
swapf Byte,W; 写入高半字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bsf LCD_CNTL1, RS ; 设置为送数据模式
bsf LCD_CNTL2, E; 发送数据信号
bcf LCD_CNTL2, E
movf Byte,W; 接着送低半字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bsf LCD_CNTL1, RS ; 设置为送数据模式
bsf LCD_CNTL2, E; 发送数据信号
bcf LCD_CNTL2, E
call Delay
return
;*******************************************************************
;* SendCmd - 送命令到 LCD *
;* 本程序将命令数据分成了高半字节和低半字节分别输入 *
;* 先送入的是高半字节 *
;*******************************************************************
SendCmd
movwf Byte ; 存 WREG 到 Byte 寄存器
swapf Byte,W; 送入命令的高字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bcf LCD_CNTL1,RS ; 设置为送命令模式
bsf LCD_CNTL2,E; 发送数据信号
bcf LCD_CNTL2,E
movf Byte,W; 接着送命令的低字节
movwf LCD_DATA1
rlf LCD_DATA1,1
rlf LCD_DATA1,1
movlw 0x3c
andwf LCD_DATA1,1
movf LCD_DATA1,w
movwf LCD_DATA
bcf LCD_CNTL1,RS; 设置为送命令模式
bsf LCD_CNTL2,E; 发送数据信号
bcf LCD_CNTL2,E
call Delay
return
;*******************************************************************
;* clrLCD - 清除 LCD 显示 *
;*******************************************************************
clrLCD
movlw CLR_DISP ;
call SendCmd
return
;*******************************************************************
;* L1homeLCD - 将显示指针定位在第一行 *
;*******************************************************************
L1homeLCD
movlw DD_RAM_ADDR ;
call SendCmd ;
return
;*******************************************************************
;* L2homeLCD - 将显示指针定位在第二行 *
;*******************************************************************
L2homeLCD
movlw DD_RAM_UL ;
call SendCmd ;
return
;*******************************************************************
;* Delay - 延时子程序 *
;*******************************************************************
Delay ; call指令占用2个指令周期
clrf Count ; 清 Count占用1个指令周期
Dloop
decfsz Count,f ; 这两行指令将延时
goto Dloop ; (256 * 3) -1 个指令周期
return ;return占用2个指令周期
;*******************************************************************
;* Delay3S - 长延时子程序 延时3S *
;*******************************************************************
Delay3S
clrf Count
clrf Count1
movlw 0x2f
movwf Count2
LDloop1
decfsz Count,f
goto LDloop1
decfsz Count1,f
goto LDloop1
decfsz Count2,f
goto LDloop1
return
;*******************************************************************
;* LongDelay - 长延时子程序 延时591MS *
;*******************************************************************
LongDelay
clrf Count
clrf Count1
movlw 0x03
movwf Count2
LDloop
decfsz Count,f
goto LDloop
decfsz Count1,f
goto LDloop
decfsz Count2,f
goto LDloop
return
;
;**************************************************
ORG 500H
Start
call InitLCD; 初始化 LCD
call clrLCD
call L1homeLCD
bsf STATUS, RP0
bcf STATUS, RP1 ; BANK1
movlw b'10111111' ;选择INT下降沿有效 INTEDG=0
movwf OPTION_REG ;用加于RA4/T0CKI引脚上的外部时钟 T0CS=1
;RA4/T0CKI引脚上的下降沿增量 T0SE=1
;前分配器用于TMR0 PSA=0000 倍率 1:2
bsf TRISC,6 ;断开RC模块与USART TX脚的联系
bsf TRISC,7 ;断开RC模块与USART RX脚的联系
movlw .12 ;装载波特率发生器,波特率为19.2K
movwf SPBRG ;在单片机时钟为4MHZ时
movlw b'00100100'
movwf TXSTA ;使能USART发送,设置波特率发生器为高速方式
bsf PIE1,RCIE ;开放USART的接受中断
bcf STATUS, RP0 ;BANK0
movlw b'10010000'
movwf RCSTA
bsf INTCON, GIE ;使能全局中断使能位
bsf INTCON, PEIE ;使能外设中断使能位
Main
bsf STATUS,RP0
movlw 0x00
movwf TRISD
bcf STATUS,RP0
movlw 0x80
movwf PORTD
call LongDelay
movlw 0x00
movwf PORTD ;读扣完成后指示灯PORTD7闪烁一次
call Delay3S
goto Main ;循环程序
;********************************************
END
;****************************************** 字符是ASCII码如A----Z, 汉字是机内码.LCD要求有不同的看说明书,有字模没有等!!
页:
[1]