|
刚刚在编译时,提示编译成功了,但是没有生成任何子文件,像 .o .hex .c 都没有,我也是刚学这个单片机编程,好多不太理解,还望各位大佬帮忙指出一下,谢谢!!!!!
- 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
复制代码
|
|