㈠ 單片機C語言如何實現按鍵按一下的時候加一,長按的時候連加。
這個可以通過定時器來實現,比如當按鍵時間小於2秒時,按一次加1,當超過2秒時,沒50毫秒加1實現連加功能。常式如下:
#include<reg51.h>
unsigned int a;
unsigned char times;
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if(times>40)
{
a++;
printf("%d",a);
}
}
main()
{
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
TR0=1;
TR1=1;
ET0=1;
EA=1;
times=0;
a=0;
while(1)
{
if(key==0)
{
a++;
printf("%d",a);
while(key==0);
times=0;
}
}
}
㈡ 單片機中利用中斷程序做出按鍵按下顯示數字,逐次加一
#include<reg51.h>
#defineucharunsignedchar;
uchardistab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0到f
ucharnumber,dat;
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
number++;
if(number>1)number=0;
switch(number)
{
case0:P2=0x02;P0=distab[dat/10];
break;
case1:P2=0x01;P0=distab[dat%10];
break;
default:break;
}
}
voidt1isr()interrupt3
{
dat++;
dat%=100;
}
main()
{
TMOD=0x61;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=0xff;
TL1=0xff;
TR1=1;
ET1=1;
TR0=1;
ET0=1;
EA=1;
while(1);
}
㈢ 單片機按鍵按一次就加一
按鍵相對是個低速任務。你按的再快,一秒可以按十次嗎?什麼?你可以。。那你就是作弊了。因為哪怕你反應的過來。按鍵可不行。所以。這個本質你需要牢牢抓住。那麼你可以選擇一秒之內只檢測幾次按鍵。把幾乎是連續在使用的機器時間碎片化。比如在一個碎片里只查一次按鍵。是的,你現在就是這么做的。只是循環太快。碎片太多。按鍵的抖動你都查到了。所以你需要的僅僅是慢下來。極限就是剛剛說的查10次。算算,這是一個100ms的定時。明白定時器的真正用途了嗎?如果你實際這么實驗了你會發現這的確有效。不會加個成百上千了。接下來你需要設置一個邏輯讓按鍵檢測只對下降沿起作用。最好的辦法就是和前次的狀態比較。如果上次的狀態為高而此次狀態為低。那麼這就是個下降沿。於是你需要一個寄存器保存上一次的狀態。並每次比較後更新。原來這寄存器是這么用的。。實際實驗後發現這么干已經可以保證基本每次長按只會加1。但是短按似乎會丟失。那是因為。100ms實在是長了些。電平保持100ms有時是太難了。所以,你可以適當提高頻率。比如提高10倍。以10ms為周期。基本能解決大多數問題。
㈣ 單片機c語言按鍵每按一次加一一直到加到100程序怎麼寫求高手指點。
給你參考
//12M晶振。2位共陽數碼管,P0為段碼,P2.0、P2.1位控
#include <reg51.h>
#define uchar unsigned char
sbit P20=P2^0;
sbit P21=P2^1;
sbit KEY=P2^2;
uchar ge,shi;
uchar code tab[ ]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};
void delay_ms(unsigned int ms) //1ms延時
{
uchar a;
while(ms--)
for(a=123;a>0;a--);
}
void display();
void main()
{
while(1)
{
display();
while(!KEY)
{
display();
if(KEY)
ge++;
}
if(ge==10)
{
ge=0;
shi++;
}
if(shi==100)
{
shi=0;
}
}
}
void display( )
{
P20=1;
P0=tab[ge];
delay_ms(5);
P20=0;
P21=1;
P0=tab[shi];
delay_ms(5);
P21=0;
}
㈤ 單片機按一下加一,加到20的程序
假設P0 P1口各接一個數碼管,p2.0接按鍵,程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P2^0;
uchar num=0;
//共陰數碼管七段碼
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延時程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void main(void )//主程序
{
while(1)
{
if(key==0)//判斷按鍵是否按下
{
Delay1ms(10);//延時消抖
if(key==0)
{
while(key==0);;//等待按鍵抬起
num++;
if(num==20)num=0;
}
}
P0=table[num%10];
P1=table[num/10];
}
}
㈥ 單片機按鍵按一下,數字只加一。
按鍵相對是個低速任務。你按的再快,一秒可以按十次嗎?什麼?你可以。。那你就是作弊了。因為哪怕你反應的過來。按鍵可不行。所以。這個本質你需要牢牢抓住。那麼你可以選擇一秒之內只檢測幾次按鍵。把幾乎是連續在使用的機器時間碎片化。比如在一個碎片里只查一次按鍵。是的,你現在就是這么做的。只是循環太快。碎片太多。按鍵的抖動你都查到了。所以你需要的僅僅是慢下來。極限就是剛剛說的查10次。算算,這是一個100ms的定時。明白定時器的真正用途了嗎?如果你實際這么實驗了你會發現這的確有效。不會加個成百上千了。接下來你需要設置一個邏輯讓按鍵檢測只對下降沿起作用。最好的辦法就是和前次的狀態比較。如果上次的狀態為高而此次狀態為低。那麼這就是個下降沿。於是你需要一個寄存器保存上一次的狀態。並每次比較後更新。原來這寄存器是這么用的。。實際實驗後發現這么干已經可以保證基本每次長按只會加1。但是短按似乎會丟失。那是因為。100ms實在是長了些。電平保持100ms有時是太難了。所以,你可以適當提高頻率。比如提高10倍。以10ms為周期。基本能解決大多數問題。
㈦ 單片機 匯編語言如果要實現按鍵按下後連加或連減的效果,程序該怎麼編寫
匯編很久沒用過了,提供一下思路,供參考!
可採用計時的方式,檢測按鍵按下狀態超過2秒後,數據開始增大遞加遞減的步距(之前是每次加減1,增大後,每次加減10),松開按鍵後,計時器清零!
採用計次的方式也可以實現,按鍵後,數據遞加或遞減一次,延時300毫秒,再次檢測按鍵,未松開,繼續遞加,加滿5次後,開始增發遞加或遞減步距,松開按鍵後,計次清零!
㈧ 單片機如何實現用一個按鍵一直按下控制數碼管數字連續加1
判斷按鍵按著沒放,就使數碼管顯示的數字連續加1就可以了,不過,加1次需適當延時幾十毫秒
㈨ 單片機 按鍵(採用獨立式按鍵)按下一次,讓液晶第一位顯示的數碼加1,顯示範圍0~9
程序清單如下:
#include < reg51.h >// 51單片機頭文件
#define uchar unsigned char // 宏定義,用uchar替代無符號字元型
#define uint unsigned int // 宏定義,用uint 替代無符號整數型
sbit Key = P2 ^ 7;
uchar Count = 0;
uchar code DataChar[10] = // 定義數碼管的段碼 '0'~'9'、'-'、' ' 'P'
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
};//延時N毫秒
void DelayNms( uint N ) // 利用x、y作簡單的自減運算,消耗單片機指令周期,達到延時的目的
{
uint x,y;
for( x=N; x>0; x-- )
for( y=110; y>0; y-- );
}
//數碼管顯示 // 顯示方式為動態掃描,視覺暫留原理
void Display( uchar Num ) // *p指向Main函數中的數組ShowNum的首地址
{
P0 = DataChar[ Num ]; // 向P0賦段碼值
DelayNms(2); // 短暫的延時
P0 = 0x00; // 讓數碼管熄滅,否則會造成數字重疊
}
void main( void )
{
while(1)
{
if( Key == 0 )
{
DelayNms(30);
if( Key == 0 )
{
Count += 1;
Count = (Count>9)? 0 : Count;
}
while( !Key );
}
Display( Count );
}
}
㈩ 單片機中怎麼樣實現按鍵按下計數
主函數
void main (void)
{
unsigned char num=0;
KEY_ADD=1; //按鍵輸入埠電平置高
KEY_DEC=1;
while (1) //主循環
{
if(!KEY_ADD) //如果檢測到低電平,說明按鍵按下
{
DelayMs(10); //延時去抖,一般10-20ms
if(!KEY_ADD) //再次確認按鍵是否按下,沒有按下則退出
{
while(!KEY_ADD);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
{
if(num<9) //加操作
num++;
}
}
}
if(!KEY_DEC) //如果檢測到低電平,說明按鍵按下
{
DelayMs(10); //延時去抖,一般10-20ms
if(!KEY_DEC) //再次確認按鍵是否按下,沒有按下則退出
{
while(!KEY_DEC);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
{
if(num>0) //減操作
num--;
}
}
}
//主循環中添加其他需要一直工作的程序
}
}