91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

在線尋求幫助(pic匯編)

我在做實驗,是
有關鍵盤程序
及數據傳輸的

編譯沒有錯,
但是運行不了

哪個哥哥幫我下
全部回復(11)
正序查看
倒序查看
superrz13
LV.1
2
2007-07-16 16:21
貼出來看看
0
回復
2007-09-03 18:00
@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




高手指點一下哪里有錯
0
回復
ptan
LV.3
4
2007-09-04 11:54
@雨樹淋風
;按鍵掃描程序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
回復
powernj
LV.6
5
2007-09-04 15:34
@ptan
用仿真器單步跟蹤運行,就可以找到問題了,單片機這東西,要軟硬件結合分析才行了,光看軟件沒用,別人并不知道你的電路是怎么樣的,編譯沒有錯,只能說明你的指令正確,不等于你的軟件邏輯功能正確.
???
0
回復
2007-09-04 16:27
@powernj
???
MCD2,這個程序是李學海<>的一個實例,在MCD2上調不通.找不到原因.
0
回復
ptan
LV.3
7
2007-09-05 09:39
@雨樹淋風
MCD2,這個程序是李學海的一個實例,在MCD2上調不通.找不到原因.
rp0      equ   5h     ;定義狀態寄存器中的體選位
      rp1      equ   5h

這個上面是不是定義錯了,應該是rp1      equ   6h
0
回復
powernj
LV.6
8
2007-09-06 17:16
@雨樹淋風
MCD2,這個程序是李學海的一個實例,在MCD2上調不通.找不到原因.
書上的程序也會有錯誤,兄弟還是要沙里淘金,看清程序或者要逐條分析,不知我上面的帖子有什么問題,有廣告嫌疑么?我只是個PIC單片機FANS,呵呵,希望有機會探討啊.
0
回復
powernj
LV.6
9
2007-09-06 17:22
@ptan
rp0      equ  5h    ;定義狀態寄存器中的體選位      rp1      equ  5h這個上面是不是定義錯了,應該是rp1      equ  6h
一般在中低檔PIC中在選擇體上,我已經不用這兩個指令了,現在我只用BANKSEL <寄存器>格式
0
回復
2007-09-07 08:56
@powernj
書上的程序也會有錯誤,兄弟還是要沙里淘金,看清程序或者要逐條分析,不知我上面的帖子有什么問題,有廣告嫌疑么?我只是個PIC單片機FANS,呵呵,希望有機會探討啊.
我還在痛苦的摸索階段.還要請你多幫忙指點
0
回復
powernj
LV.6
11
2007-09-07 12:48
@雨樹淋風
我還在痛苦的摸索階段.還要請你多幫忙指點
你這個程序對應的什么片子,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個鍵
0
回復
2007-09-21 16:25
@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
回復
主站蜘蛛池模板: 铜山县| 眉山市| 南充市| 精河县| 张北县| 二手房| 冀州市| 长岭县| 裕民县| 抚顺市| 岑溪市| 鹤岗市| 宁化县| 新建县| 永德县| 芦溪县| 浦北县| 武隆县| 来安县| 七台河市| 通河县| 双城市| 大余县| 子洲县| 诏安县| 乌拉特前旗| 陵川县| 丽江市| 同德县| 平乡县| 会理县| 宝山区| 葵青区| 武山县| 故城县| 六盘水市| 石河子市| 渝北区| 镇平县| 徐汇区| 教育|