实验思路:
声明intrins.h头文件
D1-D8灯连接P0.0-P0.7管脚,使用define宏定义P0端口
重定义数据类型unsigned char为"U8",unsigned int为"U16"
在流水循环开始前,给LED_PORT(P0端口)赋个初始值
完整代码:
/*****************************程序信息*********************************
* 实验名称:控制LED模块实现单向流水灯(使用移位库函数)
* 文件名称:main.c
* 版 本:V1.00
* 日 期:2021-12-01
* 编 著:gefon
* 说 明:使用普中A7开发版,控制LED灯实现D1-D8单向流水
*******************************声明区*********************************/
#include "reg52.h"
#include "intrins.h"
#define LED_PORT P0 //对P0端口宏定义
typedef unsigned char U8; //对系统数据类型重定义
typedef unsigned int U16;
/*******************************子程序*********************************
* 函 数 名 :delay_10us
* 函数功能 :延时函数,当传入变量ten_us=1时,约延时10us
* 输 入 :ten_us
* 输 出 :无
***********************************************************************/
void delay_10us(U16 ten_us)
{
while(ten_us--);
}
/*******************************主程序*********************************
* 函 数 名 :main
* 函数功能 :主函数
* 输 入 :无
* 输 出 :无
***********************************************************************/
void main()
{
U8 i;
LED_PORT=0xFE; //定义LED_PORT初始值为0xFE
delay_10us(50000); //延时约480ms(11.0592MHz)
while(1)
{
for(i=0;i<7;i++)
{
LED_PORT=_crol_(LED_PORT,1); //将LED左移1位
delay_10us(50000); //延时约480ms(11.0592MHz)
}
/*下面代码为使LED右移,如要实现双向流水,但需启用以下代码即可*/
// for(i=0;i<7;i++)
// {
// LED_PORT=_cror_(LED_PORT,1); //将LED右移1位
// delay_10us(50000);
// }
}
}实验分析:
使用位移方式为移位后自动补零,如果当前位向前移一位,后面会自动补"0",而最前面一位会被移除掉
而使用移位库函数时,当前位置向前移一位时,最前一位移到最后面,即像循环排队一样的移动方式。使用移位库函数在进入循环前,先需要给LED_PORT赋一个初始值。