winnie 发表于 2009-3-20 16:52:47

电脑和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                           
;******************************************

winnie 发表于 2009-3-20 16:52:56

字符是ASCII码如A----Z, 汉字是机内码.LCD要求有不同的看说明书,有字模没有等!!
页: [1]
查看完整版本: 电脑和PIC16F877串口232通信问题。