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

(1)流水灯介绍

下图为慧净电子HJ-5G开发板流水灯部分的电路,其中需要先将JP1跳线帽接上进行短接操作,这样8个流水灯呈现共地状态。此时如果想要实现流水灯操作,只需要轮流将A、B、C、D、E、F、G、H这8个引脚的1个赋值为高电平,其余引脚赋值为低电平即可。

而其中,如下图所示,A、B、C、D、E、F、G、H分别对应着是RD0~RD7这8个引脚,所以只需要分别输出0x10000000,0x01000000,0x00100000,...,0x00000001即可依次实现点亮流水灯。

(2)代码解析

首先是慧净电子官方给出的代码

#include<pic.h>				//包含单片机内部资源预定义
__CONFIG(0xFF32); 			//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

void delay();             	//delay函数申明

/****************************************************************************
* 名    称:main()
* 功    能:主函数
****************************************************************************/
void main()
{
	TRISD = 0;  			//portd 输出
	TRISE = 0x01;  			//使能LED流水灯
	TRISA = 0x00;
    //PORTA = 0X00;
    //PORTC = 0X00;

	while (1)         		//死循环,让LED持续点亮
	{
		PORTD=0b00000001; 	//点亮第1个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();

		PORTD=0b00000010; 	//点亮第2个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();

		PORTD=0b00000100; 	//点亮第3个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();

		PORTD=0b00001000; 	//点亮第4个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();

		PORTD=0b00010000; 	//点亮第5个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();

		PORTD=0b00100000; 	//点亮第6个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();

		PORTD=0b01000000; 	//点亮第7个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();

		PORTD=0b10000000; 	//点亮第8个发光管
		delay();
		PORTD=0b00000000; 	//关掉发光管
		delay();
	}
}
/****************************************************************************
* 名    称:delay()
* 功    能:延时

****************************************************************************/
void delay()
{
	int i;                 	//定义整形变量
	for (i = 10000;i--;);   //延时
}

在官方给出的例程中,分别进行以下步骤配置:

  • 引入<pic.h>头文件
  • 将芯片配置字设置为0xFF32
  • 设置延时函数
  • TRISD = 0;将PORTD口设置为输出模式。
  • TRISE = 0x01; 使能LED(在这里如果TRISE=0x00则会使得蜂鸣器报警)
  • TRISA = 0x00;
  • 接下来轮循对PORTD口赋值为0b00000001,...,0x10000000。即可轮流点亮LED。

在这里,我们可以将代码进行优化,使用C语言的左移命令进行修改。

#include <pic.h> 			// 包含单片机内部资源预定义
__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 << 1;  	// 左移,点亮下一个LED
		}
	}
}

/****************************************************************************
* 名    称:delay()   
* 功    能:延时函数
****************************************************************************/
void delay()              
{
    int i;  // 定义整型变量
    for (i = 10000; i--;);  // 延时
}

在这里,我使用了for循环和左移指令,分别赋予PORTD口不同的数值,使其呈现轮循的状态。

posted @   儒隐  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
点击右上角即可分享
微信分享提示