英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: 电脑和PIC16F877串口232通信问题。 [打印本页]

作者: winnie    时间: 2009-3-20 16:52
标题: 电脑和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=0  000 倍率 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
字符是ASCII码如A----Z, 汉字是机内码.LCD要求有不同的看说明书,有字模没有等!!




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2