
#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语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)