標(biāo)題:
單片機(jī)一通電就執(zhí)行第一個顯示,然后通過長按進(jìn)行兩個模式切...換
[打印本頁]
作者:
qwettyuio
時間:
2022-1-5 10:32
標(biāo)題:
單片機(jī)一通電就執(zhí)行第一個顯示,然后通過長按進(jìn)行兩個模式切...換
本帖最后由 qwettyuio 于 2022-1-11 11:31 編輯
#define key_S 20
#define key_L key_S*50
uchar fen;
uint count;
bit a=0;
sbit key3 = P1^3;
sbit led0 = P1^0;
sbit led1 = P1^7;
sbit led2 = P1^6;
void delay(unsigned int t)//延時時間 = t*9+16 us
{
while(t--);
}
void Scan_key()
{
if(!key3)
{
count++;
if(count==key_L)
{
a=~a;
//怎么使這代碼一開機(jī)就顯示,然后通過長按切換這兩個程序
if(a)
{
Write_1621(29,0x20,4);
}
else
{
Write_1621(29,0x40,4);
}
}
if(count>key_L)
count=key_L+1;
}
else
{
if(count>key_S && count<key_L)
{
if(++fen==4)
fen=0;
}
count=0;
switch(fen)
{
case 0:Write_1621(8,0x01,4);led0=1;led1=1;led2=1;break;
case 1:Write_1621(8,0x80,4);led0=0;led1=1;led2=1;break;
case 2:Write_1621(8,0x40,4);led0=1;led1=0;led2=1;break;
case 3:Write_1621(8,0x20,4);led0=1;led1=1;led2=0;break;
default:break;
}
}
delay(110);
}void main( )
{
Init_1621(); //初始化
Port1Cfg(1,0);
Port1Cfg(1,3);
Port1Cfg(1,6);
Port1Cfg(1,7);
while(1)
{
Guding_Init();
Scan_key();
}
}
作者:
lkc8210
時間:
2022-1-5 16:07
如果長按是控制4個LED同時開關(guān)
可試試以下代碼:
#include <REG51.H>
#define uint unsigned int //宏定義數(shù)據(jù)類型uint
#define uchar unsigned char //宏定義數(shù)據(jù)類型uchar
#define key_S 1000 //宏定義短按(約20ms)
#define key_L key_S*100 //宏定義長按(約1s)
sbit key = P3 ^ 0;
sbit led0 = P1 ^ 0;
sbit led1 = P1 ^ 1;
sbit led2 = P1 ^ 2;
int buff;//<<<<<<<<<<<<<<<<<<<不要用 b
void delay_ms(unsigned int t) //延時函數(shù)
{
while(t--);
}
void main()
{
while(1)
{
static uint count = 0; //計數(shù)變量
if(!key)
{
if(count < key_L)count++; //防止count溢出
}
else //按鍵抬起
{
if(count > key_S && count < key_L) //短按
{
if(++buff == 4)
buff = 0; //count清0
switch(buff)//<<<<<<<<<<<<<<<<<<<把Switch放進(jìn)短按判斷
{
case 0:led0 = 1;led1 = 1;led2 = 1;break;
case 1:led0 = 0;led1 = 1;led2 = 1;break;
case 2:led0 = 1;led1 = 0;led2 = 1;break;
case 3:led0 = 1;led1 = 1;led2 = 0;break;
default:break;
}
}
if(count >= key_L) //長按//<<<<<<<<<<<<<<<<<<<長按判斷放進(jìn)松開里
{
if(P1 & 0x0F)
{
P1 = 0;
} else {
P1 = 0x0F;
buff = 0;
}
}
count = 0;
delay_ms(1200);
}
}
}
復(fù)制代碼
作者:
人工置頂員
時間:
2022-1-5 19:13
頂一下
作者:
wulin
時間:
2022-1-5 21:34
#define key_S 1000 //宏定義短按(約20ms)
#define key_L key_S*100 //宏定義長按(約1s)
你這個程序長短按宏定義的時間是以主循環(huán)周期確定的,不可以照抄。延時函數(shù)也不是隨便寫的,需要計算確定。給你改了,你試試。
#include <REG51.H>
#define uint unsigned int //宏定義數(shù)據(jù)類型uint
#define uchar unsigned char //宏定義數(shù)據(jù)類型uchar
#define key_S 20 //宏定義短按(約20ms)
#define key_L key_S*50 //宏定義長按(約1s)
sbit key=P3^0;
//sbit led0=P1^0;
//sbit led1=P1^1;
//sbit led2=P1^2;
int b;
uint count=0; //計數(shù)變量
bit a=0;
void delay(unsigned int t)//延時時間 = t*9+16 us
{
while(t--);
}
void main()
{
while(1)
{
//這一部分想控制四個LED開與關(guān),控制關(guān)的狀態(tài)不知道怎么寫。求解一下
if(!key)
{
count++;
if(count==key_L) //長按
{
a=~a;
if(a)P1&=0x0f;
else P1|=0xf0;
}
if(count>key_L) //防止count溢出
count=key_L+1;
}
else //按鍵抬起
{
if(count>key_S && count<key_L) //短按
{
P1|=0x0f;
P1&=~(0x01<<b);
b=++b%4;
}
count=0; //count清0
}
delay(110);//1ms
}
}
復(fù)制代碼
作者:
man1234567
時間:
2022-1-6 08:33
理論上一個按鍵是可以控制多個燈的開關(guān)的,無非長按、短按、雙擊、三擊、多擊、長按與短按編碼...
網(wǎng)上有現(xiàn)成的單、雙、長三態(tài)代碼可抄用,三擊以上或長短結(jié)合的僅見思路。
作者:
qwettyuio
時間:
2022-1-11 11:28
wulin 發(fā)表于 2022-1-5 21:34
#define key_S 1000 //宏定義短按(約20ms)
#define key_L key_S*100 ...
你好,我想問一下,遇到一個長按的問題,單片機(jī)一通電就執(zhí)行第一個顯示,然后通過長按進(jìn)行兩個模式切換,求解一下
#define key_S 20
#define key_L key_S*50
uchar fen;
uint count;
bit a=0;
sbit key3 = P1^3;
sbit led0 = P1^0;
sbit led1 = P1^7;
sbit led2 = P1^6;
void delay(unsigned int t)//延時時間 = t*9+16 us
{
while(t--);
}
void Scan_key()
{
if(!key3)
{
count++;
if(count==key_L)
{
a=~a;
if(a)
{
Write_1621(29,0x20,4);
}
else
{
Write_1621(29,0x40,4);
}
}
if(count>key_L)
count=key_L+1;
}
else
{
if(count>key_S && count<key_L)
{
if(++fen==4)
fen=0;
}
count=0;
switch(fen)
{
case 0:Write_1621(8,0x01,4);led0=1;led1=1;led2=1;break;
case 1:Write_1621(8,0x80,4);led0=0;led1=1;led2=1;break;
case 2:Write_1621(8,0x40,4);led0=1;led1=0;led2=1;break;
case 3:Write_1621(8,0x20,4);led0=1;led1=1;led2=0;break;
default:break;
}
}
delay(110);
}
void main( )
{
Init_1621(); //初始化HT1621
Port1Cfg(1,0); //推挽輸出
Port1Cfg(1,3);
Port1Cfg(1,6);
Port1Cfg(1,7);
while(1)
{
Guding_Init();
Scan_key();
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1