❶ 求关于单片机按键的程序
void _Key(void)
{
if(!Key) //有按键按下
{
Delay(500); 延时
if(!Key) //还是按下状态,即长击
{
Disp("2");
}
else //否则就是短击
{
Disp("1");
}
}
else //没有按键按下
{
Disp("3");
}
}
大概思路是这样,延迟函数自己掌握,一般还要加消抖(也就是较短的延时后再判断一次按键状态)
❷ 51单片机中按键程序用C怎么写
这个太简单了吧,记住写程序定时器要一直跑,建立一个时基,像个手表的时间一样要一直跑,即有time_125us,time_1ms,time_100ms,time_1s,time_1min,time_1hour等时间变量建立时基一直走。其它程序可以分时扫描也可以轮流扫描,不能停留死等,像电脑里的程序一样表面看起来各个程序是一直运行的,即各个程序中不能有delay_1ms之类的函数,如果要定时应该申请一个变量在时基里处理,如等待2s可以这么写
if(step==0){
time=2,time_100ms=0,step=1;}
if((step==1)&&(time==0)){//2s到
//等待2s后要执行的代码
}
在时基时每1s把time减1,减到0为止即if(time)time--;
对按键的写法一般用采集的方法如按键后IO为低
if(!IO){
//低电平,有按键
key_time++;
if((key_time==100)&&(!key_flag)){
//已经赋值了就不再赋值了
key_flag=1;
key_flag_bak=1;
}
else{
//无按键
key_time=0;
key_flag_bak=0;
}
if(key_flag&&(!key_flag_bak)){
//有按键并松开,即松开响应
time=2;
//亮2s
key_flag=0;//把键值清0
}
if(time){
LED_ON;//灯亮
}
else
LED_OFF;
❸ 51单片机汇编语言按键如何编程
编程时,要把整个程序,分解成一个一个模块。
一个模块,只包括一个功能。
那么,KEY 模块:
读出按键、消除抖动、读取键值,返回键值。
键值包括:00H、08H... 20H,FFH(无键)。
这个 KEY 模块,到这就完了。
按键如何处理,则是另外的模块。
楼主流程图,包罗万象,好像是个主程序。不好弄。
❹ 51单片机C语言编程如何实现长按按键实现数值的累加
这个可以用定时器来做,比如检查某键,按键时间超过2秒后一个变量开始累加知道键释放为止。实现方法如下:
#include<reg51.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
uint
v=0,time=0;
sbit
key=P1^0;
void
t0isr()
interrupt
1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if((key==0)&&(time>40)v++;
//如果按键时间超过2秒且键未释放,变量+1
if(key==1)time=0;
//如果键释放,时间复位
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}
❺ 51单片机独立按键部分编程问题
你好:
程序是这么运行的:
先在心中想象独立按键的结构,没按下时,P3外接上拉电阻,所以输入总是1,按键按下时,倒地,对应按键的IO输入为0.
然后,先置IO为输入,没按下时读出全是1,0xff,当有按键按下时,读入为0了,所以用if(KeyPort!=0xff)来判断是否有输入,然后消抖一下,继而继续判断是否还在输入,如果还在输入说明不是抖动引起而是认为引起,之后读取P3口的低5为数据(估计是你的独立按键的接口吧),并赋值给keyvalue;while((KeyPort & 0x1f)!=0x1f)这句的意思是如果一直按着,P3输入的数据肯定不变,那么条件为真,死循环,如果松开,P3全为1了,此时是等于0x1f的,所以结束循环,进行按键处理。
最后,是按键的核心,当P3.0按下,那么对应值是11111110,那么keyvalue的值是11110=0x1e,如果P3.1按下,那么对应值是11111101,那么keyvalue的值是11101=0x1d,以此类推,5个按键对应你题目中5个值。
不懂回复。
希望我的回答能帮助到你。
❻ 51单片机汇编语言编程独立按键
四个按键,定义如下:
KEY1 BIT P3.0
KEY2 BIT P3.1
KEY3 BIT P3.2
KEY4 BIT P3.3
按键处理程序:
;-----------------------------------
READ_KEY:
JB KEY1, K2
CALL DELAY
JB KEY1, K2
JNB KEY1, $
PUSH ACC
INC 75H
MOV A, 75H
CJNE A, #10, ZINT01
MOV 75H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K2: JB KEY2, K3
CALL DELAY
JB KEY2, K3
JNB KEY2, $
PUSH ACC
INC 76H
MOV A, 76H
CJNE A, #10, ZINT01
MOV 76H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K3: JB KEY3, K4
CALL DELAY
JB KEY3, K4
JNB KEY3, $
PUSH ACC
DEC 75H
MOV A, 75H
CJNE A, #255, ZINT03
MOV 75H, #9
ZINT03:
POP ACC
JMP K_EXIT
;---------------
K4: JB KEY4, K_EXIT
CALL DELAY
JB KEY4, K_EXIT
JNB KEY4, $
PUSH ACC
DEC 76H
MOV A, 76H
CJNE A, #255, ZINT04
MOV 76H, #9
ZINT04:
POP ACC
K_EXIT:
RET
;---------------
DELAY:
DJNZ R7, $
DJNZ R7, $
RET
;-----------------------------------
❼ 现实单片机按键编程
是否要实现在线编程ISP?
有ISP功能的MCU编程可以看做两部分,好像:电脑的BIOS与硬盘程序,你设置好BIOS以处理你要实现的编程功能,那么硬盘程序就交给用户去实现了!
也就是说,你要写好2k~8k的ISP引导码即可!
❽ 单片机C语言按键开关程序
#include<reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay_ms(uint);
sbitled0=P0^0;
sbitled1=P0^1;
sbitkey1=P3^2;
sbitkey2=P3^3;
voidmain()
{
uchari=0;
ucharj=0;
while(1)
{
if(key1==0)//按键1
{
delay_ms(10);
if(key1==0)
{
i++;
i=i%2;
switch(i)
{
case0:led0=1;break;//关小灯
case1:led0=0;break;//开小灯
default:break;
}
}
while(!key1);
}
if(key2==0)//按键2
{
delay_ms(10);
if(key2==0)
{
j++;
j=j%2;
switch(j)
{
case0:led1=1;break;//关小灯
case1:led1=0;break;//开小灯
default:break;
}
}
while(!key2);
}
}
}
voiddelay_ms(uintz)//延时子程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
❾ 51单片机如何用一个按键控制一段程序的运行与停止
1、创建项目文件。
6、当按下一个按键时,关闭灯,整个程序运行,再按一次,程序停止。
❿ C51单片机编程,按键控制流水灯
#include "reg51.h"
unsigned char led[]={0xfe,0xfd,0xfb,0xf7}; //LED灯的花样数据
void delay(unsigned char time){ //延时函数
unsigned int j=15000;
for(;time>0;time--)
for(;j>0;j--);
}
void main(){
bit dir=0,run=0; //标志位定义及初始化
char i;
while(1){
switch (P0 & 0x0f){ //读取键值
case 0x0e:run=1;break; //K1动作,设run=1
case 0x0d:run=0,dir=0;break; // K2动作,设run=dir=0
case 0x0b:dir=1;break; //K3动作,设dir=1
case 0x07:dir=0;break; //K4动作,设dir=0
}
if (run) //若run=dir=1,自上而下流动
if(dir)
for(i=0;i<=3;i++){
P2=led[i];
delay(200);
}
else
for(i=3;i>=0;i--){ //run=1,dir=0,自下而上流动
P2=led[i];
delay(200);
}
else P2=0xff; //若run=0,全部灯灭
}
}