• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

在线寻求帮助(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
回复