LED流水灯控制代码详解
LED灯从左到右一次点亮
如果想要实现上面的要求即
点亮第一个LED; P0 =0XEF; 1111 1110;
点亮第二个LED; P0 =0XFD; 1111 1101;
点亮第三个LED; P0 =0XFB; 1111 1011;
点亮第四个LED; P0 =0XF7; 1111 0111;
点亮第五个LED; P0 =0XEF; 1110 1111;
点亮第六个LED; P0 =0XDF; 1101 1111;
点亮第七个LED; P0 =0XBF; 1011 1111;
点亮第八个LED; P0 =0X7F; 0111 1111;
现在进行测试:
#include <stc15.h>
void DElay_ms(int ms);
void main()
{
while(1)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P0=0XFE;DElay_ms(1000); //点亮第一个后1秒钟执行下一步
P0=0XFD;DElay_ms(1000);
P0=0XFB;DElay_ms(1000);
P0=0XF7;DElay_ms(1000);
P0=0XEF;DElay_ms(1000);
P0=0XDF;DElay_ms(1000);
P0=0XBF;DElay_ms(1000);
P0=0X7F;DElay_ms(1000);
}
}
void DElay_ms(int ms)
{
int i,j;
for(i=0;i<ms;i++);
for(j=853;j>0;j--);
}
但是现在好像还是有一点繁琐;既然LDE灯每次只有一个为0变化;于是我们想到可不可以每次让0移动1位来控制呢?于是我们找到了运算符号<<和~;
这里我们就要普及一点运算符知识啦:
算术运算符
C语言中基础的算术运算符包括加法+、减法-、乘法*、除法/和取模%。取模运算符%用于计算整数除法的余数,例如5 % 3结果为2。
自增++和自减--分为前缀和后缀形式。前缀形式(如++a)先增减后使用,后缀形式(如a++)先使用后增减。
关系运算符
关系运算符用于比较操作数的大小关系,返回值为1(真)或0(假)。包括:
- 等于
== - 不等于
!= - 大于
> - 小于
< - 大于等于
>= - 小于等于
<=
逻辑运算符
逻辑运算符用于组合或取反条件:
- 逻辑与
&&(两操作数均为真时返回真) - 逻辑或
||(任一操作数为真时返回真) - 逻辑非
!(取反操作数的真假值)
位运算符
位运算符直接对二进制位进行操作:
- 按位与
& - 按位或
| - 按位异或
^ - 按位取反
~ - 左移
<<(高位丢弃,低位补0) - 右移
>>(低位丢弃,高位补符号位或0)
赋值运算符
基础赋值运算符为=,复合赋值运算符结合了算术或位运算:
+=、-=、*=、/=%=、&=、|=、^=<<=、>>=
条件运算符
三元条件运算符?:是C语言中唯一的三目运算符,语法为条件 ? 表达式1 : 表达式2。若条件为真,返回表达式1的值,否则返回表达式2的值。
其他运算符
- 逗号运算符
,:依次执行多个表达式,返回最后一个表达式的值。 - 指针运算符
*(解引用)和&(取地址)。 - 成员访问运算符
.(结构体)和->(结构体指针)。 - 下标运算符
[]用于数组访问。
运算符优先级
运算符优先级从高到低依次为:
- 括号
()、下标[]、成员访问.和-> - 单目运算符(如
!、++、*、&) - 算术运算符(先乘除取模,后加减)
- 移位运算符
<<和>> - 关系运算符
- 相等性运算符
==和!= - 位运算符(按顺序
&、^、|) - 逻辑运算符(先
&&后||) - 条件运算符
?: - 赋值运算符
- 逗号运算符
,
现在我们使用向左运算符号 << ;和取反符号 ~ ;进行功能的实现;
1111 1110 << 在向左移位运算符号下为 1111 1101 ;
那也证明了 我们可以让LED灯移位;在使用~进行取反;
1111 1101 ~ 0000 0010
那我们可以令P0=0000 0001;进行以上操作变为 P0= 1111 1101;
现在进行猜想认证:
#include <stc15.h>
void DElay_ms(int ms);
unsigned char LED =0; //定义一个无符号形变量;
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
while(1)
{
for(LED=0;LED<8;LED++) //for循环;初次进入令LED为0;每运行一次LED加一;当LED等于8;跳出循环;
{
P0=~(0X01<<LED);
DElay_ms(500);
}
}
}
void DElay_ms(int ms)
{
int i,j;
for(i=0;i<ms;i++);
for(j=853;j>0;j--);
} 更多推荐


所有评论(0)