状态:普通
加入收藏加入收藏 刷新刷新
您的当前位置: 电源网首页 > 社区论坛 > 电源技术综合区> 在线寻求帮助(pic汇编)

ff44671095 称号: 工兵 电源币:21

在线寻求帮助(pic汇编)

2007-07-15 19:08:09

本帖标识: 普通

我在做实验,是
有关键盘程序
及数据传输的

编译没有错,
但是运行不了

哪个哥哥帮我下


回复第1

2
2007-07-16 16:21:08

   superrz13 称号:工兵 电源币:26

贴出来看看

回复第2

3
2007-09-03 18:00:31

   雨树淋风 称号:营长 电源币:792

;按键扫描程序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




高手指点一下哪里有错

回复第3

4
2007-09-04 11:54:02

   ptan 称号:班长 电源币:77

用仿真器单步跟踪运行,就可以找到问题了,单片机这东西,要软硬件结合分析才行了,光看软件没用,别人并不知道你的电路是怎么样的,
编译没有错,只能说明你的指令正确,不等于你的软件逻辑功能正确.

回复第4

5
2007-09-04 15:34:08

   powernj 称号:连长 电源币:345

???

回复第5

6
2007-09-04 16:27:34

   雨树淋风 称号:营长 电源币:792

我是用的WWW,PIC16,COM网站的MCD2,这个程序是李学海<>的一个实例,在MCD2上调不通.找不到原因.

回复第6

7
2007-09-05 09:39:52

   ptan 称号:班长 电源币:77

rp0      equ   5h     ;定义状态寄存器中的体选位
      rp1      equ   5h

这个上面是不是定义错了,应该是rp1      equ   6h

回复第7

9
2007-09-06 17:22:28

   powernj 称号:连长 电源币:345

一般在中低档PIC中在选择体上,我已经不用这两个指令了,现在我只用BANKSEL <寄存器>格式

回复第9

8
2007-09-06 17:16:14

   powernj 称号:连长 电源币:345

书上的程序也会有错误,兄弟还是要沙里淘金,看清程序或者要逐条分析,不知我上面的帖子有什么问题,有广告嫌疑么?我只是个PIC单片机FANS,呵呵,希望有机会探讨啊.

回复第8

10
2007-09-07 08:56:04

   雨树淋风 称号:营长 电源币:792

我还在痛苦的摸索阶段.还要请你多帮忙指点

回复第10

11
2007-09-07 12:48:46

   powernj 称号:连长 电源币:345

你这个程序对应的什么片子,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个键

回复第11

12
2007-09-21 16:25:49

   雨树淋风 称号:营长 电源币:792

我定义头文件总出现错误,郁闷

回复第12

电源网 | 电源网国际站 | 电力网 | 照明网
天津网博互动科技有限公司版权所有 1999-2008
津ICP备06002026号