当前位置:首页 > 单片机 > 单片机
[导读] INCLUDE ;MCUPIC16F877DIP40LIST P=PIC16F877;__CONFIG _CP_OFF&_DEBUG_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_LVP_OFF ;PIC16F877;__IDLOCS0x7206errorlevel -302 errorlevel -203CBLOCK 20HCOUNTERHC

INCLUDE ;MCUPIC16F877DIP40

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭