实验思路:
声明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赋一个初始值。