?? 鍵盤顯示2.c
字號:
#include <reg52.h>
#include <absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit STR = P3^6;//定義CD4094各端口;
sbit DATA = P3^0;
sbit CLK = P3^1;
void delays(uint); //延時函數
void Out_4094(uchar);//發送代碼函數
uchar kbscan(); //判斷鍵是否按下
uchar keyadr(); //得到鍵位置函數
uchar keyzhi(uchar); //得到鍵值函數
void led_xs();
int xianshi[]={16,16,16,16};
//int xianshi[]={6,5,2,1};
void main()
{uchar key,get;
int i=0,k=0; //k為按鍵計數
int sudu=0; //速度控制
led_xs(); //調用4個數碼管顯示函數
while(1)
{ delays(15000); //上一按鍵與下一按鍵間就有一時間差,此時間剛好
i=kbscan(); //判斷鍵是否按下
if(i==1)
{ delays(600); //延時去抖動
// led_xs(); //調用4個數碼管顯示函數
}
i=kbscan(); //再次判斷鍵是否按下
if(i==1) //表明有鍵按下,并要清i為0(也可不清)
{ key=keyadr(); //調用得到鍵位置函數
get=keyzhi(key); //調用得到鍵值函數
if(0<=get&&get<=9)
{ xianshi[0]=xianshi[1];xianshi[1]=xianshi[2];
xianshi[2]=xianshi[3];xianshi[3]=get;
k++;
if(k==4) k=0;
led_xs(); //調用4個數碼管顯示函數
}
else if(get==10)
{ sudu=xianshi[3]*1000+xianshi[2]*100+xianshi[1]*10+xianshi[0];
xianshi[3]=sudu%10;
// led_xs(); //調用4個數碼管顯示函數
// printf("sudu=%d\n",sudu);
}
else if(get==11)
{xianshi[3]=0;xianshi[2]=0;xianshi[1]=0;xianshi[0]=0;
led_xs(); //調用4個數碼管顯示函數
}
// else {}
}
}
}
void delays(uint a) //延時子函數;
{uint b;
for(b=0;b<a;b++);
}
uchar kbscan() //判斷是否有鍵按下
{ P1=0xf0;
if((P1&0xf0)!=0xf0) //若有鍵按下
return 1;
else return 0;
}
uchar keyadr() //得到鍵位置函數
{
uchar sccode,recode,keytemp=0; //取為0是為了keytemp|=(~sccode)+(~recode)不多加keytemp考慮
int i=1; //控制循環
sccode=0xfe;
while(i==1)
// while((sccode|0xf0)!=0xff) // 循環不好控制
// while(sccode!=0xef) 對 // 循環不好控制
// while((sccode&0xf0)!=0) 錯
{ P1=sccode;
// if((P1&0xf0)!=0xf0) 錯
// if(P1!=sccode) //應該也行
if((P1&sccode)!=sccode)
{ recode=P1&0xf0|0x0f;
keytemp|=(~sccode)+(~recode);
i=0;
// sccode=sccode<<1|0x01; //得到鍵位置后繼續掃描,使循環完成.與上控制對應
}
else
sccode=sccode<<1|0x01;
}
return(keytemp);
}
uchar keyzhi(uchar key2) //讀鍵值
{uchar key1;
switch(key2)
{ case 0x11:key1 =7;break; //P10+P14
case 0x21:key1 =8;break; //P10+P15
case 0x41:key1 =9;break; //P10+P16
case 0x81:key1 =10;break; //P10+P17
case 0x12:key1 =4;break; //P11+P14
case 0x22:key1 =5;break; //P11+P15
case 0x42:key1 =6;break; //P11+P16
case 0x82:key1 =11;break; //P11+P17
case 0x14:key1 =1;break; //P12+P14
case 0x24:key1 =2;break; //P12+P15
case 0x44:key1 =3;break; //P12+P16
case 0x84:key1 =12;break; //P12+P17
case 0x18:key1 =13;break; //P13+P14
case 0x28:key1 =0;break; //P13+P15
case 0x48:key1 =14;break; //P13+P16
case 0x88:key1 =15;break; //P13+P17
}
return(key1);
}
void led_xs() //得到4個數碼管字形,并調用函數顯示
{ int i;
uchar j;
uchar codec[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0, //共陰極數碼管字形碼,從高位開始發時用。
0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00};
for(i=0;i<4;i++)
{
j=codec[xianshi[i]];
// delays(5000); //延時
Out_4094(j); //調用發送代碼函數
// delays(5000); //延時
}
}
void Out_4094(uchar data1)
{ int j;
STR=0; //保持然來的狀態不變;
for(j=0;j<8;j++)
{ DATA=(data1%2); data1>>=1;
CLK=0; //形成上升延脈沖;
// _nop_();
// _nop_(); //延時;
// _nop_();
CLK=1;
}
STR=1; //數據送完;更新顯示;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -