?? key2.c
字號:
//////////////////////////////////////////////////////
///注意分時調度機制
//矩陣第一列4個鍵:單機和連擊 P3^4接地
//獨立鍵盤第2個鍵:短擊和長擊
//獨立鍵盤第3個鍵:單擊和雙擊
///////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar flag8ms;
bit a;
uchar keyzhi;
uchar key0;
uchar beifenkey;
uchar shumaguan=0;
uchar yanshi=20;
uchar changjiyanshi=30;
uchar shuangjiyanshi=30;
bit shuangjiflag,shuangjiflag1;
uchar aa=0;
uchar count=0;
uchar code table[]={ //數碼管
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void fun1();
void fun2();
void funduanji();
void funchangji();
uchar getkey() ;
void key();
void display(uchar shi,uchar ge);
void init()
{
P1=0xff;
P3=0xef;
TMOD=0x11;
TH0=(65536-8000)/256;
TL0=(65536-8000)%256;
EA=1;
ET0=1;
TR1=1;
TR0=1;
}
void main()
{
init();
while(1)
{
display(shumaguan/16,shumaguan%16); //不能寫在key()里面
key();
}
}
uchar getkey() //取鍵值
{
key0=P3;
switch(~key0) //取反了
{
case 0x11:
keyzhi=1;
break;
case 0x12:
keyzhi=2;
break;
case 0x14:
keyzhi=3;
break;
case 0x18:
keyzhi=4;
break;
case 0x30:
keyzhi=5;
break;
case 0x50:
keyzhi=6;
break;
default:
keyzhi=0;
break;
}
return keyzhi ;
}
void key()
{
if(flag8ms==1) //分時調度機制
{
flag8ms=0;
if(getkey())
{
if(beifenkey==getkey()) //通過備份值檢驗來完成消抖
{
switch(beifenkey)
{
case 5: //短擊與長擊
if(changjiyanshi!=0) //為了完成長擊后使changjiyanshi保持0
{
changjiyanshi--;
if(changjiyanshi==0)
{
funchangji();
}
}
break;
case 6: //單擊與雙擊 注意 shuangjiflag shuangjiflag1 aa count 的重置
if(shuangjiflag1==1) //shuangjiflag1第一次按下抬起后標志
{
shuangjiflag=0;
aa=1;
}
else shuangjiflag=1;
default:
yanshi-- ; //連擊的延時計時
if(!yanshi)
{
fun1();
fun2();
yanshi=20;
}
break;
}
}
else
{ //勿忘更新備份
beifenkey=getkey();
}
}
else
{
if(beifenkey==5)
{ //確定短擊
beifenkey=0;
if(1<changjiyanshi<24)
{
changjiyanshi=25;
funduanji();
}
}
if(beifenkey==6)
{
if(shuangjiflag==1) //第一次按下后標志
{
shuangjiflag=0;
shuangjiflag1=1;
aa=0;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
ET1=1;
}
}
}
}
}
void funchangji()
{
P1=0x00;
shumaguan=-1;
}
void funduanji()
{
P1--;
shumaguan++;
}
void fun1()
{
switch(beifenkey)
{
case 1:
P1--;
break;
case 2:
P1++;
break;
case 3:
P1=~P1;
break;
case 4:
if(P1==0xff)
{
P1=0;
}
else P1=0xff;
break;
}
}
void fun2()
{
switch(beifenkey)
{
case 1:
shumaguan++;
break;
case 2:
shumaguan--;
break;
case 3:
shumaguan=256-shumaguan;
break;
case 4:
if(shumaguan==0)
{
shumaguan=0xff;
}
else shumaguan=0;
break;
}
}
void display(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
}
void timer0() interrupt 1
{
TH0=(65536-8000)/256;
TL0=(65536-8000)%256;
flag8ms=1;
}
void timer1() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
count++;
if(count==80)
{
count=0;
shuangjiflag1=0; //否則不能進行下一次按鍵動作
ET1=0;
if(aa==1)
{
P1--;
}
else if(aa==0)
{
P1++;
}
aa=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -