標題:
mplab仿真錯誤,編譯成功但是沒有生成任何子文件 .o .hex .c
[打印本頁]
作者:
yuri141
時間:
2020-12-28 09:45
標題:
mplab仿真錯誤,編譯成功但是沒有生成任何子文件 .o .hex .c
剛剛在編譯時,提示編譯成功了,但是沒有生成任何子文件,像 .o .hex .c 都沒有,我也是剛學這個單片機編程,好多不太理解,還望各位大佬幫忙指出一下,謝謝。。。!
51hei截圖20201228094317.png
(244.94 KB, 下載次數(shù): 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 ;計數(shù)變量
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 ;循環(huán)減 1,是否為 0
GOTO RT ;否,中斷返回
DECF NUMB ;是,計數(shù)變量減 1
MOVLW .20 ;循環(huán)數(shù)賦初值 20
MOVWF COUNTER
RT MOVLW 3DH ;50 毫秒時間常數(shù)初值
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 ;送入中斷循環(huán)次數(shù)初值為 20
MOVWF COUNTER
MOVLW 0FFH ;RB,RD 關閉
MOVWF PORTD
MOVWF PORTB
MOVLW 07H ;RE 關閉
MOVWF PORTE
CLRF NUM5 ;清空變量
CLRF NUM6
CLRF NUM7
GOTO LOOP ;跳至大循環(huán)
;動態(tài)計數(shù)顯示子程序,用于倒計時數(shù)的顯示
LOOP6 CALL CALC ;調用分解子程序
CALL DISPLAY ;調用顯示子程序
CALL JIANPAN ;調用鍵盤掃描子程序
MOVLW 00H ;計數(shù)變量是否為 0
SUBWF NUMB,W
BTFSC STATUS,Z
CALL LIGHT ;是,調用為 0 提示及恢復子程序
GOTO LOOP6 ;否,返回循環(huán)
;提示子程序,用于計時為 0 時的提示和程序的重初始化
LIGHT BCF INTCON,5 ;關閉 T0 使能,計時器停止工作
CALL SHANSHU ;調用小燈閃爍子程序
MOVLW 01H ;KEYFLAG 初始化
MOVWF KEYFLAG
CLRF NUM9 ;中間變量的初始化
CLRF NUM10
GOTO LOOP ;跳轉至 LOOP 大循環(huán),重新開始工作
;分解子程序,多位數(shù)的分解
CALC MOVF NUMB,W ;顯示變量送入 W 寄存器
CALL DIV10 ;調用除十子程序
MOVWF GE ;將返回數(shù)送入 GE,用于個位顯示
MOVF SHANG,W ;變量 SHANG 送如 W 寄存器
CALL DIV10 ;調用除十子程序
MOVWF SHI ;返回數(shù)送入 SHI,用于十位的顯示
MOVF SHANG,W ;SHANG 送入 BAI,用于百位的顯示
MOVWF BAI
RETURN
;顯示子程序
DISPLAY MOVF GE,W ;個位數(shù)送入 W 寄存器
CALL CHABIAO ;查表子程序
MOVWF PORTD ;碼值送入段選
BCF PORTB,1 ;個位位選打開
CALL DELAY ;延時
BSF PORTB,1 ;位選關閉
MOVF SHI,W
CALL CHABIAO ;十位數(shù)查表
MOVWF PORTD ;送入段選
BCF PORTB,2 ;十位位選打開
CALL DELAY ;延時
BSF PORTB,2 ;位選關閉
MOVF BAI,W
CALL CHABIAO ;百位數(shù)查表
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 ;無,返回繼續(xù)判斷
DECF SHANG,F ;是,SHANG 減 1
ADDWF YUSHU,W ;YUSHU 加 10 放入 W 返回
RETURN
;鍵盤掃描及顯示大循環(huán),用于鍵入數(shù)的顯示
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 ;是,調用鍵入次數(shù)循環(huán)子程序
GOTO LOOP ;返回大循環(huán)
;鍵入次數(shù)循環(huán)子程序
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 ;送入鍵入數(shù)段選
MOVWF PORTD
MOVWF NUM ;段選復制到 NUM 里,為后來使用
BSF PORTB,1 ;關閉位選
MOVF NUM8,W ;將加入數(shù)送入 NUM5
MOVWF NUM5
MOVWF NUMB ;同時送入顯示變量
MOVWF NUM11 ;為顯示 3 子程序所用
RETURN
;鍵盤顯示 2 子程序,用于 2 位數(shù)的鍵入顯示
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 個數(shù)組合成十進制兩位數(shù)
MOVF NUM8,W ;將 NUM8 放入 NUM6,為送數(shù)所用
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 ;否,繼續(xù)加十
RETURN ;是,返回
;鍵盤顯示 3 子程序,用于鍵入 3 位數(shù)的顯示
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 ;關閉位選
;進行三個數(shù)到十進制三位數(shù)的轉換
MOVF NUM8,W ;將 NUM8 復制到 MUM7
MOVWF NUM7
MOVLW 00H ;判斷百位數(shù)是否為 0
SUBWF NUM11,F
BTFSS STATUS,Z
CALL JIABAI ;不為 0,調用加百子程序
MOVLW 00H ;為 0,繼續(xù)判斷十位數(shù)是否為 0
SUBWF NUM6,F
BTFSS STATUS,Z
CALL JIASHI2 ;不為 0,調用加十 2 子程序
MOVF NUM10,W ;將個位數(shù)與 NUM10 相加
ADDWF NUM7,W
MOVWF NUMB ;組成的數(shù)放入顯示變量 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 ;否,繼續(xù)加十
RETURN ;是,返回
;鍵盤子程序,用于判斷是否鍵入和鍵入何鍵,并實現(xiàn)相應功能
JIANPAN MOVLW 00H ;RC 口低四位輸出低電平
MOVWF PORTC
MOVLW 0F0H
ANDWF PORTC,W ;屏蔽低四位
SUBLW 0F0H
BTFSC STATUS,Z ;判斷高四位是否為全 1
RETURN ;是,無鍵輸入,返回繼續(xù)判斷
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 按鍵,用于鍵入數(shù)字
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 ;進入倒計時顯示大循環(huán)
RETURN
;B 鍵,用于計數(shù)暫停
JIANB CALL SFANG ;釋放
BCF INTCON,5 ;T0 使能關閉,計數(shù)停止
RETURN
;C 鍵,用于計數(shù)繼續(xù)
JIANC CALL SFANG ;釋放
BSF INTCON,5 ;T0 使能打開,計數(shù)繼續(xù)
RETURN
;D 鍵,用于計數(shù)加一
JIAND CALL SFANG ;釋放
INCF NUMB ;顯示變量加一
RETURN
;E 鍵,用于計數(shù)減一
JIANE CALL SFANG ;釋放
DECF NUMB ;顯示變量減一
RETURN
;F 鍵,用于清零和重新開始
JIANF CALL SFANG ;調用釋放子程序
BCF INTCON,5 ;T0 使能關閉,停止計時
MOVLW 01H ;鍵盤次數(shù)判斷恢復初始值
MOVWF KEYFLAG
CLRF NUM9 ;中間變量的初始化
CLRF NUM10
GOTO LOOP ;跳轉至 LOOP 大循環(huán)
;釋放子程序
SFANG MOVLW 00H ;RC 口低四位輸出賦低電平
MOVWF PORTC
MOVLW 0F0H ;屏蔽低四位
ANDWF PORTC,W
SUBLW 0F0H
BTFSS STATUS,Z ;判斷高四位是否有低電平
GOTO SFANG ;有低電平,未釋放,返回繼續(xù)判斷
CALL DELAY10MS ;無低電平,延時 10 毫秒
MOVLW 0F0H ;再次確認
ANDWF PORTC,W
SUBLW 0F0H
BTFSS STATUS,Z ;再次判斷
GOTO SFANG ;虛假釋放,返回繼續(xù)判斷
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.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1