跪求 单片机 按键控制流水灯,要求按一下按键第一个灯亮,按两下第二个灯亮..一共8

跪求 单片机 按键控制流水灯,要求按一下按键第一个灯亮,按两下第二个灯亮..一共8,第1张

如果你不会写程序,给你了也没用

给你个思路:预先定于一个寄存器KEYNUM,首先有按键检测程序,每检测到一次按键,KEYNUM+1。在显示程序里判断KEYNUM是几,如果是1则第一个灯亮,其他的灭,依次类推,如果KEYNUM=8,第八个灯亮,同时清除KWENUM

#include <reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit led1 = P2^0;//定义管脚;

sbit led2 = P2^1;

sbit led3 = P2^2;

sbit led4 = P2^3;

sbit led5 = P2^4;

sbit led6 = P2^5;

sbit key  = P1^0;

uchar tcount=0,count=0;//定义时间变量和按键计数变量;

void Delay(uchar i)//机械延时;

{

while(--i);

}

void LedLight(void)//LED控制函数;

{

switch(count)

{

case 3 : led1 = 0;break;//3下时,LED1亮;

case 5 : led2 = 0;break;//5下时,LED2亮;

case 7 : led3 = 0;break;//7下时,LED3亮;

case 9 : led4 = 0;break;//9下时,LED4亮;

case 11: led5 = 0;break;//11下时,LED5亮;

case 13: led6 = 0;break;//13下时,LED6亮;

default: P2   = 0xff;break;//其余的都不亮;

}

}

void InitTimer0(void)//定时器0初始化;

{

TMOD = 0x00;

TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256;

TR0 = 1;

}

void main(void)//主函数

{

InitTimer0();

while(1)//无限循环;

{

if(key==0)//检查按键是否按下

{

Delay(10);//机械延时;

if(key==0){count++;}//按键计数;

while(key==0);

}

if(TF0==1)//复位定时器0;

{

TF0=0;

TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256;

tcount++;

if(tcount==20)//1秒的时间;

{

LedLight();

Delay(100);

count=0;//复位按键计数变量;

}

}

}

}

其实这个您可以再中断处理函数里执行判断按键程序啊

if(KEY_P12 ==0) //如果P12被按下,则对应程序跳出,或者关闭主函数中正在运行的程序

{

LED12 = 0; //关闭LED12灯

SYS_STATUS = SYS_ONES; //让系统状态进去到另一个系统状态即可啊。

}

此程序实现独立按键的检测功能,每次按下按键 key5 时,数码管最后一位显示的数 值加 1,按键同时响蜂鸣器 #include<reg52h> sbit key5 = P1^4; //独立按键 sbit P3_6 = P3^6; //蜂鸣器控制端口 unsigned char code BitSet[8] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f }; //用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管 unsigned char code NumberCode[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, }; //用于设置(共阴极)数码管的段选信号,从 0~f 共 16 个数值 void delay_ms(unsigned int n) { //软件延时函数,延时 n 毫秒 unsigned int i, j; for(i=n;i>0;i--) for(j=110;j>0;j--); } void beep(int n) { int i = n; while(i>0) { P3_6 = 1; delay_ms(1); P3_6 = 0; delay_ms(1); i--; } } void main() //喇叭连续响 n 毫秒 //向喇叭输入 1000HZ 的方波震荡源 //05 毫秒高电平 //05 毫秒低电平 { int num=0; while(1) { P2=BitSet[7]; //选择最低位的数码管 if(key5==0) //判断按键 key5 是否按下 { delay_ms(10); //延时重新判断按键是否按下,延时消除抖动 if(key5==0) { num++; //每按下一次显示的数值加 1 beep(200); //喇叭响 200 毫秒 if(num==16) num=0; while(!key5); //直到按键释放,按下时 key5==0,持续循环 } } P0=~NumberCode[num]; } } // 2、 此程序实现独立按键的检测功能,key5 和 key6 每次按下按键时,数码管次低位和最 低位显示的数值加 1,按键同时响蜂鸣器 #include<reg52h> sbit key5 = P1^4; sbit key6 = P1^5; sbit P3_6 = P3^6; unsigned char code BitSet[8] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f }; //用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管 unsigned char code NumberCode[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, }; //用于设置(共阴极)数码管的段选信号,从 0~f 共 16 个数值 void delay_ms(unsigned int n) { //软件延时函数,延时 n 毫秒 unsigned int i, j; for(i=n;i>0;i--) for(j=110;j>0;j--); } void beep(int n) { int i = n; while(i>0) { P3_6 = 1; delay_ms(1); P3_6 = 0; delay_ms(1); i--; } } void main() { int num=0, num2=0; while(1) { P2=BitSet[6]; //喇叭连续响 n 毫秒 //向喇叭输入 1000HZ 的方波震荡源 //05 毫秒高电平 //05 毫秒低电平 //选择最低位的数码管 if(key5==0) //判断按键 key5 是否按下 { delay_ms(10); //延时重新判断按键是否按下,延时消除抖动 if(key5==0) { num++; //每按下一次显示的数值加 1 beep(100); //喇叭响 100 毫秒 if(num==16) num=0; while(!key5) { P2=BitSet[6]; //选择次低位的数码管 P0=~NumberCode[num]; delay_ms(3); P2=0xff; }; } } P2=BitSet[7]; //选择最低位的数码管 P0=~NumberCode[num2]; delay_ms(3); P2=0xff; //直到按键释放,按下时 key5==0,持续循环 P0=~NumberCode[num]; delay

楼上讲得很对,就是先设一个变量,比如a,然后检测是否有按键按下,当有键按下时,就跳到相应的程序,执行a++,但是要注意一点,就是在按键按下的时候要加个延时函数去抖,在加一个语句判断按键是否按下(比如C语言的while语句),只有这样,才能正确判断按键按下的次数。

以上就是关于跪求 单片机 按键控制流水灯,要求按一下按键第一个灯亮,按两下第二个灯亮..一共8全部的内容,包括:跪求 单片机 按键控制流水灯,要求按一下按键第一个灯亮,按两下第二个灯亮..一共8、谁能帮我写一个简单的按键检测c语言程序 功能,我想用单片机去检测按键在一秒钟内按键被按下了多少次,、51单片机P0口检测按键等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9416940.html

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

发表评论

登录后才能评论

评论列表(0条)

保存