2.单片机 LED 控制及流转制作

目录

2.0 延时函数制作单灯闪烁

DELAYMS.H

2.1 独立按键控制 LED 亮灭

2.2 独立按键控制 LED 状态

2.3 独立按键控制 LED 二进制转换

2.4 独立按键控制 LED 移位


本专栏所有引脚及端口 代码及注解 选择的是 BST-V51 单片机
需结合具体的单片机原理图进行分析
接下来的本专栏都选择该单片机及其原理图分析来进行操作

 

2.0 延时函数制作单灯闪烁

 1 #include <STC89C5xRC.H>
 2 #include <DELAYMS.H>
 3 void main(){
 4     P10 = 0;
 5     //P1 = 0xfe;  //1111 1110
 6     while(1){
 7         delay_ms(500);
 8         P10 = ~P10;
 9     }
10 }

 

对延时函数进行封装

DELAYMS.H

 1 #ifndef _DELAYMS_H_
 2 #define _DELAYMS_H_
 3 #include <INTRINS.H>
 4 // xms 代表需要延时的毫秒数
 5 void delay_ms(unsigned int xms)        //@11.0592MHz
 6 {
 7     unsigned char i, j;
 8     while(xms--){
 9         _nop_();
10         i = 2;
11         j = 199;
12         do
13         {
14             while (--j);
15         } while (--i);
16   //每执行一次 1ms
17     }
18 }
19 #endif

 

2.1 独立按键控制 LED 亮灭

按键 K1-K4 对应 P34-P37 号引脚

另一端接地 为 0

#include <STC89C5xRC.H>
int main(){
    //P10 = 0;
    while(1){
        if(P34 == 0){  
            P10 = 0;
        }else{
            P10 = 1;
        }
    }
}

 

 

2.2 独立按键控制 LED 状态

消除按键抖动

            delay_ms(20);

            while(P34 == 0);

            delay_ms(20);

int main(){
    while(1){
        delay_ms(100);
        if(P34 == 0){
            delay_ms(20); //延时 20,开关按下消抖
            while(P34 == 0); //检测 P34=0 时,继续循环上面的语句,否则跳出这个语句执行下一个语句
            delay_ms(20);//延时 20ms,开关松开消抖
            //按下亮 再按下熄灭
            P11 = ~P11; 
            P15 = ~P15;
        }
    }
}

 

2.3 独立按键控制 LED 二进制转换

int main(){
    unsigned char num = 0;    //占 8 位
    while(1){
        if(P34 == 0){
            delay_ms(20);
            while(P34 == 0);  //消除抖动
            delay_ms(20);       //防抖
            
            num++;
            P1 = ~num;
        }
        if(P1 == 0x00){
            P1 = 0xff;
        }  //如果 led 全亮 num=1111 1111 ;P1=0000 0000
           //num+1=0000 0000
    }
}

 

2.4 独立按键控制 LED 移位

按位左移<< 往左移位 低位补 0;

按位右移<< 往右移位 高位补 0;

按位与&    同为 1 时为 1 其余为 0;

按位或|    有 1 即为 1 全为 0 时才为 0;

按位异或^  不同时为 1 相同时为 0;

按位取反~

 1 int main(){
 2     unsigned int num = 0x01; //num=0000 0001
 3     int i;
 4     while(1){
 5 
 6 
 7         //按位左移<< 往左移位 低位补 0;
 8         if(P34 == 0){
 9             delay_ms(20);
10             while(P34 == 0);  //消除防抖
11             delay_ms(20);
12             
13             P1 = ~num;  //取反即得低电平的 led
14             num = num << 1;
15             if(P1 >= 0xff){  //P1 = 1111 1111 
16                 num = 0x01;
17             }
18         }
19         //按位右移<< 往右移位 高位补 0;
20         if(P35 == 0){
21             delay_ms(20);
22             while(P35 == 0);  //消除防抖
23             delay_ms(20);
24             
25             P1 = ~num;
26             num = num >> 1;
27             if(P1 == 0xff ||P1 == 0x00){
28                 num = 0x80;
29             }
30         }
31 
32 
33   //顺序左移流水灯
34         if(P36 == 0){
35             delay_ms(20);
36             while(P36 == 0);  //消除防抖
37             delay_ms(20);
38             
39             P1 = ~num;
40             for(i = 0;i < 8;i++){
41                 P1 = ~num;
42                 delay_ms(90);
43                 num = num << 1;
44                 if(P1 >= 0xff){
45                 num = 0x01;
46                 } 
47             }
48 
49 
50         }
51     }
52 }

 

转载于: https://zhuanlan.zhihu.com/p/508384193

我目前是一名计算机专业的学生,我会不断地在各大平台分享我的所学,让知识得到共享,希望大家多多关注,一起从学习计算机基础直到计算机的深入式学习,让我们共同进步吧。

posted @ 2022-05-02 13:52  xiaoxie001  阅读(131)  评论(0编辑  收藏  举报