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的值。

其他运算符

  • 逗号运算符,:依次执行多个表达式,返回最后一个表达式的值。
  • 指针运算符*(解引用)和&(取地址)。
  • 成员访问运算符.(结构体)和->(结构体指针)。
  • 下标运算符[]用于数组访问。

运算符优先级

运算符优先级从高到低依次为:

  1. 括号()、下标[]、成员访问.->
  2. 单目运算符(如!++*&
  3. 算术运算符(先乘除取模,后加减)
  4. 移位运算符<<>>
  5. 关系运算符
  6. 相等性运算符==!=
  7. 位运算符(按顺序&^|
  8. 逻辑运算符(先&&||
  9. 条件运算符?:
  10. 赋值运算符
  11. 逗号运算符,

  现在我们使用向左运算符号 << ;和取反符号 ~ ;进行功能的实现;

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--);
}       
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐