59pic USART 232汇编程序
扫描二维码
随时随地手机看文章
INCLUDE
LIST P=PIC16F877
;__CONFIG _CP_OFF&_DEBUG_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_LVP_OFF ;PIC16F877
;__IDLOCS0x7206
errorlevel -302
errorlevel -203
CBLOCK 20H
COUNTERH
COUNTERL
COUNTER
TEMP1
TEMP2
TEMP3
TEMP4
TEMP_A
TEMP_B
TEMP_C
DADR
CNT
EE_DADR
ENDC
#DEFINESTART_KEYPORTB,1
#DEFINEBELL PORTD,0
ORG00H
NOP
GOTOSTART
ORG04H
GOTO_INT
;ORG0100H
;********************************************
;查问题回答1字符表(共25个字符)
TABLE1
ADDWFPCL,F
DT"nr-MynameisP16F877.nnr"
;n换行
;r回车
;查问题回答2字符表(共22个字符)
TABLE2
ADDWFPCL,F
DT"nr-I’m3yearsold.nnr"
;查问题回答3字符表(共27个字符)
TABLE3
ADDWFPCL,F
DT"nr-I’mborninShangHai.nnr"
;查问题回答4字符表(共34个字符)
TABLE4
ADDWFPCL,F
DT"nr-Yes,Ilikesportsverymuch.nnr"
;查问题回答5字符表(共28个字符)
TABLE5
ADDWFPCL,F
DT"nr-Thedateis2007-2-15.nnr"
;*******************************************
;初始化和提示信息字符表(共74个字符)
TABLE
ADDWFPCL,F
DT"nHello!nr"
DT"I’myournewfriend,Nicetomeetyou."
DT"Whatdoyouwanttoknow?nnr"
;********************************************
ORG0100H
;********************************************
;问题5字符表(共22个字符)
TAB5
ADDWFPCL,F
DT"What’sthedatetoday?"
;问题4字符表(共19个字符)
TAB4
ADDWFPCL,F
DT"Doyoulikesports?"
;问题3字符表(共20个字符)
TAB3
ADDWFPCL,F
DT"Wherewereyouborn?"
;问题2字符表(共16个字符)
TAB2
ADDWFPCL,F
DT"Howoldareyou?"
;问题1字符表(共17个字符)
TAB1
ADDWFPCL,F
DT"What’syourname?"
;********************************************
;错误提示1字符表(共64个字符)
TABLE6
ADDWFPCL,F
DT"nr-Sorry.ICANnotanswerthequestion."
DT"Pleaseaskanotherone.nnr"
;错误提示2字符表(共48个字符)
TABLE7
ADDWFPCL,F
DT"nr-Whatyourenteriswrong.Pleasetryagain.nnr"
;********************************************
ORG0200H
_INT
NOP
NOP
RETFIE
START
NOP
BSF STATUS,RP0;定义RA口,RC口全部为输出
MOV LW 06H ;
MOV WF ADCON1 ;设置RA口全部为普通数字IO口
MOV LW B’00110000’;
MOV WF TRISA
MOV LW B’11011000’;设置SCL为输入,SDA为输入
MOV WF TRISC
MOV LW 00H
MOV WF TRISD ;
MOV LW0FFH
MOV WFTRISB
BCFOPTION_REG,7
BCF STATUS,RP0
;********** IIC初始化设置 ************
MOV LW08H ;初始化SSPCON,
MOV WFSSPCON ;IIC主控模式
BCFPIR1,SSPIF
BSFSTATUS,RP0
MOV LW80H ;初始化SSPSTAT寄存器,
MOV WFSSPSTAT ;传送速率为标准模式100KHz
MOV LW09H
MOV WFSSPADD ;设定IIC时钟频率
CLRFSSPCON2 ;初始化SSPCON2
BSFPIE1,SSPIE ;SSP中断允许
CLRFINTCON
BSFINTCON,PEIE ;开中断
BSFINTCON,GIE
BCFSTATUS,RP0
BSFSSPCON,SSPEN ;SSP模块使能
;********** IIC初始化设置结束 ************
;********** USART初始化设置开始 ************
STBSFSTATUS,RP0
MOV LWB’00100100’
MOV WFTXSTA ;异步方式,高波特率,发送使能
MOV LW.25
MOV WFSPBRG ;设置波特率9600,Fosc=4MHz
BCFSTATUS,RP0
MOV LWB’10010000’;设置连续接收数据
MOV WFRCSTA
;CLRFINTCON
BSFSTATUS,RP0
CLRFPIE1
BCFSTATUS,RP0
;********** USART初始化设置结束 ************
CLRF PORTA
; CLRF PORTB
CLRF PORTD
CALLCLR_RAM
BEGIN
;ReadTestCounterValuefromEEPROM***********************
MOV LW20H ;readcounterlcounterhfromeeprom
MOV WFDADR
MOV LW.2
MOV WFCNT
MOV LW00H
MOV WFEE_DADR
CALLEE_READ
;ReadTestCounterValuefromEEPROM***********************
;CompareTestCounterValueiszero?************************
CLRZ
MOV FCOUNTERH,F
BTFSSSTATUS,Z
GOTOPRESS_START_KEY
CLRZ
MOV FCOUNTERL,F
BTFSSSTATUS,Z
GOTOPRESS_START_KEY
CALL_ERROR_BELL
GOTOBEGIN
;CompareTestCounterValueiszero?************************
PRESS_START_KEY
BTFSC START_KEY ;按开始键开始测试
GOTO $-1
CALL DELAY20MS
BTFSC START_KEY
GOTO $-4
BTFSS START_KEY
GOTO $-1
CALL DELAY20MS
BTFSS START_KEY
GOTO $-4
;TestCounterdecrease1****************************
MOV LW.1 ;conterdecrease1
SUBWFCOUNTERL,F
BTFSSSTATUS,C
DECFCOUNTERH,F
CALLRAM_TO_EE;writecounterlcounterhtoeeprom
;TestCounterdecrease1****************************
;GOTOBEGIN
;输出问候语
CSH
MOV FCOUNTER,W
;BSFPCLATH,0
CALLTABLE
;BCFPCLATH,0
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.74
BTFSSSTATUS,Z
GOTOCSH
;********************************************
;开始检测并储存外界输入
LOOP
CLRFPIR1 ;清RCIF
CLRFCOUNTER
MOV LW30H
MOV WFFSR
BCFPIR1,RCIF
JIESHUNOP
LRCBTFSSPIR1,RCIF
GOTOLRC
MOV FRCREG,W
SUBLW"r" ;与Enter对应的ASCII码比较
BTFSCSTATUS,Z
GOTOWTPD ;按了回车键,转判断子程序
MOV FRCREG,W
SUBLW"b" ;与退格键BacksPACe对应的ASCII码比较
BTFSCSTATUS,Z
GOTOTUIGE ;按了退格键,转退格处理
MOV FRCREG,W
CALLFASONG
MOV WFINDF
INCFFSR
GOTOLRC
;********************************************
;退格处理子程序
TUIGE
MOV FRCREG,W
CALLFASONG
DECFFSR
GOTOLRC
;********************************************
;问题判断子程序
WTPD
MOV FRCREG,W
MOV WFINDF
;********************************************
;和第一个问题进行比较
PD1
CLRFCOUNTER
MOV LW30H
MOV WFFSR
LP1
MOV FCOUNTER,W
;BSFPCLATH,1
BSFPCLATH,0
CALLTAB1
BCFPCLATH,0
;BCFPCLATH,1
SUBWFINDF,W ;查表所得的数据与INDF的内容相减,结果送W
BTFSSSTATUS,Z
GOTOPD2 ;内容不符,转PD2判断
INCFFSR ;内容相符,数据存储地址加一
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.17 ;判断是否已到第一个问题的17个字符数
BTFSSSTATUS,Z
GOTOLP1 ;没到,继续第一个问题的判断
MOV LW"r" ;Enter??
SUBWFINDF,W
BTFSSSTATUS,Z
GOTOCUOWU2 ;不相等,后面还有内容,转到错误提示2
CLRFCOUNTER
GOTOHD1 ;转到回答1
;********************************************
;和第二个问题进行比较
PD2
CLRFCOUNTER
MOV LW30H
MOV WFFSR
LP2
MOV FCOUNTER,W
;BSFPCLATH,1
BSFPCLATH,0
CALLTAB2
BCFPCLATH,0
;BCFPCLATH,1
SUBWFINDF,W ;查表所得的数据与INDF的内容相减,结果送W
BTFSSSTATUS,Z
GOTOPD3 ;内容不符,转PD3判断
INCFFSR ;内容相符,数据存储地址加一
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.16 ;判断是否已到第一个问题的16个字符数
BTFSSSTATUS,Z
GOTOLP2 ;没到,继续第一个问题的判断
MOV LW"r" ;Enter??
SUBWFINDF,W
BTFSSSTATUS,Z
GOTOCUOWU2 ;不相等,后面还有内容,转到错误提示2
CLRFCOUNTER
GOTOHD2 ;转到回答2
;********************************************
;和第三个问题进行比较
PD3
CLRFCOUNTER
MOV LW30H
MOV WFFSR
LP3
MOV FCOUNTER,W
;BSFPCLATH,1
BSFPCLATH,0
CALLTAB3
BCFPCLATH,0
;BCFPCLATH,1
SUBWFINDF,W ;查表所得的数据与INDF的内容相减,结果送W
BTFSSSTATUS,Z
GOTOPD4 ;内容不符,转PD4判断
INCFFSR ;内容相符,数据存储地址加一
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.20 ;判断是否已到第一个问题的20个字符数
BTFSSSTATUS,Z
GOTOLP3 ;没到,继续第一个问题的判断
MOV LW"r" ;Enter??
SUBWFINDF,W
BTFSSSTATUS,Z
GOTOCUOWU2 ;不相等,后面还有内容,转到错误提示2
CLRFCOUNTER
GOTOHD3 ;转到回答3
;********************************************
;和第四个问题进行比较
PD4
CLRFCOUNTER
MOV LW30H
MOV WFFSR
LP4
MOV FCOUNTER,W
;BSFPCLATH,1
BSFPCLATH,0
CALLTAB4
BCFPCLATH,0
;BCFPCLATH,1
SUBWFINDF,W ;查表所得的数据与INDF的内容相减,结果送W
BTFSSSTATUS,Z
GOTOPD5 ;内容不符,转PD5判断
INCFFSR ;内容相符,数据存储地址加一
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.19 ;判断是否已到第一个问题的19个字符数
BTFSSSTATUS,Z
GOTOLP4 ;没到,继续第一个问题的判断
MOV LW"r" ;Enter??
SUBWFINDF,W
BTFSSSTATUS,Z
GOTOCUOWU2 ;不相等,后面还有内容,转到错误提示2
CLRFCOUNTER
GOTOHD4 ;转到回答4
;********************************************
;和第五个问题进行比较
PD5
CLRFCOUNTER
MOV LW30H
MOV WFFSR
LP5
MOV FCOUNTER,W
;BSFPCLATH,1
BSFPCLATH,0
CALLTAB5
BCFPCLATH,0
;BCFPCLATH,1
SUBWFINDF,W ;查表所得的数据与INDF的内容相减,结果送W
BTFSSSTATUS,Z
GOTOCUOWU ;内容不符,转CUOWU提示1
INCFFSR ;内容相符,数据存储地址加一
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.22 ;判断是否已到第一个问题的16个字符数
BTFSSSTATUS,Z
GOTOLP5 ;没到,继续第一个问题的判断
MOV LW"r" ;Enter??
SUBWFINDF,W
BTFSSSTATUS,Z
GOTOCUOWU2 ;不相等,后面还有内容,转到错误提示2
CLRFCOUNTER
GOTOHD5 ;转到回答2
;********************************************
;输出回答1
HD1
MOV FCOUNTER,W
;BSFPCLATH,0
CALLTABLE1
;BCFPCLATH,0
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.25
BTFSSSTATUS,Z
GOTOHD1
GOTOLOOP ;输出完毕,转到输出检测
;输出回答2
HD2
MOV FCOUNTER,W
;BSFPCLATH,0
CALLTABLE2
;BCFPCLATH,0
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.22
BTFSSSTATUS,Z
GOTOHD2
GOTOLOOP ;输出完毕,转到输出检测
;输出回答3
HD3
MOV FCOUNTER,W
;BSFPCLATH,0
CALLTABLE3
;BCFPCLATH,0
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.27
BTFSSSTATUS,Z
GOTOHD3
GOTOLOOP ;输出完毕,转到输出检测
;输出回答4
HD4
MOV FCOUNTER,W
;BSFPCLATH,0
CALLTABLE4
;BCFPCLATH,0
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.34
BTFSSSTATUS,Z
GOTOHD4
GOTOLOOP ;输出完毕,转到输出检测
;输出回答5
HD5
MOV FCOUNTER,W
;BSFPCLATH,0
CALLTABLE5
;BCFPCLATH,0
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.28
BTFSSSTATUS,Z
GOTOHD5
;GOTOLOOP ;输出完毕,转到输出检测
CLRFCOUNTER
CALLDELAY1S
CALL_PASS_BELL
GOTOBEGIN
;********************************************
;输出错误提示1
CUOWU
CLRFCOUNTER
LP6 MOV FCOUNTER,W
;BSFPCLATH,1
BSFPCLATH,0
CALLTABLE6
BCFPCLATH,0
;BCFPCLATH,1
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.64
BTFSSSTATUS,Z
GOTOLP6
GOTOLOOP
;输出错误提示2
CUOWU2
CLRFCOUNTER
LP7 MOV FCOUNTER,W
;BSFPCLATH,1
BSFPCLATH,0
CALLTABLE7
BCFPCLATH,0
;BCFPCLATH,1
CALLFASONG
CALLDELAY3
INCFCOUNTER
MOV FCOUNTER,W
SUBLW.48
BTFSSSTATUS,Z
GOTOLP7
GOTOLOOP
;********************************************
;********************************************
;USART方式发送数据子程序
FASONG
MOV WFTXREG
BSFSTATUS,RP0
BTFSSTXSTA,TRMT
GOTO$-1
BCFSTATUS,RP0
RETURN
;********************************************
CLR_RAM
MOV LW20H
MOV WFFSR
CLRFINDF
INCFFSR,F
BTFSSFSR,7
GOTO$-3
RETURN
;***********************_ERROR_BELL子程序 **********************************
_ERROR_BELL
CALL _PASS_BELL
CALL DELAY200MS
CALL DELAY200MS
CALL _PASS_BELL
CALL DELAY200MS
CALL DELAY200MS
CALL _PASS_BELL
CALL DELAY200MS
CALL DELAY200MS
RETURN
;***********************_PASS_BELL子程序 **********************************
_PASS_BELL
MOV LW .20
MOV WF TEMP_A
BELL2
MOV LW .190
MOV WF TEMP_B
BELL1
BSF BELL ;频率Hz
CALLDELAY125US
BCF BELL
CALLDELAY125US
DECFSZ TEMP_B,1
GOTO BELL1
DECFSZ TEMP_A,1
GOTO BELL2
RETURN
;**********************************************************
DELAY50US
MOV lw .15 ;DELAY50US
MOV wf TEMP1
decfsz TEMP1,F
goto $-1
RETLW0
;***********************250uS延时子程序1**************
DELAY125US
MOV LW.42
MOV WFTEMP_C
DECFSZ TEMP_C,F
GOTO $-1
RETURN
;********************************************
DELAY1MS
MOV lw .2
MOV wf TEMP2
MOV lw .170
MOV wf TEMP1
DECFSZ TEMP1,F
goto $-1
DECFSZ TEMP2,F
GOTO $-5
RETURN
;********************************************
DELAY10MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
CALLDELAY1MS
RETLW0
;********************************************
;延时子程序,约10MS
DELAY3
MOV LW.20
MOV WFTEMP1
LOOP1
MOV LW.166
MOV WFTEMP2
DECFSZTEMP2
GOTO$-1
DECFSZTEMP1
GOTOLOOP1
RETURN
;********************************************
;延时20MS子程序
DELAY20MS
MOV lw .40
MOV wf TEMP2
DELAY20MS_1
MOV lw .166
MOV wf TEMP1
DECFSZ TEMP1,F
goto $-1
DECFSZ TEMP2,F
GOTO DELAY20MS_1
RETURN
;********************************************
DELAY200MS
MOV lw .10
MOV wf TEMP3
DELAY200MS_2
MOV lw .40
MOV wf TEMP2
DELAY200MS_1
MOV lw .166
MOV wf TEMP1
DECFSZ TEMP1,F
goto $-1
DECFSZ TEMP2,F
GOTO DELAY200MS_1
DECFSZ TEMP3,F
GOTO DELAY200MS_2
RETURN
;********************************************
DELAY1S
MOV lw .50
MOV wf TEMP3
DELAY1S_2
MOV lw .40
MOV wf TEMP2
DELAY1S_1
MOV lw .166
MOV wf TEMP1
DECFSZ TEMP1,F
goto $-1
DECFSZ TEMP2,F
GOTO DELAY1S_1
DECFSZ TEMP3,F
GOTO DELAY1S_2
RETURN
;********************************************
RAM_TO_EE:
MOV LW20H
MOV WFDADR
MOV LW.2
MOV WFCNT
MOV LW00H
MOV WFEE_DADR
CALLEE_WRITE
RETURN
;*********************************EE_WRITE***********************************
;本程序实现从内部RAM传送多字节数据到内部EEPROM。
;入口参数:原操作数的地址放在DADR中,目标EEPROM的地址放在EE_DADR中,字节数在W中。
;出口参数:相关数据已写入指定EEPROM单元中。
;占用资源:W,STATUS,FSR,一重堆栈。
;**************************************************************************
EE_WRITE:
MOV FDADR,W
MOV WFFSR ;RAM单元首地址
MOV FEE_DADR,W
BANKSELPIE1 ;BANK1
BCFPIE1,EEIE ;关闭EE中断
BANKSELEEADR ;BANK2
MOV WFEEADR ;将目标地址写入EEADR
EE_LOOP2:
BANKSELPORTA ;BANK0
MOV FINDF,W
BANKSELEEDATA ;BANK2
MOV WFEEDATA ;将源数据写入EEDATA
BANKSELEECON1 ;BANK3
BCFEECON1,EEPGD;指定EEPROM为操作对象
BSFEECON1,WREN ;写允许
BCFINTCON,GIE ;关闭中断
MOV LW55H ;MICROChip
MOV WFEECON2 ;规
MOV LW0XAA ;定
MOV WFEECON2 ;代码
BSFEECON1,WR ;开始写入
BCFEECON1,WREN ;写保护
BTFSCEECON1,WR ;写完了吗?
GOTO$-1
BANKSELPORTA ;BANK0
INCFFSR,F ;写下一个数据
BANKSELEEADR ;BANK2
INCFEEADR,F
BANKSELPORTA ;BANK0
DECFSZCNT,F ;所有字节的数据写完了吗?
GOTONEXT1
BSFINTCON,GIE ;重新开总中断
RETURN
NEXT1:
GOTOEE_LOOP2
;********************************EE_READ***********************************
;本程序实现从内部连续的EEPROM单元传送多字节数据到内部RAM。
;入口参数:原操作数在EEPROM中的首地址放在EE_DADR中,目标RAM的首地址放在DADR中,
; 字节数放在CNT中。
;出口参数:相关数据已在指定的连续RAM单元中
;占用资源:W,STATUS,FSR,内部EEPROM模块,一重堆栈。
;***************************************************************************
EE_READ:
BANKSELPORTA ;BANK0
MOV FDADR,W
MOV WFFSR ;目标RAM的地址
MOV FEE_DADR,W
BANKSELEEADR ;BANK2
MOV WFEEADR ;地址
EE_READ1:
BANKSELEECON1 ;BANK3
BCFEECON1,EEPGD;指定EEPROM为操作对象
BSFEECON1,RD ;开始读取
BANKSELEEDATA ;BANK2
MOV FEEDATA,W
BANKSELPORTA ;BANK0
MOV WFINDF ;依次取出连续的数据
INCFFSR,F
BANKSELEEADR ;BANK2
INCFEEADR,F
BANKSELPORTA ;BANK0
DECFSZCNT,F ;判断所有字节的数据是否取完
GOTOEE_READ1
RETURN
;***************************************************************************
ORG0x2100
DE00H,0AH,00H,00H,00H,00H
END