ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-02 14:01:47  阅读:160  来源: 互联网

标签:P1 LED 流转 delay 单片机 while num ms


目录

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

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

标签:P1,LED,流转,delay,单片机,while,num,ms
来源: https://www.cnblogs.com/xiaoxie001/p/16215673.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有