我在做實(shí)驗(yàn),是
有關(guān)鍵盤程序
及數(shù)據(jù)傳輸?shù)?
編譯沒有錯(cuò),
但是運(yùn)行不了
哪個(gè)哥哥幫我下
在線尋求幫助(pic匯編)
全部回復(fù)(11)
正序查看
倒序查看
@superrz13
貼出來看看
;按鍵掃描程序070831
;********定義存器************
status equ 3h ;定義狀態(tài)寄存器地址
portb equ 6h ;定義端口B數(shù)據(jù)寄存器地址
trisb equ 86h ;定義端口B方向控制寄存器地址
portc equ 7h ;定義端口C數(shù)據(jù)寄存器地址
trisc equ 87h ;
rp0 equ 5h ;定義狀態(tài)寄存器中的體選位
rp1 equ 5h
z equ 2h ;定義零標(biāo)志位置
fsr equ 04h
option_reg equ 81h ;定義選項(xiàng)寄存器
rbup equ 7 ;定義上拉電阻使能位位地址
data1 equ 20h ;定義延時(shí)變量寄存器
data2 equ 21h
n2 equ 0ffh ;定義延時(shí)常數(shù)
value equ 22h ;暫存按鍵列碼和位置碼
table equ 40h ;建在RAM中的按鍵位置碼表表頭
;地址,該表由16個(gè)元素單元組成,
;對應(yīng)16個(gè)鍵
;*******主程序**************
org 0000h
nop
bcf status,rp1 ;選擇狀態(tài)寄存器體0
bsf status,rp0 ;置位RP0為1
movlw 00h
movwf trisc ;設(shè)置端口C為輸出口
movlw 0ffh
movwf trisb ;設(shè)置端口了為輸入口
bcf status,rp0
movlw 0f0h ;11110000送C顯示
movwf portc
;********建立查表*************
movlw 77h ;0健健值碼
movwf 40h
movlw 0b7h ;1
movwf 41h
movlw 0d7h ;2
movwf 42h
movlw 0e7h ;3
movwf 43h
movlw 7bh ;4
movwf 44h
movlw 0bbh ;5
movwf 45h
movlw 0dbh ;6
movwf 46h
movlw 0ebh ;7
movwf 47h
movlw 7dh ;8
movwf 48h
movlw 0bdh ;9
movwf 49h
movlw 0ddh ;A
movwf 4ah
movlw 0edh ;B
movwf 4bh
movlw 7eh ;C
movwf 4ch
movlw 0beh ;D
movwf 4dh
movlw 0deh ;E
movwf 4eh
movlw 0eeh ;F
movwf 4fh
check
call keyscan ;調(diào)用按鍵掃描程序
comf value,0 ;取反鍵值存儲結(jié)果放入W
btfsc status,z ;測試是否有鍵按下?有!跳過下一條指令
goto check ;無,則循環(huán)檢測
movlw .13 ;送立即數(shù)13到DATA1
movwf data1
call delay ;調(diào)用延時(shí)程序,去抖動(dòng)
call keyscan ;再次調(diào)用鍵盤掃描程序
comf value,0 ;
btfsc status,z ;再次判斷是否有按鍵按下
goto check ;無,繼續(xù)檢測
call translate ;調(diào)用位置碼翻譯程序
movf fsr,0 ;FSR內(nèi)容送到W
movwf portc ;送C口顯示
check1
movlw .117
movwf data1 ;送立即數(shù)117以便產(chǎn)生100MS延時(shí)
call delay ;調(diào)用延時(shí)
call delay
movlw 0f0h ;送11110000到W
xorwf portc,1 ;C端口寄存器內(nèi)容與W內(nèi)容異或
;提示按鍵未放開
call keyscan ;再次調(diào)用按鍵掃描程序
comf value,0 ;位置碼取反送W
btfss status,z ;測試按鍵是否放開?是,跳過下一條指令
goto check1 ;否,則循環(huán)檢測
goto check ;是,大循環(huán)
;*********鍵盤掃描程序和按鍵識別子程序******************
;出口參數(shù),有鍵按下時(shí)寄存器calue=等于按鍵位置碼,無按下時(shí)=ff
keyscan
bcf status,rp1 ;設(shè)置到體1
bsf status,rp0
bcf option_reg,rbup ;啟用上拉電阻
movlw 0fh ;送00001111到B端口方向寄存器
movwf trisb ;RB0-RB3為輸出,RB4-7為輸入口
bcf status,rp0 ;設(shè)置到體0
movlw 00h
movwf portb ;送00000000到B口寄存器
nop
nop ;空指令等數(shù)據(jù)穩(wěn)定
movf portb,0 ;B口內(nèi)容傳給W
andlw 0fh ;B口寄存器與00001111相與結(jié)果放入W
movwf value ;結(jié)果放健值寄存器
xorlw 0fh ;與00001111相異或
btfsc status,z ;結(jié)果是否為零無鍵按下,為1有鍵按下
goto nokey ;為0無鍵按下
bsf status,rp0 ;有鍵按下,設(shè)置文件體1
bcf option_reg,7
movlw 0f0h ;送11110000到B口
movwf trisb ;設(shè)置RB0-3輸入RB4-7為輸出
bcf status,rp0 ;恢復(fù)體0
movf value,0 ;鍵值寄存器內(nèi)容入W
movwf portb ;放入B口寄存器
nop
nop
movf portb,0 ;讀B口寄存器內(nèi)容,放入W
andlw 0f0h ;B口和FFFF0000相與
iorwf value,1 ;將行碼秘列碼合起來放入鍵值寄存器
return
nokey
movlw 0ffh ;建立一個(gè)標(biāo)志值
movwf value
return
;*******健位碼/鍵值翻譯程序*********
;出口參數(shù):正常時(shí)寄存器FSR=鍵值;失常時(shí)=AAh
translate
movlw 40h ;指針地址,FSR設(shè)置表頭地址
movwf fsr ;也就是給文件選擇寄存器設(shè)置初始置
loopt1
movf 0,0 ;以間接尋址方式讀表,并入W
xorwf value,0 ;與鍵值寄存器內(nèi)容比較
btfsc status,z ;相等嗎?否,跳過下一步
goto loopt2 ;是,跳轉(zhuǎn)
incf fsr,1 ;地址指針加一
btfss fsr,4 ;查到尾了嗎?
goto loopt1 ;否,繼續(xù)查表
movlw 0aah ;是,位置碼超限
movwf fsr ;返回以01010101做標(biāo)志
return ;子程序返回
loopt2
bcf fsr,6 ;等效FSR-40H
return ;在FSR中得到健值
;*******延時(shí)程序******************
;入口參數(shù),外循環(huán)這量data1作定時(shí)常數(shù)
delay
lp0 movlw n2
movwf data2
lp1 decfsz data2,1
goto lp1
decfsz data1,1
goto lp0
return
end
高手指點(diǎn)一下哪里有錯(cuò)
;********定義存器************
status equ 3h ;定義狀態(tài)寄存器地址
portb equ 6h ;定義端口B數(shù)據(jù)寄存器地址
trisb equ 86h ;定義端口B方向控制寄存器地址
portc equ 7h ;定義端口C數(shù)據(jù)寄存器地址
trisc equ 87h ;
rp0 equ 5h ;定義狀態(tài)寄存器中的體選位
rp1 equ 5h
z equ 2h ;定義零標(biāo)志位置
fsr equ 04h
option_reg equ 81h ;定義選項(xiàng)寄存器
rbup equ 7 ;定義上拉電阻使能位位地址
data1 equ 20h ;定義延時(shí)變量寄存器
data2 equ 21h
n2 equ 0ffh ;定義延時(shí)常數(shù)
value equ 22h ;暫存按鍵列碼和位置碼
table equ 40h ;建在RAM中的按鍵位置碼表表頭
;地址,該表由16個(gè)元素單元組成,
;對應(yīng)16個(gè)鍵
;*******主程序**************
org 0000h
nop
bcf status,rp1 ;選擇狀態(tài)寄存器體0
bsf status,rp0 ;置位RP0為1
movlw 00h
movwf trisc ;設(shè)置端口C為輸出口
movlw 0ffh
movwf trisb ;設(shè)置端口了為輸入口
bcf status,rp0
movlw 0f0h ;11110000送C顯示
movwf portc
;********建立查表*************
movlw 77h ;0健健值碼
movwf 40h
movlw 0b7h ;1
movwf 41h
movlw 0d7h ;2
movwf 42h
movlw 0e7h ;3
movwf 43h
movlw 7bh ;4
movwf 44h
movlw 0bbh ;5
movwf 45h
movlw 0dbh ;6
movwf 46h
movlw 0ebh ;7
movwf 47h
movlw 7dh ;8
movwf 48h
movlw 0bdh ;9
movwf 49h
movlw 0ddh ;A
movwf 4ah
movlw 0edh ;B
movwf 4bh
movlw 7eh ;C
movwf 4ch
movlw 0beh ;D
movwf 4dh
movlw 0deh ;E
movwf 4eh
movlw 0eeh ;F
movwf 4fh
check
call keyscan ;調(diào)用按鍵掃描程序
comf value,0 ;取反鍵值存儲結(jié)果放入W
btfsc status,z ;測試是否有鍵按下?有!跳過下一條指令
goto check ;無,則循環(huán)檢測
movlw .13 ;送立即數(shù)13到DATA1
movwf data1
call delay ;調(diào)用延時(shí)程序,去抖動(dòng)
call keyscan ;再次調(diào)用鍵盤掃描程序
comf value,0 ;
btfsc status,z ;再次判斷是否有按鍵按下
goto check ;無,繼續(xù)檢測
call translate ;調(diào)用位置碼翻譯程序
movf fsr,0 ;FSR內(nèi)容送到W
movwf portc ;送C口顯示
check1
movlw .117
movwf data1 ;送立即數(shù)117以便產(chǎn)生100MS延時(shí)
call delay ;調(diào)用延時(shí)
call delay
movlw 0f0h ;送11110000到W
xorwf portc,1 ;C端口寄存器內(nèi)容與W內(nèi)容異或
;提示按鍵未放開
call keyscan ;再次調(diào)用按鍵掃描程序
comf value,0 ;位置碼取反送W
btfss status,z ;測試按鍵是否放開?是,跳過下一條指令
goto check1 ;否,則循環(huán)檢測
goto check ;是,大循環(huán)
;*********鍵盤掃描程序和按鍵識別子程序******************
;出口參數(shù),有鍵按下時(shí)寄存器calue=等于按鍵位置碼,無按下時(shí)=ff
keyscan
bcf status,rp1 ;設(shè)置到體1
bsf status,rp0
bcf option_reg,rbup ;啟用上拉電阻
movlw 0fh ;送00001111到B端口方向寄存器
movwf trisb ;RB0-RB3為輸出,RB4-7為輸入口
bcf status,rp0 ;設(shè)置到體0
movlw 00h
movwf portb ;送00000000到B口寄存器
nop
nop ;空指令等數(shù)據(jù)穩(wěn)定
movf portb,0 ;B口內(nèi)容傳給W
andlw 0fh ;B口寄存器與00001111相與結(jié)果放入W
movwf value ;結(jié)果放健值寄存器
xorlw 0fh ;與00001111相異或
btfsc status,z ;結(jié)果是否為零無鍵按下,為1有鍵按下
goto nokey ;為0無鍵按下
bsf status,rp0 ;有鍵按下,設(shè)置文件體1
bcf option_reg,7
movlw 0f0h ;送11110000到B口
movwf trisb ;設(shè)置RB0-3輸入RB4-7為輸出
bcf status,rp0 ;恢復(fù)體0
movf value,0 ;鍵值寄存器內(nèi)容入W
movwf portb ;放入B口寄存器
nop
nop
movf portb,0 ;讀B口寄存器內(nèi)容,放入W
andlw 0f0h ;B口和FFFF0000相與
iorwf value,1 ;將行碼秘列碼合起來放入鍵值寄存器
return
nokey
movlw 0ffh ;建立一個(gè)標(biāo)志值
movwf value
return
;*******健位碼/鍵值翻譯程序*********
;出口參數(shù):正常時(shí)寄存器FSR=鍵值;失常時(shí)=AAh
translate
movlw 40h ;指針地址,FSR設(shè)置表頭地址
movwf fsr ;也就是給文件選擇寄存器設(shè)置初始置
loopt1
movf 0,0 ;以間接尋址方式讀表,并入W
xorwf value,0 ;與鍵值寄存器內(nèi)容比較
btfsc status,z ;相等嗎?否,跳過下一步
goto loopt2 ;是,跳轉(zhuǎn)
incf fsr,1 ;地址指針加一
btfss fsr,4 ;查到尾了嗎?
goto loopt1 ;否,繼續(xù)查表
movlw 0aah ;是,位置碼超限
movwf fsr ;返回以01010101做標(biāo)志
return ;子程序返回
loopt2
bcf fsr,6 ;等效FSR-40H
return ;在FSR中得到健值
;*******延時(shí)程序******************
;入口參數(shù),外循環(huán)這量data1作定時(shí)常數(shù)
delay
lp0 movlw n2
movwf data2
lp1 decfsz data2,1
goto lp1
decfsz data1,1
goto lp0
return
end
高手指點(diǎn)一下哪里有錯(cuò)
0
回復(fù)
@雨樹淋風(fēng)
;按鍵掃描程序070831;********定義存器************ status equ 3h ;定義狀態(tài)寄存器地址 portb equ 6h ;定義端口B數(shù)據(jù)寄存器地址 trisb equ 86h ;定義端口B方向控制寄存器地址 portc equ 7h ;定義端口C數(shù)據(jù)寄存器地址 trisc equ 87h ; rp0 equ 5h ;定義狀態(tài)寄存器中的體選位 rp1 equ 5h z equ 2h ;定義零標(biāo)志位置 fsr equ 04h option_reg equ 81h ;定義選項(xiàng)寄存器 rbup equ 7 ;定義上拉電阻使能位位地址 data1 equ 20h ;定義延時(shí)變量寄存器 data2 equ 21h n2 equ 0ffh ;定義延時(shí)常數(shù) value equ 22h ;暫存按鍵列碼和位置碼 table equ 40h ;建在RAM中的按鍵位置碼表表頭 ;地址,該表由16個(gè)元素單元組成, ;對應(yīng)16個(gè)鍵;*******主程序************** org 0000h nop bcf status,rp1 ;選擇狀態(tài)寄存器體0 bsf status,rp0 ;置位RP0為1 movlw 00h movwf trisc ;設(shè)置端口C為輸出口 movlw 0ffh movwf trisb ;設(shè)置端口了為輸入口 bcf status,rp0 movlw 0f0h ;11110000送C顯示 movwf portc;********建立查表************* movlw 77h ;0健健值碼 movwf 40h movlw 0b7h ;1 movwf 41h movlw 0d7h ;2 movwf 42h movlw 0e7h ;3 movwf 43h movlw 7bh ;4 movwf 44h movlw 0bbh ;5 movwf 45h movlw 0dbh ;6 movwf 46h movlw 0ebh ;7 movwf 47h movlw 7dh ;8 movwf 48h movlw 0bdh ;9 movwf 49h movlw 0ddh ;A movwf 4ah movlw 0edh ;B movwf 4bh movlw 7eh ;C movwf 4ch movlw 0beh ;D movwf 4dh movlw 0deh ;E movwf 4eh movlw 0eeh ;F movwf 4fhcheck call keyscan ;調(diào)用按鍵掃描程序 comf value,0 ;取反鍵值存儲結(jié)果放入W btfsc status,z ;測試是否有鍵按下?有!跳過下一條指令 goto check ;無,則循環(huán)檢測 movlw .13 ;送立即數(shù)13到DATA1 movwf data1 call delay ;調(diào)用延時(shí)程序,去抖動(dòng) call keyscan ;再次調(diào)用鍵盤掃描程序 comf value,0 ; btfsc status,z ;再次判斷是否有按鍵按下 goto check ;無,繼續(xù)檢測 call translate ;調(diào)用位置碼翻譯程序 movf fsr,0 ;FSR內(nèi)容送到W movwf portc ;送C口顯示check1 movlw .117 movwf data1 ;送立即數(shù)117以便產(chǎn)生100MS延時(shí) call delay ;調(diào)用延時(shí) call delay movlw 0f0h ;送11110000到W xorwf portc,1 ;C端口寄存器內(nèi)容與W內(nèi)容異或 ;提示按鍵未放開 call keyscan ;再次調(diào)用按鍵掃描程序 comf value,0 ;位置碼取反送W btfss status,z ;測試按鍵是否放開?是,跳過下一條指令 goto check1 ;否,則循環(huán)檢測 goto check ;是,大循環(huán);*********鍵盤掃描程序和按鍵識別子程序******************;出口參數(shù),有鍵按下時(shí)寄存器calue=等于按鍵位置碼,無按下時(shí)=ffkeyscan bcf status,rp1 ;設(shè)置到體1 bsf status,rp0 bcf option_reg,rbup ;啟用上拉電阻 movlw 0fh ;送00001111到B端口方向寄存器 movwf trisb ;RB0-RB3為輸出,RB4-7為輸入口 bcf status,rp0 ;設(shè)置到體0 movlw 00h movwf portb ;送00000000到B口寄存器 nop nop ;空指令等數(shù)據(jù)穩(wěn)定 movf portb,0 ;B口內(nèi)容傳給W andlw 0fh ;B口寄存器與00001111相與結(jié)果放入W movwf value ;結(jié)果放健值寄存器 xorlw 0fh ;與00001111相異或 btfsc status,z ;結(jié)果是否為零無鍵按下,為1有鍵按下 goto nokey ;為0無鍵按下 bsf status,rp0 ;有鍵按下,設(shè)置文件體1 bcf option_reg,7 movlw 0f0h ;送11110000到B口 movwf trisb ;設(shè)置RB0-3輸入RB4-7為輸出 bcf status,rp0 ;恢復(fù)體0 movf value,0 ;鍵值寄存器內(nèi)容入W movwf portb ;放入B口寄存器 nop nop movf portb,0 ;讀B口寄存器內(nèi)容,放入W andlw 0f0h ;B口和FFFF0000相與 iorwf value,1 ;將行碼秘列碼合起來放入鍵值寄存器 returnnokey movlw 0ffh ;建立一個(gè)標(biāo)志值 movwf value return;*******健位碼/鍵值翻譯程序*********;出口參數(shù):正常時(shí)寄存器FSR=鍵值;失常時(shí)=AAhtranslate movlw 40h ;指針地址,FSR設(shè)置表頭地址 movwf fsr ;也就是給文件選擇寄存器設(shè)置初始置loopt1 movf 0,0 ;以間接尋址方式讀表,并入W xorwf value,0 ;與鍵值寄存器內(nèi)容比較 btfsc status,z ;相等嗎?否,跳過下一步 goto loopt2 ;是,跳轉(zhuǎn) incf fsr,1 ;地址指針加一 btfss fsr,4 ;查到尾了嗎? goto loopt1 ;否,繼續(xù)查表 movlw 0aah ;是,位置碼超限 movwf fsr ;返回以01010101做標(biāo)志 return ;子程序返回loopt2 bcf fsr,6 ;等效FSR-40H return ;在FSR中得到健值;*******延時(shí)程序******************;入口參數(shù),外循環(huán)這量data1作定時(shí)常數(shù)delaylp0 movlw n2 movwf data2lp1 decfsz data2,1 goto lp1 decfsz data1,1 goto lp0 return end高手指點(diǎn)一下哪里有錯(cuò)
用仿真器單步跟蹤運(yùn)行,就可以找到問題了,單片機(jī)這東西,要軟硬件結(jié)合分析才行了,光看軟件沒用,別人并不知道你的電路是怎么樣的,
編譯沒有錯(cuò),只能說明你的指令正確,不等于你的軟件邏輯功能正確.
編譯沒有錯(cuò),只能說明你的指令正確,不等于你的軟件邏輯功能正確.
0
回復(fù)
@雨樹淋風(fēng)
我還在痛苦的摸索階段.還要請你多幫忙指點(diǎn)
你這個(gè)程序?qū)?yīng)的什么片子,877A?一般書本上都喜歡這個(gè),不過程序看著一般,你能把對應(yīng)電路圖發(fā)上來看看么
用這個(gè)覆蓋你前面幾行看看
;按鍵掃描程序070831
list p=16f877A ; list directive to define processor
#include ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _XT_OSC & _LVP_OFF
;********定義存器************
status equ 3h ;定義狀態(tài)寄存器地址
portb equ 6h ;定義端口B數(shù)據(jù)寄存器地址
trisb equ 86h ;定義端口B方向控制寄存器地址
portc equ 7h ;定義端口C數(shù)據(jù)寄存器地址
trisc equ 87h ;
rp0 equ 2h ;定義狀態(tài)寄存器中的體選位
rp1 equ 5h
z equ 2h ;定義零標(biāo)志位置
fsr equ 04h
option_reg equ 81h ;定義選項(xiàng)寄存器
rbup equ 7 ;定義上拉電阻使能位位地址
data1 equ 20h ;定義延時(shí)變量寄存器
data2 equ 21h
n2 equ 0ffh ;定義延時(shí)常數(shù)
value equ 22h ;暫存按鍵列碼和位置碼
table equ 40h ;建在RAM中的按鍵位置碼表表頭
;地址,該表由16個(gè)元素單元組成,
;對應(yīng)16個(gè)鍵
用這個(gè)覆蓋你前面幾行看看
;按鍵掃描程序070831
list p=16f877A ; list directive to define processor
#include
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _XT_OSC & _LVP_OFF
;********定義存器************
status equ 3h ;定義狀態(tài)寄存器地址
portb equ 6h ;定義端口B數(shù)據(jù)寄存器地址
trisb equ 86h ;定義端口B方向控制寄存器地址
portc equ 7h ;定義端口C數(shù)據(jù)寄存器地址
trisc equ 87h ;
rp0 equ 2h ;定義狀態(tài)寄存器中的體選位
rp1 equ 5h
z equ 2h ;定義零標(biāo)志位置
fsr equ 04h
option_reg equ 81h ;定義選項(xiàng)寄存器
rbup equ 7 ;定義上拉電阻使能位位地址
data1 equ 20h ;定義延時(shí)變量寄存器
data2 equ 21h
n2 equ 0ffh ;定義延時(shí)常數(shù)
value equ 22h ;暫存按鍵列碼和位置碼
table equ 40h ;建在RAM中的按鍵位置碼表表頭
;地址,該表由16個(gè)元素單元組成,
;對應(yīng)16個(gè)鍵
0
回復(fù)
@powernj
你這個(gè)程序?qū)?yīng)的什么片子,877A?一般書本上都喜歡這個(gè),不過程序看著一般,你能把對應(yīng)電路圖發(fā)上來看看么用這個(gè)覆蓋你前面幾行看看;按鍵掃描程序070831list p=16f877A ;listdirectivetodefineprocessor#include ;processorspecificvariabledefinitions__CONFIG _CP_OFF&_WDT_ON&_BODEN_ON&_PWRTE_ON&_XT_OSC &_LVP_OFF;********定義存器************status equ 3h ;定義狀態(tài)寄存器地址portb equ 6h ;定義端口B數(shù)據(jù)寄存器地址trisb equ 86h ;定義端口B方向控制寄存器地址portc equ 7h ;定義端口C數(shù)據(jù)寄存器地址trisc equ 87h ;rp0 equ 2h ;定義狀態(tài)寄存器中的體選位rp1 equ 5hz equ 2h ;定義零標(biāo)志位置fsr equ 04hoption_reg equ 81h ;定義選項(xiàng)寄存器rbup equ 7 ;定義上拉電阻使能位位地址data1 equ 20h ;定義延時(shí)變量寄存器data2 equ 21hn2 equ 0ffh ;定義延時(shí)常數(shù)value equ 22h ;暫存按鍵列碼和位置碼table equ 40h ;建在RAM中的按鍵位置碼表表頭 ;地址,該表由16個(gè)元素單元組成, ;對應(yīng)16個(gè)鍵
我定義頭文件總出現(xiàn)錯(cuò)誤,郁悶
0
回復(fù)