求助:pic16汇编的理解

[复制链接]
1392|4
手机看帖
扫描二维码
随时随地手机跟帖
kknd1573|  楼主 | 2013-6-2 23:00 | 显示全部楼层 |阅读模式
本帖最后由 kknd1573 于 2013-6-2 23:15 编辑

各位大侠,小弟初学PIC16的汇编遇到一个问题,有一段PIC16F506单片机的汇编程序,可是小弟怎么也不理解:

………………变量定义
#DEFINE IN_SINGLE PORTB,2

DELAY_H                EQU        11H
DELAY_L                EQU        12H
TIME_H           EQU        16H
TIME_L                EQU        17H

………………开始
LOOP_RESET:
        MOVLW        00H
        MOVWF        STATUS
        MOVLW        B'11000000'
        TRIS          PORTC
        MOVLW        B'11111111'
        TRIS         PORTB
LOOP_1
        MOVLW        LOW(D'2200')
        MOVWF        DELAY_ L        
        MOVLW        HIGH(D'2200')
        MOVWF        DELAY_ H
        INCF         TIME_ L
        BTFSC        STATUS,Z
        INCF         TIME_ H
        MOVF        TIME_ L,W
        IORWF        TIME_ H,W
        BTFSC        STATUS,Z
        GOTO        LOOP_RESET
        BTFSS        IN_SINGLE
       GOTO        LOOP_1        
        CLRF        TIME_ H
        CLRF        TIME_ L
        NOP
        NOP
……………………
这一段无非是初始化加一个系统的初始延时,延时是利用TIME_H和TIME_L做的16位加法延时,而我的问题是:
延时开始为啥需要对DELAY进行赋值?
DELAY的赋值在这段程序中其的什么作用?
整个这段程序要怎么理解?

如果用C语言来写,这一段又要如何表达呢?
        

youss| | 2013-6-3 06:23 | 显示全部楼层
看看这个呢:
delay.JPG

使用特权

评论回复
kvdong| | 2013-6-3 08:16 | 显示全部楼层
也许是以前程序的产物,现在没什么用了;
也许在程序其它位置(比如中断)中有用,需要整个程序来看了

使用特权

评论回复
yewuyi| | 2013-6-3 08:55 | 显示全部楼层
延时开始为啥需要对DELAY进行赋值?
RE:使用其作为计数器,自然应该给于其一个初始值,这个初始值的大小,在这段代码中意味着消耗的指令周期数量。
DELAY的赋值在这段程序中其的什么作用?
RE:使用其作为计数器
整个这段程序要怎么理解?
RE:单纯从本段代码来说,没什么有效意义

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
kknd1573 + 1
llqjmy| | 2013-6-3 13:40 | 显示全部楼层
C语言:

unsigned int DELAY;
unsigned int TIME_INT;

void LOOP_RESET(void)
{
        STATUS=0x00;
        TRISC=0xc0;
        TRISB=0xff;

       DELAY=2200;
       TIME_INT++;
       while(TIME_INT==0)
       {
          STATUS=0x00;
          TRISC=0xc0;
          TRISB=0xff;

           DELAY=2200;
           TIME_INT++;
        }

        do
        {
               DELAY=2200;
               TIME_INT++;
               while(TIME_INT==0)
               {
                  STATUS=0x00;
                  TRISC=0xc0;
                  TRISB=0xff;

                  DELAY=2200;
                  TIME_INT++;
               }

        }while(!IN_SINGLE);

       NOP();
       NOP();
}

其中IN_SINGLE是个位定义。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
kknd1573 + 2 很给力!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

31

帖子

0

粉丝