利用单片机中断写出按键程序实现每按下一个按键一个程序立马停止而去执行另一个程序,写出主程序

作者&投稿:父俘 (若有异议请与网页底部的电邮联系)
怎么让单片机按一下按键执行一个程序,再按一下马上执行另一个程序~

call key
jmp loop
key:
jnb p3.0,rel
ret
rel:
call delay20MS
jnb p3.0,rel
第一次这里标志位为0,则执行,第一次按下功能。

loop:
call key
jmp loop
key:
jnb p3.0,rel
ret
rel:
call delay20MS
jnb p3.0,rel
第一次这里标志位为0,则执行,第一次按下功能。
第二次按下时,这里标志位为1,则跳过下边的程序,执行另一个程序了。执行完将这个标志位清零。
CLR FLAG.0
RET

第一次按下,会到这里,执行下功能
置起一个标志位。
如SETB FLAG.0
RET

这样就这实现了一键两功能,如果要更多,就设置一个寄存器,每次加1,对比。是那个执行那个程序,最多一个按键可以做到255种功能。当然你肯定用不了这么多。

满意给我加分吧,只能给你思路,给你完整程序是害你的。

看没有给你出代码,我就花几分钟给你写一个程序。

#include "REG52.H"
sbit KEY1_Outak = P1^3;
sbit Temp_Out001 = P1^0;
sbit Temp_Out002 = P1^1;
sbit Temp_Out003 = P1^2;

unsigned char Value_tem;
/*
*带形参延时1ms子函数
**/
void Delay_1ms(unsigned int Temp)
{
unsigned int x, y;
for(x = Temp; x > 0; x--)
for(y = 110; y > 0; y--);
}

/*
*按键选择不同程序执行
**/
void Scank_keyCmd(void)
{
if( KEY1_Outak == 0) //判断按键是否按下
{
Delay_1ms(10); //延时去抖动
if( KEY1_Outak == 0) //按键确实按下
{
Value_tem++; //开始执行变量加加
if(Value_tem == 3) //判断按键变量按下次数等于3
{
Value_tem = 0; //变量清零
}
while(KEY1_Outak == 0); //判断按键松手不等于零退出
}
}
}

/*
*不同程序按键选择执行
**/
void Display_VslutsbekCmd(void)
{
if(Value_tem == 0) //如果没有按键按下变量默认值是0,执行LED1
{
do //进入循环
{
Temp_Out001 = 0; //LED1 = 0;
Delay_1ms(500); //延时500ms
Temp_Out001 = 1; //LED1 = 1;
Delay_1ms(500); //延时500ms
} while(Value_tem == 0); //判断变量等于0一直循环执行否则退出
}

else if(Value_tem == 1) //如果按键按下变量加1, 等于 1 执行LED1
{
do //进入循环
{
Temp_Out002 = 0;
Delay_1ms(500);
Temp_Out002 = 1;
Delay_1ms(500);
} while(Value_tem == 1); //判断变量等于1一直循环执行否则退出
}

else if(Value_tem == 2) //如果按键按下变量加1, 等于2执行LED2
{
do
{
Temp_Out003 = 0;
} while(Value_tem == 2);
}

}
/*
* 主程序
**/
int main(void)
{
while(1)
{
Scank_keyCmd(); //循环扫描检测是否有按键按下
Display_VslutsbekCmd(); // 主程序循环扫描显示相应程序
}
}


51单片机4个独立按键怎么写一个中断
要实现4个独立按键的中断,可以采用外部中断的方式。在51单片机中,可以通过P3口的外部中断请求(P3.2-P3.5)实现多个独立按键的中断响应。具体实现方法如下:1. 首先需要将P3.2-P3.5设置为输入模式,并使能中断请求。2. 在程序中,需要编写中断服务函数,用于处理按键中断事件。当某个按键按下时,...

利用单片机中断写出按键程序实现每按下一个按键一个程序立马停止而去执...
if( KEY1_Outak == 0) \/\/判断按键是否按下 { Delay_1ms(10); \/\/延时去抖动 if( KEY1_Outak == 0) \/\/按键确实按下 { Value_tem++; \/\/开始执行变量加加 if(Value_tem == 3) \/\/判断按键变量按下次数等于3 { Value_tem = 0; \/\/变量清零 } while(KEY1_Outa...

用c语言写51单片机定时器中断判断按键是否按下该怎么写? 我想实现的功...
{ while(key) \/\/ 如果按键未按下则执行循环 { if(time>100)break; \/\/如果时间大于5秒,退出循环。} ...} }

求一个单片机外部中断程序,要求用按键模拟单片机外部中断输入源,当按键...
1、打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并添加STARTUP.A51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。2、首先要导入51单片机的头文件,否则后续使用的端口都会出现未定义的情况,然后在主函数中,使得EA=1,即总中断...

单片机怎么用键盘中断实现按住按键,使内部RAM中的一个数据不停加1...
你既能够实现按一下,数据加1的话,那就差一点就可以实现你所说的功能了。不过还要看你的中断是边沿触发呢,还是电平触发?如果是边沿触发呢,每次进入中断的时候把一个位变量置1,并且保存外部中断口的电平。然后我们在主程序中读取这个位变量,如果位变量为1说明已经有铵键被按下。然后开如计时,并...

单片机中利用中断程序做出按键按下显示数字,逐次加一,从一到九_百度知...
char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; \/\/0到fuchar dat;void t1isr() interrupt 0{dat++;dat%=10;P0=distab[dat];}main(){ IT0=1; EX0=1;EA=1;while(1);} ...

使用51单片机如何实现多个按键输入,采用中断方式,若无按键按下时MCU做...
--- 51单片机,有两个外部中断输入端,它们也算是普通IO口。外部中断,应该用于处理一些突发事件,需要单片机紧急处理的事件。按键,不能算是需要紧急处理的事件。对普通按键进行处理,还需要延时消抖,等待按键释放等环节,时间上,没有紧迫的要求。用外部中断,来处理按键,就是自寻烦恼。可以到我的 ...

请教51单片机定时中断检测长按与短按问题-100分悬赏
首先你的程序写的不够合理,作为按键一般会使用外部中断而不是定时中断,外部中断可以保证实时按键。一般按键都是采用外部中断,如果是在while循环里面进行按键键值判断,那么在判断之前最好加个小延时,进行按键去抖。像你这个wile循环耗时很长,最适合使用外部中断了,当然如果按键没有接到外部中断引脚,...

51单片机怎么用中断控制多个按键
6个按键接6个普通IO口的同时每个上面再都并上一个二极管引到中断脚上,我这样做过。二极管的钳位作用能保证每一个按...

51单片机用计数器中断实现100以内的按键计数,汇编语言程序
JMP T0_INT ;--- START:MOV TMOD, #06H MOV TH0, #255 MOV TL0, #255 MOV IE, #82H SETB TR0 MOV R2, #0 MOV R3, #0 MOV DPTR, #TAB ;--- M_LOOP:MOV A, R3 MOVC A, @A + DPTR MOV P2, A MOV A, R2 MOVC A, @A + DPTR ...

汕头市18992667202: 利用单片机中断写出按键程序实现每按下一个按键一个程序立马停止而去执行另一个程序,写出主程序 -
苍梧清云芝: 看没有给你出代码,我就花几分钟给你写一个程序.#include "REG52.H" sbit KEY1_Outak = P1^3; sbit Temp_Out001 = P1^0; sbit Temp_Out002 = P1^1; sbit Temp_Out003 = P1^2; unsigned char Value_tem; /* *带形参延时1ms子函数**/ void ...

汕头市18992667202: 怎么利用外部中断实现每按一次按键数码管显示加1 -
苍梧清云芝: 这还不容易吗,首先数码管显示的数用一个变量,在中断子程序中,变量加1,再送数码管显示就好了. 比可,按键接在P3.2上,按一次键就中断一次,就加1.

汕头市18992667202: 求一个单片机中断的C语言程序 -
苍梧清云芝: 程序大致这样:uchar a=0;//计中断次数 EX0=1;EX1=1;EA=1;//开相应中断 IT0=1;IT1=1;//下降沿触发 P0=0;//全灭//中断程序 void zhongduan1(void) interrupt 0 { a++; if(a==9) a=0; P0=~(0XFF<<a); } void zhongduan2(void) interrupt 2 { if(a!=0) a--; P0=~(0XFF<<a); }

汕头市18992667202: 单片机怎么用键盘中断实现按住按键,使内部RAM中的一个数据不停加1? -
苍梧清云芝: 你既能够实现按一下,数据加1的话,那就差一点就可以实现你所说的功能了. 不过还要看你的中断是边沿触发呢,还是电平触发? 如果是边沿触发呢,每次进入中断的时候把一个位变量置1,并且保存外部中断口的电平.然后我们在主程序中读取这个位变量,如果位变量为1说明已经有铵键被按下.然后开如计时,并将位变量清零.当时间达到某一个值(如:200ms)我们就让计数寄存器加1,以此类推,当时间达到另一个值时(如:400ms),再将计数据器加1.不过,当主程序中再次读到位变量被置1时,我们要停止计时.并判断时间是否达到设定值,如果比设定值小的话,就视为干扰信号.这时清除计时器.这样就能实现连续加1的功能. 希望能让你得到启发.祝你好运!

汕头市18992667202: stc12c5a60s2单片机通用中断方式C语言编程读取按键S1,并记录S1按下的的次数,将该次数通过P2端口输出. -
苍梧清云芝: #include<at89x51.h> unsigned char cont;//定义按键计数变量 void delayms(unsigned char time)//stc 1t 12MHz 1ms延时 { unsigned char a,b,c; while(time--)for(c=1;c>0;c--) for(b=222;b>0;b--) for(a=12;a>0;a--); } void main(void) { P2=cont=0; IT0=1...

汕头市18992667202: 求C51单片机用C程序,通过外部中断1实现按键按下(低电平),7个LED灯单独1盏亮且循环右移. -
苍梧清云芝: #include<reg51.h> #define uchar unsigned char uchar led[7]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf}; uchar num=0; void ext1() interrupt 2 { P0=led[num]; num++; num%=7; while(INT1==0); } main() { EX1=1; IT1=0; EA=1; P0=0xff; while(1); }

汕头市18992667202: 单片机89C51:用汇编语言编写"使用单脉冲做中断源,每按一次按钮,点亮的发光二级管向右移动一位" -
苍梧清云芝: ORG 0000H AJMP START ORG 0013H AJMP INT1 ORG 0030H START:MOV SP,#60H MOV A,#0FEH CLR IT1 SETB EX1 SETB EA MOV P1,#0FFH SJMP $ INT1:MOV P1,A JNB P3.3,$ RL A RET1 END

汕头市18992667202: 想请教一个非常简单的程序,一个按键按十次则就中断一回,如此循环下去,51单片机的C程序 -
苍梧清云芝: TL0=#0F5H,到了10软件触发外部中断(CLR P3.还可以用外部中断实现:在主程序中对按键次数计数.2置1这个实现有好几中方法,你可以用定时器的计数功能,比如说用定时器0方式2,设置初值为TH0=#0F5H.2),在中断服务子程序中将p3

汕头市18992667202: c51单片机如何使用中断 -
苍梧清云芝: 将按键接到P3.2(INT0)或P3.3(INT1) main(){EA=1; //EA总中断控制,EA=0关,EA=1开EX0=1;//INT0中断控制.0关1开,按键接P3.2用这个EX1=1;//INT1中断控制.0关1开,按键接P3.3用这个//默认情况下,直接使EX0=1或EX1=1来打开中...

汕头市18992667202: 单片机89c51外部摁键中断程序 -
苍梧清云芝: EX0=1;//开外部中断0 EA=0;//开总中断 lT0=1;//下降沿触发然后写中断函数即可 void extern0( ) interrupt 0 { 执行动作语句 }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网