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