多种方法用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对比:
作用范围:
typedef:
如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾
如果放在某个函数内,定义域就是从定义开始直到该函数结尾
#define:
不管是在某个函数内,还是在所有函数之外
作用域都是从定义开始直到整个文件结尾特点:
define:
后面不用加分号
define前面要加#
typedef:
后面要加分号
define前面不要加#详细区别请参考
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)