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

目录

2.0 延时函数制作单灯闪烁

DELAYMS.H

2.1 独立按键控制 LED 亮灭

2.2 独立按键控制 LED 状态

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

2.4 独立按键控制 LED 移位


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

2.0 延时函数制作单灯闪烁

#include <STC89C5xRC.H>
#include <DELAYMS.H>
void main(){
    P10 = 0;
    //P1 = 0xfe;  //1111 1110
    while(1){
        delay_ms(500);
        P10 = ~P10;
    }
}

对延时函数进行封装

DELAYMS.H

#ifndef _DELAYMS_H_
#define _DELAYMS_H_
#include <INTRINS.H>
// xms 代表需要延时的毫秒数
void delay_ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
    while(xms--){
    	_nop_();
        i = 2;
        j = 199;
        do
        {
            while (--j);
        } while (--i);
  //每执行一次 1ms
    }
}
#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;

按位取反~

int main(){
	unsigned int num = 0x01; //num=0000 0001
    int i;
	while(1){


        //按位左移<< 往左移位 低位补 0;
        if(P34 == 0){
            delay_ms(20);
            while(P34 == 0);  //消除防抖
            delay_ms(20);
            
            P1 = ~num;  //取反即得低电平的 led
            num = num << 1;
            if(P1 >= 0xff){  //P1 = 1111 1111 
                num = 0x01;
            }
        }
        //按位右移<< 往右移位 高位补 0;
        if(P35 == 0){
            delay_ms(20);
            while(P35 == 0);  //消除防抖
            delay_ms(20);
            
            P1 = ~num;
            num = num >> 1;
            if(P1 == 0xff ||P1 == 0x00){
                num = 0x80;
            }
        }


  //顺序左移流水灯
        if(P36 == 0){
            delay_ms(20);
            while(P36 == 0);  //消除防抖
            delay_ms(20);
            
            P1 = ~num;
            for(i = 0;i < 8;i++){
                P1 = ~num;
                delay_ms(90);
                num = num << 1;
                if(P1 >= 0xff){
                num = 0x01;
                } 
            }


        }
    }
}

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@xiaoxie001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值