找回密码
 立即注册
首页 业界区 安全 基于慧净电子HJ-5G开发板学习记录(1)——PIC16F877A开 ...

基于慧净电子HJ-5G开发板学习记录(1)——PIC16F877A开发流水灯

屋稷删 2025-6-11 13:12:54
(1)流水灯介绍

下图为慧净电子HJ-5G开发板流水灯部分的电路,其中需要先将JP1跳线帽接上进行短接操作,这样8个流水灯呈现共地状态。此时如果想要实现流水灯操作,只需要轮流将A、B、C、D、E、F、G、H这8个引脚的1个赋值为高电平,其余引脚赋值为低电平即可。
[img=50%,50%]https://img2024.cnblogs.com/blog/2739777/202501/2739777-20250126192633005-1661449895.png[/img]
而其中,如下图所示,A、B、C、D、E、F、G、H分别对应着是RD0~RD7这8个引脚,所以只需要分别输出0x10000000,0x01000000,0x00100000,...,0x00000001即可依次实现点亮流水灯。
[img=50%,50%]https://img2024.cnblogs.com/blog/2739777/202501/2739777-20250126212038029-2052072045.png[/img]
(2)代码解析

首先是慧净电子官方给出的代码
  1. #include<pic.h>                                //包含单片机内部资源预定义
  2. __CONFIG(0xFF32);                         //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
  3. void delay();                     //delay函数申明
  4. /****************************************************************************
  5. * 名    称:main()
  6. * 功    能:主函数
  7. ****************************************************************************/
  8. void main()
  9. {
  10.         TRISD = 0;                          //portd 输出
  11.         TRISE = 0x01;                          //使能LED流水灯
  12.         TRISA = 0x00;
  13.     //PORTA = 0X00;
  14.     //PORTC = 0X00;
  15.         while (1)                         //死循环,让LED持续点亮
  16.         {
  17.                 PORTD=0b00000001;         //点亮第1个发光管
  18.                 delay();
  19.                 PORTD=0b00000000;         //关掉发光管
  20.                 delay();
  21.                 PORTD=0b00000010;         //点亮第2个发光管
  22.                 delay();
  23.                 PORTD=0b00000000;         //关掉发光管
  24.                 delay();
  25.                 PORTD=0b00000100;         //点亮第3个发光管
  26.                 delay();
  27.                 PORTD=0b00000000;         //关掉发光管
  28.                 delay();
  29.                 PORTD=0b00001000;         //点亮第4个发光管
  30.                 delay();
  31.                 PORTD=0b00000000;         //关掉发光管
  32.                 delay();
  33.                 PORTD=0b00010000;         //点亮第5个发光管
  34.                 delay();
  35.                 PORTD=0b00000000;         //关掉发光管
  36.                 delay();
  37.                 PORTD=0b00100000;         //点亮第6个发光管
  38.                 delay();
  39.                 PORTD=0b00000000;         //关掉发光管
  40.                 delay();
  41.                 PORTD=0b01000000;         //点亮第7个发光管
  42.                 delay();
  43.                 PORTD=0b00000000;         //关掉发光管
  44.                 delay();
  45.                 PORTD=0b10000000;         //点亮第8个发光管
  46.                 delay();
  47.                 PORTD=0b00000000;         //关掉发光管
  48.                 delay();
  49.         }
  50. }
  51. /****************************************************************************
  52. * 名    称:delay()
  53. * 功    能:延时
  54. ****************************************************************************/
  55. void delay()
  56. {
  57.         int i;                         //定义整形变量
  58.         for (i = 10000;i--;);   //延时
  59. }
复制代码
在官方给出的例程中,分别进行以下步骤配置:

  • 引入头文件
  • 将芯片配置字设置为0xFF32
  • 设置延时函数
  • TRISD = 0;将PORTD口设置为输出模式。
  • TRISE = 0x01; 使能LED(在这里如果TRISE=0x00则会使得蜂鸣器报警)
[img=50%,50%]https://img2024.cnblogs.com/blog/2739777/202501/2739777-20250126223156963-1754216552.png[/img]


  • TRISA = 0x00;
  • 接下来轮循对PORTD口赋值为0b00000001,...,0x10000000。即可轮流点亮LED。
在这里,我们可以将代码进行优化,使用C语言的左移命令进行修改。
[code]#include                          // 包含单片机内部资源预定义__CONFIG(0xFF32);                        // 芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡void delay();                                 // 延时函数声明/***************************************************************************** 名    称:main() * 功    能:主函数****************************************************************************/void main(){        TRISE = 0x01;        TRISA = 0x00;        TRISD = 0;          // 设置PORTD为输出,控制LED        while (1)                  // 死循环,让LED持续点亮        {                unsigned char led_pattern = 0b00000001;  // 初始点亮第一个LED                for (int loop = 0; loop < 8; loop++)          // 循环点亮8个LED                {                        PORTD = led_pattern;                                  // 点亮LED                        delay();                                                         // 延时                        PORTD = 0b00000000;                                  // 熄灭LED                        delay();                                                          // 延时                        led_pattern = led_pattern
您需要登录后才可以回帖 登录 | 立即注册