01_单片机_LED
上手学习单片机,编写第一个LED程序
1. 控制单个LED亮灭
1.1. 分析电路硬件图,如图,LED一端全部连接至Vcc,共阳连接方式,J19连接单片机端口I/O:Port0

1.2. 控制单个LED闪烁,比如控制D1亮灭,只要将连接D1的端口置于0(low),D1会点亮;置于1(High),D1会灭。代码如下:
1 #include <REG51.H> 2 3 // 延时函数 4 void delay(void) 5 { 6 unsigned char i, j; 7 for(i=150; i--; i>0) 8 for(j=200; j--; j>0); 9 } 10 11 void main(void) 12 { 13 P0 = 0xfe; // 1111 1110 14 delay(); 15 P0 = 0xff; // 1111 1111 16 delay(); 17 }
2. 制作流水灯,D1~D8,从D1到D8向流水似的,保证其中一颗处于亮的状态
2.1. 原始方法,将8种状态逐个写出来(1111 1110,1111 1101, 1111 1011, 1111 0111, 1110 1111, 1101 1111, 1011 1111, 0111 1111)
1 #include <REG51.H> 2 3 // 延时函数 4 void delay(void) 5 { 6 unsigned char i, j; 7 for(i=150; i--; i>0) 8 for(j=200; j--; j>0); 9 } 10 11 void main(void) 12 { 13 P0 = 0xfe; // 1111 1110 14 delay(); 15 P0 = 0xfd; // 1111 1101 16 delay(); 17 P0 = 0xfb; // 1111 1011 18 delay(); 19 P0 = 0xf7; // 1111 0111 20 delay(); 21 P0 = 0xef; // 1110 1111 22 delay(); 23 P0 = 0xdf; // 1101 1111 24 delay(); 25 P0 = 0xbf; // 1011 1111 26 delay(); 27 P0 = 0x7f; // 0111 1111 28 delay(); 29 }
2.2. 上述方法,若是需要更多LED状态,就得继续增加,缺点代码会很多;优点个人感觉易理解
2.3. 接下来使用移位方法,向左或向右移动1位(符号 >> or <<),空出位置自动补0
由于当前LED状态置于0(low)会点亮,采用反码方式(符号 ~),为了区别和前面使用的方法,流水灯方向从D8-->D1
1 #include <REG51.H> 2 3 // 延时函数 4 void delay(void) 5 { 6 unsigned char i, j; 7 for(i=200; i--; i>0) 8 for(j=200; j--; j>0); 9 } 10 11 void main(void) 12 { 13 unsigned char i; 14 unsigned char dat = 0x80; 15 for(i=0; i<8; i++) 16 { 17 P0 = ~(dat>>i); 18 delay(); 19 } 20 }
3. 制作跑马灯,与流水灯不同的是,跑马灯1个灭其他都亮;流水灯1个亮其他都灭
3.1. 原始方法实现,D1-->D8 (0000 0001, 0000 0010, 0000 0100, 0000 1000, 0001 0000, 0010 0000, 0100 0000, 1000 0000)
1 #include <REG51.H> 2 3 // 延时函数 4 void delay(void) 5 { 6 unsigned char i, j; 7 for(i=200; i--; i>0) 8 for(j=200; j--; j>0); 9 } 10 11 void main(void) 12 { 13 P0 = 0x01; // 0000 0001 14 delay(); 15 P0 = 0x02; // 0000 0010 16 delay(); 17 P0 = 0x04; // 0000 0100 18 delay(); 19 P0 = 0x08; // 0000 1000 20 delay(); 21 P0 = 0x10; // 0001 0000 22 delay(); 23 P0 = 0x20; // 0010 0000 24 delay(); 25 P0 = 0x40; // 0100 0000 26 delay(); 27 P0 = 0x80; // 1000 0000 28 delay(); 29 }
3.2. 移位方法实现,D8-->D1
1 #include <REG51.H> 2 3 // 延时函数 4 void delay(void) 5 { 6 unsigned char i, j; 7 for(i=200; i--; i>0) 8 for(j=200; j--; j>0); 9 } 10 11 void main(void) 12 { 13 unsigned char i; 14 unsigned char dat = 0x80; 15 for(i=0; i<8; i++) 16 { 17 P0 = dat>>i; 18 delay(); 19 } 20 }
4. 制作中间往外扩散流水灯
4.1. 原始方法:每个LED状态
1 #include <REG51.H> 2 3 // 延时函数 4 void delay(void) 5 { 6 unsigned char i, j; 7 for(i=200; i--; i>0) 8 for(j=200; j--; j>0); 9 } 10 11 void main(void) 12 { 13 P0 = 0xe7; // 1110 0111 14 delay(); 15 P0 = 0xdb; // 1101 1011 16 delay(); 17 P0 = 0xbd; // 1011 1101 18 delay(); 19 P0 = 0x7e; // 0111 1110 20 delay(); 21 }
4.2. 移位方法,同时增加”或“运算
1 #include <REG51.H> 2 3 // 延时函数 4 void delay(void) 5 { 6 unsigned char i, j; 7 for(i=200; i--; i>0) 8 for(j=200; j--; j>0); 9 } 10 11 void main(void) 12 { 13 unsigned char i; 14 unsigned char dat1 = 0x10; // 0001 0000 15 unsigned char dat2 = 0x08; // 0000 1000 16 for(i=0; i<4; i++) 17 { 18 P0 = ~((dat1<<i) | (dat2>>i)); 19 delay(); 20 } 21 }
以上为暂时所学,可能存在错误或理解错误的地方,请指正,谢谢~
浙公网安备 33010602011771号