先前关于PIC16F84A的文章解释了如何控制IC的GPIO(通用I/O)引脚。先前铺设的电路仅解释了如何打开或关闭LED。您只需将所需引脚设置为输出,然后发送高/低信号以打开/关闭LED。现在,在这篇文章中,让我们实现LED闪烁——“嵌入式电子的hello world程序”。那么,如何使LED闪烁?只需在无限循环中打开和关闭即可是的,这是对的,但在我们的情况下,这是行不通的。由于PIC以非常高的速度运行,尽管LED闪烁,但您将无法看到LED闪烁,并且它将显示为持续亮起。

延迟程序:

那么,我们如何解决这个问题呢?这很简单,添加一个延迟程序,让pic忙碌一段时间,这样你就可以看到LED闪烁。那么,如何添加延迟循环呢?

  1. 在通用寄存器中存储一个数字,比如255
  2. 将数字减1,直到它达到0。

我知道这听起来很愚蠢,这是浪费时间,耽误了PIC的运行。但是在适当的时候你会知道延迟惯例是非常重要的。那么,如何在程序中实现上述步骤呢?现在,是时候玩延时程序了。

MOVLW 255

MOVWF 0 ch

延迟DECFZ 0C,1

转到延迟

这里有代码吗…。

现在,上面的程序可以很好地让PIC忙着处理大约255条指令。对上述程序进行解码时,我们首先将值255(不允许大于255的值,因为16F84A的寄存器大小为8位)移动到指定通用寄存器的地址位置0CH。下一行引入一条新指令DECFZ,它执行两个任务。此指令DECFZ将寄存器递减指定的量。这里,它将寄存器递减1,并检查寄存器0CH(在我们的例子中)的内容是否变为零。如果寄存器的内容变为零,则跳过下一行,然后程序继续。因此,在连续循环中,寄存器递减至零。还有另一条指令:eq–它执行赋值操作。例如,REG EQU 0CH意味着oCH被分配给变量REG,在0CH的位置,您可以使用REG。这是一个方便的指令,使程序更具可读性。

上述延迟程序对于我们的PIC!是不够的!。它在以惊人的速度执行指令方面非常聪明。因此,您需要引入另一个延迟例程–延迟中的延迟。

延迟DECFZ 0C,1

转到延迟

DECFZ 0D,1

转到延迟

嗯……耽搁了不少时间。这里,控制器减少255到0 255次。这足以让我们的眼睛眨眼。

闪烁的LED:

这里是一个完整的程序,使LED连接到引脚13 (PORTB,0)闪烁。(注意此处使用的EQU指令)

0 ch NUM1装备

NUM2当量0DH

巴斯夫的地位,05年h

MOVLW B ' 00000000 '

MOVWF-TRISB

供应量的地位,05年h

净水器PORTB, 0开始

延迟decfz num1,1;延迟程序1

转到延迟

DECFZ NUM2 1

转到延迟

BCF端口B,0

DELAY DECFZ NUM1,1

转到延迟

DECFZ DECFZ NUM2,1

转到延迟

开始

注:除标签外的其他指令(如START和DELAY)应以空格开头,因为oshon编译器将任何没有空格的指令解释为标签。

上述代码的电路图:

如果LED灯闪烁,说明您完成了出色的工作!。尝试使用不同的延迟例程,如一个例程、两个例程等。。在不同的晶体频率(4,10,16,20 MHz)下,观察结果。

2.评论

  1. 罗杰西

    感谢您发布PIC16F84A简介和编程。
    我想尝试编程PIC16F84A教程。现在我的问题是,我要为我的Windows XP下载什么汇编程序,我需要什么程序员。你能给我提供这个编程器的电路图和给控制器写“汇编程序”的实用软件吗。

    问候,
    罗杰西

    • 安尼什

      嗨,罗杰,
      您可以使用micro JDM程序员对PIC进行编程。Google micro JDM程序员和软件,oshon PIC模拟器将有助于编写和组装程序,并使用ponyprog或ICPROG烧录PIC

Baidu