c51单片机:两个独立按键控制一个led,k1按下松开led闪烁,k2按下松开led灭

c51单片机:两个独立按键控制一个led,k1按下松开led闪烁,k2按下松开led灭,第1张

#include "reg52h"

typedef unsigned int u16;

typedef unsigned char u8;

sbit led=P2^0;//把所要控制的led灯定义为p20这个口

sbit k1=P2^1;

sbit k2=P2^2;

void delay(u16 i)

{

while(i--);

}//一个延时程序

void main()

{

if(k1==1)

while(1)

{

led=1;

delay(50000); //大约延时450ms

led=0;

if(k2==1)

break;

}

led=0;

}

思路很简单,就是用检测的方法去扫描相应的按键是否被触发,然后执行相应的子程序。

读取连接按键的IO口,判断是否为低电平,如果是,延时(十毫秒左右可以),再次读取IO口,判断是否为低电平,如果是则表示有有效的按键按下,接着用while判断等待按键释放,然后让连接led的IO口电平取反以控制其亮灭(是强电的灯可以通过此处控制继电器的合、闭来控制灯的亮灭)。参考程序:if(key==0){delayms(10);if(key==10){while(key==0);//等待按键释放,IO口恢复高电平led=!led;//按键控制程序}}

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用>5(假设字长为8位),则得到的是 11111101 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变实际应用中可以根据情况用左/右移做快速的乘/除运算,这样

#include<reg52h>

unsigned char ID;

sbit k1 = P3 ^ 7;        // 定义按键端口

void delay()

{

TMOD = 0x10;    // 定时器的工作方式

TH1=0xd8;

TL1=0xf0;

TR1=1;

while(!TF1);    // 这里错了,是定时器1

TF1=0;

}

void main()

{

while(1)

{

if(k1==0)

{

delay();              //去抖动

if(k1==0)           //检测按键确实按下,进行按键处理

{

ID++;

if(ID==0)

{

ID=0;

}

while(!k1);   //这里错了,多余的加了==0

}

}

switch(ID)

{

case 0:P1=0x3f;break;

case 1:P1=0x06;break;

case 2:P1=0x5b;break;

case 3:P1=0x4f;break;

case 4:P1=0x66;break;

case 5:P1=0x6d;break;

case 6:P1=0x7d;break;

case 7:P1=0x07;break;

case 8:P1=0x7f;break;

case 9:P1=0x6f;break;

default:break;

}

}

}

简单编了一下程序,,,

#include<reg52h>

sbit led1=P1^1; //led灯,按实际再改

sbit led2=P1^2; //led灯,按实际再改

sbit led3=P1^3; //led灯,按实际再改

sbit led4=P1^4; //led灯,按实际再改

sbit key1=P2^1; //按键,按实际再改

sbit key2=P2^2; //按键,按实际再改

sbit key3=P2^3; //按键,按实际再改

sbit key4=P2^4; //按键,按实际再改

void delay(unsigned int t) //延时函数

{

while(--t);

}

void main()

{

while(1)

{

if(key1 == 0) //如果高电平按下按键就==1

{

delay(200); //按键防抖

if(key1 == 0)

{

led1=1; //如果低电平亮就=0

led2=0;

led3=0;

led4=0;

}

}

if(key2 == 0)

{

delay(200); //按键防抖

if(key2 == 0)

{

led1=0; //如果低电平亮就=0

led2=1;

led3=0;

led4=0;

}

}

if(key3 == 0)

{

delay(200); //按键防抖

if(key3 == 0)

{

led1=0; //如果低电平亮就=0

led2=0;

led3=1;

led4=0;

}

}

if(key4 == 0)

{

delay(200); //按键防抖

if(key4 == 0)

{

led1=0; //如果低电平亮就=0

led2=0;

led3=0;

led4=1;

}

}

}

}

单片机的P10-P13接四个发光二极管L1-L4的阴极,P14-P17接四个开关K1-K4

程序:

ORG

00H

START:

MOV

A,P1

ANL

A,#0F0H

RR

A

RR

A

RR

A

RR

A

ORl

A,#0F0H

MOV

P1,A

SJMP

START

可以检测单个按键,也可以同时检测多个按键

过程:开始——读P1口数据到A——A中的数据右移4次——A中的内容和F0H相或——A中的数据送到P1口——回到开始

代码修改一下:

main()

{

while(1)

    {

    if(key1==0)

        {

        delay(30);

        if(key1==0)

            {

            d1=~d1;

            while(key1==0);

            }

        }

    }

}

/-----------------------------------------------

名称:单个独立按键控制LED

论坛:>

以上就是关于c51单片机:两个独立按键控制一个led,k1按下松开led闪烁,k2按下松开led灭全部的内容,包括:c51单片机:两个独立按键控制一个led,k1按下松开led闪烁,k2按下松开led灭、单片机 用C语言怎么编写用一个按钮,控制一盏灯的亮与灭的程序、用AT89C52 通过3个独立按键控制16路LED灯的轮流点亮、逐个点亮、间隔点亮的C语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10139334.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存