标题:
mplab仿真错误,编译成功但是没有生成任何子文件 .o .hex .c
[打印本页]
作者:
yuri141
时间:
2020-12-28 09:45
标题:
mplab仿真错误,编译成功但是没有生成任何子文件 .o .hex .c
刚刚在编译时,提示编译成功了,但是没有生成任何子文件,像 .o .hex .c 都没有,我也是刚学这个单片机编程,好多不太理解,还望各位大佬帮忙指出一下,谢谢!!!!!
51hei截图20201228094317.png
(244.94 KB, 下载次数: 48)
下载附件
2020-12-28 09:43 上传
list p=16f887
#include <p16f887.inc> ; processor specific variable definitions
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
BIAN EQU 0X40 ;键盘显示中间变量
KEYFLAG EQU 0X43
NUM EQU 0X44
NUM4 EQU 0X48
NUMB EQU 0X49 ;计数变量
GE EQU 0X50
SHI EQU 0X51
BAI EQU 0X52
SHANG EQU 0X53
YUSHU EQU 0X54
COUNTER EQU 0X55
NUM5 EQU 0X56
NUM6 EQU 0X57
NUM7 EQU 0X58
NUM8 EQU 0X59
NUM9 EQU 0X60
NUM10 EQU 0X61
NUM11 EQU 0X62
;**********************************************************************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto MAIN ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
BCF INTCON,T0IF ;清 TMR0 溢出标志位
DECFSZ COUNTER ;循环减 1,是否为 0
GOTO RT ;否,中断返回
DECF NUMB ;是,计数变量减 1
MOVLW .20 ;循环数赋初值 20
MOVWF COUNTER
RT MOVLW 3DH ;50 毫秒时间常数初值
MOVWF TMR0
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
MAIN ;主程序
; remaining code goes here
BSF STATUS,RP1 ;16F887 初始化
BSF STATUS,RP0
CLRF ANSEL
CLRF ANSELH
BCF STATUS,RP1
BCF STATUS,RP0
CLRF BIAN ;变量的初始化
CLRF NUM4
CLRF NUM
CLRF NUM8
CLRF NUM9
CLRF NUM10
MOVLW 01H ;KEYFLAG 初始化,为 1
MOVWF KEYFLAG
BSF STATUS,RP0 ;进入体 1
CLRF TRISD ;RD 设为输出
MOVLW 07H ;分频比为 1:256
MOVWF OPTION_REG
MOVLW 0C1H ;RB 的位 1,2,3,4,5 设为输出
MOVWF TRISB
MOVLW 0F0H ;RD 低四位输入,高四位输出
MOVWF TRISC
MOVLW 08H ;RE 位 1,2,3 输出
MOVWF TRISE
BCF STATUS,RP0 ;进入体 0
MOVLW B'10100000' ;打开总中断和 T0 中断使能位
MOVWF INTCON
MOVLW .20 ;送入中断循环次数初值为 20
MOVWF COUNTER
MOVLW 0FFH ;RB,RD 关闭
MOVWF PORTD
MOVWF PORTB
MOVLW 07H ;RE 关闭
MOVWF PORTE
CLRF NUM5 ;清空变量
CLRF NUM6
CLRF NUM7
GOTO LOOP ;跳至大循环
;动态计数显示子程序,用于倒计时数的显示
LOOP6 CALL CALC ;调用分解子程序
CALL DISPLAY ;调用显示子程序
CALL JIANPAN ;调用键盘扫描子程序
MOVLW 00H ;计数变量是否为 0
SUBWF NUMB,W
BTFSC STATUS,Z
CALL LIGHT ;是,调用为 0 提示及恢复子程序
GOTO LOOP6 ;否,返回循环
;提示子程序,用于计时为 0 时的提示和程序的重初始化
LIGHT BCF INTCON,5 ;关闭 T0 使能,计时器停止工作
CALL SHANSHU ;调用小灯闪烁子程序
MOVLW 01H ;KEYFLAG 初始化
MOVWF KEYFLAG
CLRF NUM9 ;中间变量的初始化
CLRF NUM10
GOTO LOOP ;跳转至 LOOP 大循环,重新开始工作
;分解子程序,多位数的分解
CALC MOVF NUMB,W ;显示变量送入 W 寄存器
CALL DIV10 ;调用除十子程序
MOVWF GE ;将返回数送入 GE,用于个位显示
MOVF SHANG,W ;变量 SHANG 送如 W 寄存器
CALL DIV10 ;调用除十子程序
MOVWF SHI ;返回数送入 SHI,用于十位的显示
MOVF SHANG,W ;SHANG 送入 BAI,用于百位的显示
MOVWF BAI
RETURN
;显示子程序
DISPLAY MOVF GE,W ;个位数送入 W 寄存器
CALL CHABIAO ;查表子程序
MOVWF PORTD ;码值送入段选
BCF PORTB,1 ;个位位选打开
CALL DELAY ;延时
BSF PORTB,1 ;位选关闭
MOVF SHI,W
CALL CHABIAO ;十位数查表
MOVWF PORTD ;送入段选
BCF PORTB,2 ;十位位选打开
CALL DELAY ;延时
BSF PORTB,2 ;位选关闭
MOVF BAI,W
CALL CHABIAO ;百位数查表
MOVWF PORTD ;送入段选
BCF PORTB,3 ;百位位选打开
CALL DELAY ;延时
BSF PORTB,3 ;位选关闭
RETURN
;除十子程序
DIV10 MOVWF YUSHU ;将值送入 YUSHU
CLRF SHANG ;清空 SHANG
MOVLW .10
DIVLOOP SUBWF YUSHU,F ;YUSHU 减 10
INCF SHANG,F ;SHANG 加 1
BTFSC STATUS,C ;是否借位
GOTO DIVLOOP ;无,返回继续判断
DECF SHANG,F ;是,SHANG 减 1
ADDWF YUSHU,W ;YUSHU 加 10 放入 W 返回
RETURN
;键盘扫描及显示大循环,用于键入数的显示
LOOP CALL JIANPAN ;调用键盘扫描子程序
BTFSC KEYFLAG,1 ;是否第一次键
CALL XIANSHI1 ;是,调用显示 1 子程序
BTFSC KEYFLAG,2 ;是否第二次键入
CALL XIANSHI2 ;是,调用显示 2 子程序
BTFSC KEYFLAG,3 ;是否第三次键入
CALL XIANSHI3 ;是,调用显示 3 子程序
BTFSC KEYFLAG,4 ;是否第四次按下
CALL FLAGINI ;是,调用键入次数循环子程序
GOTO LOOP ;返回大循环
;键入次数循环子程序
FLAGINI MOVLW 02H ;KEYFLAG 恢复初始值
MOVWF KEYFLAG
RETURN
;查表子程序
CHABIAO ADDWF PCL,F
RETLW0XC0
RETLW0XF9
RETLW0XA4
RETLW0XB0
RETLW0X99
RETLW0X92
RETLW0X82
RETLW0XF8
RETLW0X80
RETLW0X90
;键盘显示 1 子程序
XIANSHI1 BCF PORTB,1 ;位选打开
MOVF BIAN,W ;送入键入数段选
MOVWF PORTD
MOVWF NUM ;段选复制到 NUM 里,为后来使用
BSF PORTB,1 ;关闭位选
MOVF NUM8,W ;将加入数送入 NUM5
MOVWF NUM5
MOVWF NUMB ;同时送入显示变量
MOVWF NUM11 ;为显示 3 子程序所用
RETURN
;键盘显示 2 子程序,用于 2 位数的键入显示
XIANSHI2 BCF PORTB,1 ;个位位选打开
MOVF BIAN,W ;送入段选
MOVWF PORTD
MOVWF NUM4 ;同时复制到 NUM4,为 3 位显示所用
CALL DELAY ;延时
BSF PORTB,1 ;个位位选关闭
BCF PORTB,2 ;十位位选打开
MOVF NUM,W ;送入段选
MOVWF PORTD
CALL DELAY ;延时
BSF PORTB,2 ;位选关闭
;2 个数组合成十进制两位数
MOVF NUM8,W ;将 NUM8 放入 NUM6,为送数所用
MOVWF NUM6
MOVLW 00H ;十位是否为 0
SUBWF NUM5,F
BTFSS STATUS,Z
CALL JIASHI1 ;否,调用加十 1 子程序
MOVF NUM9,W ;将 NUM9 与 NUM6 相加
ADDWF NUM6,W
MOVWF NUMB ;放入显示变量里
RETURN
;加十 1 子程序
JIASHI1 MOVLW .10 ;NUM9 加十
ADDWF NUM9,F
DECF NUM5,F ;NUM5 减 1
BTFSS STATUS,Z ;判断是否为 0
GOTO JIASHI1 ;否,继续加十
RETURN ;是,返回
;键盘显示 3 子程序,用于键入 3 位数的显示
XIANSHI3 BCF PORTB,1 ;个位位选打开
MOVF BIAN,W ;送入个位段选
MOVWF PORTD
CALL DELAY ;调用短时间延时子程序
BSF PORTB,1 ;关闭个位位选
BCF PORTB,2 ;打开十位位选
MOVF NUM4,W ;送入十位段选
MOVWF PORTD
CALL DELAY ;延时
BSF PORTB,2 ;关闭位选
BCF PORTB,3 ;打开百位位选
MOVF NUM,W ;送入百位段选
MOVWF PORTD
CALL DELAY ;延时
BSF PORTB,3 ;关闭位选
;进行三个数到十进制三位数的转换
MOVF NUM8,W ;将 NUM8 复制到 MUM7
MOVWF NUM7
MOVLW 00H ;判断百位数是否为 0
SUBWF NUM11,F
BTFSS STATUS,Z
CALL JIABAI ;不为 0,调用加百子程序
MOVLW 00H ;为 0,继续判断十位数是否为 0
SUBWF NUM6,F
BTFSS STATUS,Z
CALL JIASHI2 ;不为 0,调用加十 2 子程序
MOVF NUM10,W ;将个位数与 NUM10 相加
ADDWF NUM7,W
MOVWF NUMB ;组成的数放入显示变量 NUMB
RETURN
;加百子程序
JIABAI MOVLW .100 ;NUM10 加 100
ADDWF NUM10,F
DECF NUM11,F ;NUM11 减 1
BTFSS STATUS,Z ;判断是否为 0
GOTO JIABAI ;不为 0,返回加百
RETURN ;为 0,返回
;加十 2 子程序
JIASHI2 MOVLW .10 ;NUM10 加 10
ADDWF NUM10,F
DECF NUM6,F ;NUM6 减 1
BTFSS STATUS,Z ;是否为 0
GOTO JIASHI2 ;否,继续加十
RETURN ;是,返回
;键盘子程序,用于判断是否键入和键入何键,并实现相应功能
JIANPAN MOVLW 00H ;RC 口低四位输出低电平
MOVWF PORTC
MOVLW 0F0H
ANDWF PORTC,W ;屏蔽低四位
SUBLW 0F0H
BTFSC STATUS,Z ;判断高四位是否为全 1
RETURN ;是,无键输入,返回继续判断
CALL DELAY10MS ;否,有可能有键输入,延时 20 毫秒
CALL DELAY10MS
MOVLW 0F0H ;再判断一次是否键入
ANDWF PORTC,W
SUBLW 0F0H
BTFSC STATUS,Z
RETURN ;虚假输入,返回
BCF PORTB,5 ;确实有键输入,蜂鸣器鸣叫
MOVLW 0FEH ;逐行判断哪个键输入,首先 RC0=0
MOVWF PORTC
BTFSS PORTC,4 ;判断键 0
GOTO JIAN0 ;是,跳至键 0 功能子程序
BTFSS PORTC,5 ;判断键 1
GOTO JIAN1 ;是,跳至键 1 功能子程序
BTFSS PORTC,6 ;判断键 2
GOTO JIAN2 ;是,跳至键 2 功能子程序
BTFSS PORTC,7 ;判断键 3
GOTO JIAN3 ;是,跳至键 3 功能子程序
MOVLW 0FDH ;RC1=0
MOVWF PORTC
BTFSS PORTC,4 ;判断键 4
GOTO JIAN4 ;是,跳至键 4 功能子程序
BTFSS PORTC,5 ;判断键 5
GOTO JIAN5 ;是,跳至键 5 功能子程序
BTFSS PORTC,6 ;判断键 6
GOTO JIAN6 ;是,跳至键 6 功能子程序
BTFSS PORTC,7 ;判断键 7
GOTO JIAN7 ;是,跳至键 7 功能子程序
MOVLW 0FBH ;RC2=0
MOVWF PORTC
BTFSS PORTC,4 ;判断键 8
GOTO JIAN8 ;是,跳至键 8 功能子程序
BTFSS PORTC,5 ;判断键 9
GOTO JIAN9 ;是,跳至键 9 功能子程序
BTFSS PORTC,6 ;判断键 A
GOTO JIANA ;是,跳至键 A 功能子程序
BTFSS PORTC,7 ;判断键 B
GOTO JIANB ;是,跳至键 B 功能子程序
MOVLW 0F7H ;RC3=0
MOVWF PORTC
BTFSS PORTC,4 ;判断键 C
GOTO JIANC ;是,跳至键 C 功能子程序
BTFSS PORTC,5 ;判断键 D
GOTO JIAND ;是,跳至键 D 功能子程序
BTFSS PORTC,6 ;判断键 E
GOTO JIANE ;是,跳至键 E 功能子程序
BTFSS PORTC,7 ;判断键 F
GOTO JIANF ;是,跳至键 F 功能子程序
RETURN
;0 到 9 按键,用于键入数字
JIAN0 CALL SFANG ;释放
MOVLW 00H ;将 0 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 0 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 0 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN1 CALL SFANG ;释放
MOVLW 01H ;将 1 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 1 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 1 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN2 CALL SFANG ;释放
MOVLW 02H ;将 2 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 2 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 2 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN3 CALL SFANG ;释放
MOVLW 03H ;将 3 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 3 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 3 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN4 CALL SFANG ;释放
MOVLW 04H ;将 4 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 4 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 4 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN5 CALL SFANG ;释放
MOVLW 05H ;将 5 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 5 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 5 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN6 CALL SFANG ;释放
MOVLW 06H ;将 6 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 6 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 6 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN7 CALL SFANG ;释放
MOVLW 07H ;将 7 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 7 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 7 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN8 CALL SFANG ;释放
MOVLW 08H ;将 8 放入 W 寄存器
MOVWF NUM8 ;NUM8 带 8 返回
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 8 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
JIAN9 CALL SFANG ;释放
MOVLW 09H ;NUM8 带 9 返回
MOVWF NUM8 ;将 9 放入 W 寄存器
CALL CHABIAO ;调用查表子程序
MOVWF BIAN ;BIAN 带 9 显示码返回
RLF KEYFLAG,1 ;键按下一次,KEYFLAG 左移一位
RETURN
;A 键,用于倒计时的开始
JIANA CALL SFANG ;释放
BSF INTCON,5 ;T0 使能打开,为定时器开启做准备
MOVLW 3DH ;为定时器送初值,定时开始
MOVWF TMR0
GOTO LOOP6 ;进入倒计时显示大循环
RETURN
;B 键,用于计数暂停
JIANB CALL SFANG ;释放
BCF INTCON,5 ;T0 使能关闭,计数停止
RETURN
;C 键,用于计数继续
JIANC CALL SFANG ;释放
BSF INTCON,5 ;T0 使能打开,计数继续
RETURN
;D 键,用于计数加一
JIAND CALL SFANG ;释放
INCF NUMB ;显示变量加一
RETURN
;E 键,用于计数减一
JIANE CALL SFANG ;释放
DECF NUMB ;显示变量减一
RETURN
;F 键,用于清零和重新开始
JIANF CALL SFANG ;调用释放子程序
BCF INTCON,5 ;T0 使能关闭,停止计时
MOVLW 01H ;键盘次数判断恢复初始值
MOVWF KEYFLAG
CLRF NUM9 ;中间变量的初始化
CLRF NUM10
GOTO LOOP ;跳转至 LOOP 大循环
;释放子程序
SFANG MOVLW 00H ;RC 口低四位输出赋低电平
MOVWF PORTC
MOVLW 0F0H ;屏蔽低四位
ANDWF PORTC,W
SUBLW 0F0H
BTFSS STATUS,Z ;判断高四位是否有低电平
GOTO SFANG ;有低电平,未释放,返回继续判断
CALL DELAY10MS ;无低电平,延时 10 毫秒
MOVLW 0F0H ;再次确认
ANDWF PORTC,W
SUBLW 0F0H
BTFSS STATUS,Z ;再次判断
GOTO SFANG ;虚假释放,返回继续判断
BSF PORTB,5 ;已释放,蜂鸣器停止鸣叫
RETURN ;返回
;10 毫秒延时子程序
DELAY10MS
MOVLW 0DH
MOVWF 23H
LOOP4 MOVLW 0FFH
MOVWF 24H
LOOP5 DECFSZ 24H
GOTO LOOP5
DECFSZ 23H
GOTO LOOP4
RETURN
;短时间延时子程序
DELAY DECFSZ 0X30,F
GOTO DELAY
RETURN
;小灯闪烁子程序,3 种颜色的小灯每隔 1 秒交替亮灭 1 秒
SHANSHU BCF PORTE,0 ;灯 0 亮
BCF PORTB,5 ;蜂鸣器开
CALL DELAY1S
MOVLW 0FFH ;灯 0 灭
BSF PORTB,5 ;蜂鸣器关
MOVWF PORTE
CALL DELAY1S
BCF PORTE,1 ;灯 1 亮
BCF PORTB,5 ;蜂鸣器开
CALL DELAY1S
MOVLW 0FFH ;灯 1 灭
BSF PORTB,5 ;蜂鸣器关
MOVWF PORTE
CALL DELAY1S
BCF PORTE,2 ;灯 2 亮
BCF PORTB,5 ;蜂鸣器开
CALL DELAY1S
MOVLW 0FFH ;灯 2 灭
BSF PORTB,5 ;蜂鸣器关
MOVWF PORTE
CALL DELAY1S
RETURN
;1 秒延时子程序
DELAY1S MOVLW 06H
MOVWF 20H
LOOP1 MOVLW 0EBH
MOVWF 21H
LOOP2 MOVLW 0ECH
MOVWF 22H
LOOP3 DECFSZ 22H
GOTO LOOP3
DECFSZ 21H
GOTO LOOP2
DECFSZ 20H
GOTO LOOP1
RETURN
END
复制代码
作者:
zzzggghhh
时间:
2020-12-28 13:07
子文件需要你自己保存呢,百度一下,很简单的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1