多种方法用51实现LED流水灯,举一反三程序举例,一篇文章就够了!

文章目录

  • 基本知识
    • 循环左移右移函数
      • _ crol _(a,b);
      • _ cror _(a,b);
    • #define使用
      • 格式:
      • 作用:
      • define与typedef对比:
        • 区别程序
  • 程序
    • 位操作
    • 库函数
      • 注意
  • 举一反三
    • 位运算
    • 直接赋值
    • 库函数
  • 其他

基本知识

循环左移右移函数

_ crol _(a,b);

循环左移函数
a是左移的,b是左移的位数
包含在intrins.h库函数里面

_ cror _(a,b);

循环右移函数
a是右移的,b是右移的位数
包含在intrins.h库函数里面

#define使用

格式:

#define A P0

作用:

  • 含义清楚
    一个规范的程序中不建议使用很多直接常量,例如sum=15*14
    应该尽量使用“见名知义”的变量名和符号常量
  • 一改全改
    例如在程序中有用到价格,如果价格用常数表示,则价格调整时,需要在程序作多处修改,若用define ,则只需要修改一行,如
    #define PRICE 35

define与typedef对比:

  1. 作用范围
    typedef:
    如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾
    如果放在某个函数内,定义域就是从定义开始直到该函数结尾
    #define:
    不管是在某个函数内,还是在所有函数之外
    作用域都是从定义开始直到整个文件结尾

  2. 特点
    define:
    后面不用加分号
    define前面要加#
    typedef:
    后面要加分号
    define前面不要加#

  3. 详细区别请参考
    C语言中 #define与typedef的区别

区别程序

#include <stdio.h> #define P_INT int* #define BA int typedef int *p_int; typedef int ba; //unsigned ba i;//error unsigned BA i;//ok int main(void) { int val1=10; int val2=20; const p_int c=&val1;//c不可以改变,但c指向的内容可以改变 const P_INT a=&val1;//a可以改变,但a指向的内容不能改变 //*a=20;//error a=&val2;//ok //c=&val2;//error *c=20;//ok return 0; }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

顺便提一个小点,定义的时候都要定义在最前面,否则就会出现错误

MAIN.C(34): error C202: 'a': undefined identifier
  • 1
  • 1

#define后面加上分号就会出现这样的情况

warning : expression with possibly no effect

  • 1
  • 1

(可能没有影响的表达)

error: syntax error near '='
  • 1
  • 1

(“=”附近的语法错误)

程序

位操作

#include'reg51.h' #define LED P0 typedef unsigned char u8; typedef unsigned int u16; void delay(u16 i) { while(i--) ; } void main() { u8 i; LED=0x01; delay(50000); while(1) { for(i=0;i<8;i++) { LED=1<<i; delay(50000); } } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

库函数

#include'reg51.h'
#include'intrins.h'
#define LED P0
typedef unsigned char u8;
typedef unsigned int u16;

void delay(u16 i)
{
while(i--) ;
}

void main()

{
u8 i;
LED=0x01;
delay(50000);
    while(1)
   {
for(i=0;i<7;i++)
{
LED=_crol_(LED,1);
delay(50000);
}
for(i=0;i<7;i++)
{
LED=_cror_(LED,1);
delay(50000);
}

   }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

注意

_ crol (LED,1) 不能写成 crol _(0x01,1)
虽然这样意思相同,但这样就没有流水灯效果了,只有第1、2个灯亮

举一反三

题目:让LED灯条从两端同时开始亮,然后汇聚到中间,然后在向两端发散,循环往复

位运算

#include'reg51.h' #include'intrins.h' #define LED P0 typedef unsigned char u8; typedef unsigned int u16; void delay(u16 i) { while(i--) ; } void main() { u8 i; while(1) { for(i=0;i<4;i++) { LED=(0x01<<i)|(0x80>>i); delay(50000); } for(i=0;i<2;i++) { LED=(0x20<<i)|(0x04>>i); delay(50000); } } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

直接赋值

#include <stdio.h>
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
u8 led[]={0x81,0x42,0x24,0x18,0x24,0x42,0x81,};
void delay(u16 k)
{
 while(k--);
}

void main()
{
while(1)
{
u8 i=0;
while(i<6)
{
P0=led[i];
i++;
delay(50000);
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

库函数

#include'reg51.h' #include'intrins.h' typedef unsigned char u8; typedef unsigned int u16; #define LED P0 void delay(u16 i) { while(i--) ; } void main() { u8 i; LED=0x00; delay(50000); while(1) { for(i=0;i<4;i++) { LED=_crol_(0x01,i)|_cror_(0x80,i) ; delay(50000); } for(i=0;i<2;i++) { LED=_crol_(0x20,i)|_cror_(0x04,i); delay(50000); } } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

其他

#include'reg51.h'
#define LED P0
typedef unsigned char u8;
typedef unsigned int u16;

  void delay(u16 i)
 {
  while(i--) ;
 }

void main()
{
u8 i;
LED=0xfe;
delay(50000);
    while(1)
   {
   for(i=0;i<8;i++)
{
LED=LED<<1;
delay(50000);
}
LED=0X80;
for(i=0;i<8;i++)
{

LED|=LED>>1;
delay(50000);
}

   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
(0)

相关推荐