📄 key10_10.c
字号:
-----------蜂鸣器鸣叫程序----------------
*****************************************/
void OpeningBeep(uchar OBN)
{
uchar data i;
for(i=0;i<OBN;i++){
Beep=0;
DELAY(150);
Beep=1;
DELAY(150);
// DELAY(100);
//Beep=0;
//DELAY(150);
//Beep=1;
}
}
/****************************************
--------- 延时函数 ,大约1MS.-----------
****************************************/
void DELAY(uint z)
{
uchar data l;
while((z--)>0)
{
for(l=0;l<31;l++) RestWatchdog(); /* 125 _nop_(); */
}
}
/**************************************************************
---------------键盘扫描程序,返回按下的键值代码----------------
-- 有键按下返回键值代码,无键按下返回0,有键但没松开返回0XFF --
**************************************************************/
uchar Key_Press(void)
{
uchar data j=1,d;
RetKey=0;
key=0xff;
P2=0; /* 查询有无按键按下 */
_nop_();
_nop_();
key=P0;
if(key==0xff ){ /* 无键按下 */
KP: RetKey=NoKeyPress; KeyStatus=Up;
//OpeningBeep(1);//ysmtest
goto ENDKPONE;
}
else
{
for(d=0;d<250;d++) RestWatchdog(); /* 254 */
key=P0;
if(key==0xff) goto KP; /* 除去因抖动引起的错误按键信息 */
ScanKey();
if(key==PYStatusKey) /* 是汉英键 */
{
RetKey=0xaf;
PYStatus1=0;
PYStatusLED=0;
KeyStatus=Down;
}
else /* 不是汉英键 */
{
if((PYStatus1==0)&&(DotKeyStatus==1))/* 汉英和DotKey键已按下 */
{
OpeningBeep(8);
RetKey=KeyCodeNewTabFour[key];
DotKeyStatus=0;
KeyStatus=Down;
goto ENDKP;
}
if((PYStatus1==0)&&(DotKeyStatus==0))/* 汉英键已按但DotKey还没按下 */
{
if(key==dotkey) /* 是DotKey键吗? */
{
DotKeyStatus=1;
RetKey=NoKeyPress;
KeyStatus=Down;
goto ENDKP;
}
StartPYKey(); /*在汉英状态下选择第几个字母*/
CheckPYTab();
KeyStatus=Down;
}
else /* 汉英和DotKey键都没按下 */
{
if((key==ShiftKey)&&(PYStatus1==1))
{ /* 如为变位(上下档)键,则改变上下档标志位及LED灯显示状态 */
RetKey=NoKeyPress;
ShiftStatus=~ShiftStatus; /* 上下档键切换,=0上,=1下档键. */
SHIFTLED=ShiftStatus;
}
else{
if((ShiftStatus==0)&&(PYStatus1==1)){ /* 如果是上档键 */
RetKey=KeyCodeNewTabUp[key];OpeningBeep(3);
}
else { /* 如果是=1下档键 */
if((ShiftStatus==1)&&(PYStatus1==1))
RetKey=KeyCodeNewTabDown[key];OpeningBeep(5);
}
KeyStatus=Down;
}
_nop_();
goto ENDKP;
}
_nop_();
goto ENDKP;
}
_nop_();
goto ENDKP;
}
ENDKP:
for(;;)
{
key=P0;
if(key==0xff)
{
for(d=0;d<70;d++) RestWatchdog(); /* 254 WatchDog=!WatchDog;*/
break;
}
RestWatchdog();
}
ENDKPONE:
return(RetKey);
}
uchar ScanKey(void)
{
uchar data i,j=1;
P2=0; /* 查询有无按键按下 */
// key=P0;
for(i=0;i<5;i++)
{ /* 扫描哪个按键按下 */
P2=~j; /* 列扫描 */
key=P0;
_nop_();
if(key!=0xff)
{
j=i*8;
for(i=0;i<8;i++)
{ /* 行扫描 */
if(key%2==0) break;
key=key>>1;
}
key=j+i; /* 按键的行列值之和 */
if(key==EnterKey)
{
PYStatusLED=1;
PYStatus1=1; /*非汉英状态*/
}
Beep=0;
DELAY(90); /* 100 */
Beep=1;
_nop_();
goto ENDKP1;
}
j=j<<1;
RestWatchdog();
}
ENDKP1:
return(key);
}
void CheckPYTab(void)
{
switch(CounterNub1){
case Tab1:
RetKey=KeyCodeNewTabOne[key];
break;
case Tab2:
RetKey=KeyCodeNewTabTwo[key];
break;
case Tab3:
RetKey=KeyCodeNewTabThree[key];
break;
// case Tab4:
// RetKey=KeyCodeNewTabFour[key];
// break;
default:
break;
}
}
uchar StartPYKey(void)
{
if(key==SbufKey) /*按键与上次相同*/
{
++CounterNub2;
SbufKey=key;
CounterNub1=CounterNub2;
if(CounterNub1==4)
{
CounterNub1=1;
CounterNub2=CounterNub1;
}
}
else /*按键与上次不同*/
{
if(key==EndInputKey)
{
SbufKey=0x28;
CounterNub1=1;
CounterNub2=0;
}
else{
SbufKey=key;
CounterNub1=1;
CounterNub2=CounterNub1;
}
}
return(CounterNub1);
}
void RestWatchdog(void)
{
_nop_();
_nop_();
_nop_();
}
void delayms(uchar t1,uchar t2) /* 延时时间=4[t2(t1+1)+1]*机器周期 */
{ /* 机器周期=1.08us 11.0592Mhz */
uchar t; /* 最大延时282Ms */
do{
t=t1;
do{
t--;
}while(t != 0);
t2--;
}while(t2 != 0);
}
void CheckLED(void)
{
uchar m;
for(m=0;m<2;m++)
{
PowerLed=0;
delayms(90,90);
PowerLed=1;
delayms(90,90);
SHIFTLED=0;
delayms(90,90);
SHIFTLED=1;
delayms(90,90);
TestLED=0;
delayms(90,90);
TestLED=1;
PowerLed=0;
}
}
void main(void)
{
uchar data k, mkey=0x0;
bit NewKey=No;
IE=0;
SHIFTLED=1;
KeyStatus=Up;
ShiftStatus=1; /* 上下档键切换,=1下档,=0上档键. */
SHIFTLED=ShiftStatus;
DotKeyStatus=0;
PYStatus1=1;
PYStatusLED=1;
SbufKey=0x28;
fini=0; /* 初始化串行数据完成标志位 */
OpeningBeep(2);
CheckLED();
InitSBUF(); /* 初始化串行口 */
IT0=1; /* 下降沿有效 */
EX0=1;
ES=1;
EA=1; /* 开串行中断 */
KeyInt=High;
while(1)
{ P2=0; /* 查询有无按键按下 ysmtest */
k=P0;
if(KeyStatus==Down)
{
if(k==0xff)
{ /* 如果键已松开,则置松键标志与新键输入标志位*/
KeyStatus=Up;
//NewKey=Yes;
NewKey=No;
}
}
if(KeyInt==Low)
{
if((NewKey==No) && (KeyStatus==Up))
{
ES=0;
mkey=Key_Press();
RI=0;
TI=0;
ES=1;
}
KeyInt=High;
}
if(fini==1)
{
ES=0;
switch(handle)
{
case GetKey: if(KeyStatus==Down)
Un.ComBuf[0]=KeyNoUp;
else
{
Un.ComBuf[0]=mkey;
NewKey=No;
}
SendBuf(Finish,1);
break;
case OpenBeep: k=Un.ComBuf[0];
OpeningBeep(k); /* 开蜂鸣器,有可能更改为带参数的程序,产生多种声音 */
SendBuf(Finish,0);
break;
//case TestKey: SendBuf(Finish,0);
//break;
default: break;
}
fini=0;
ES=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -