📄 keycode.c
字号:
break ;
case 0x7D :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x74 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x7A :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x51 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x71 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x53 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x7B :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x79 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x76 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x3F :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x40 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x83 :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
case 0x7E :
{
biaozhiflag = 1;
inhibit = 1;
EA = 1;
}
break ;
//////////////////////2007-07-03新增结束////////////////////////////
/***************************************************************/
if(atxtflag==1)
{
//case 0x78: //AT按下F11
if(ScanCode==0x78)
{
Delay400Ms();
Delay400Ms();
if(ScanCode==0x78)
{
Delay400Ms();
Delay400Ms();
if(ScanCode==0x78)
{
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
biaozhiflag = 0;
inhibit = 0;
EA = 0;
}
}
}
}
else //(atxtflag==0)XT
{
//case 0x57: //XT按下F11
if(ScanCode==0x57)
{
Delay400Ms();
Delay400Ms();
if(ScanCode==0x57)
{
Delay400Ms();
Delay400Ms();
if(ScanCode==0x57)
{
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
biaozhiflag = 0;
inhibit = 0;
EA = 0;
}
}
}
}
break ;
/***************************************************************/
default:
break;
} //结束switch (ScanCode)
} //结束if (!Key_UP)
else
{
Key_UP = 0;
}
BF = 0; //标识字符处理完了
}
/////////////////////////接收大键盘命令处理完成//////////////////////
//////////////////////////小键盘扫描驱动程序开始/////////////////////
//计算校验函数
//unsigned char parity(unsigned char x)
//{
// x^=x;
// if(P)return(1);
// else return(0);
//}
/*unsigned char parity2(unsigned int x){
#pragma asm
mov a,r7
xrl ar6,a
#pragma endasm
if(P)return(1);
else return(0);
}*/
/////////////////////////////////////////////
//2007-6-16修改时序(发送数据的时序)
/////////////////////////////////////////////
void SEND_byte(unsigned char x)
{
bit flag_check;
uchar i,temp,char_temp;
flag_check = 1;
//inhibit = 1; //关闭标准键盘
delay5Ms();
temp = x;
for(i=0;i<8;i++)
{
char_temp = temp&0x01;
if(char_temp==0x01)
{
flag_check = !flag_check;
}
temp = temp >>1;
}
CLK = 1; //首先把时钟线置高
while(!CLK) //判断时钟是否是低等待
{ ; }
CLK = 1 ;
DATA = 1;
if(CLK == 1)
{
delayus(30);//3
}
if(CLK == 1 && DATA == 1) //发送数据到计算机
{
DATA = 0; //发送开始位
delayus(10);//1
CLK = 0;
delayus(5);//1
temp = x;
for(i=0;i<8;i++) //发送8位数据低位在先
{
CLK = 1;
delayus(5);//1
char_temp = temp&0x01;
if(char_temp == 0x01)
{
DATA = 1;
}
else
{ DATA = 0; }
delayus(10);//1
CLK = 0;
delayus(5);//1
temp = temp >>1;
}
CLK = 1; //发送检测位
delayus(5);//1
DATA = flag_check;
delayus(10);//1
CLK = 0;
delayus(5);//1
CLK = 1; //发送停止位
delayus(5);//1
DATA = 1;
delayus(10);//1
CLK = 0;
delayus(5);//1
CLK = 1;
delayus(30);//3
CLK = 1;
DATA = 1;
if(CLK ==1&&DATA == 0)//PC机正在发送数据到mcu
{
return; //返回到接收函数
}
}
//inhibit = 1 ;//打开标准键盘
}
///////////////////////////////////////////////////////////////////////////
unsigned char ReadKeyVar(void) //读取的健值
{
unsigned char i; //行下标
unsigned char j; //列下标
unsigned char hp; //行位置
unsigned char lp; //列位置
unsigned char keyval=NOKEY; //返回键值
LOHI(); //列出行入
if (P1!=0xff) //如果有键按下
{
delay_ms(10); //延时消抖
hp=P1; //读取行位置值
for ( i=0; hp!=hh[i]&&i<8 ; i++ ); //查找
if ( i!=8) //如果找到了
{
HOLI();
delay_ms(10); //就翻转
lp=P2&0Xff; //读取列位置值,屏蔽不用的位
LOHI();
delay_ms(10); //翻回去
for ( j=0; lp!=ll[j] && j<5 ; j++ ); //查找
if ( j!=5) //如果找到了
{
keyval=keyvartab[i][j]; //就取出键值
buzzer = 0;
delay5Ms();
delay5Ms();
buzzer = 1;
keyval=keyvartab[i][j]; //就取出键值
}
delay_ms(10);
while(P1 != 0xff ); //等待按键抬起
}
}
return (keyval); //返回键值
}
/////////////////////////////////////////////////////////////////
//数字键到编码的转换函数
void numbertocode(void)
{
unsigned char i;
unsigned char TempCyc;
unsigned char Keydata;
unsigned char ASCII_code;
//////biaozhiflag = 0; //清有键标志位
//////inhibit = 0; //打开标准键盘
if (DisNum > 15)
{
DisplayListChar(0, 1, Cls);//清LCD第二行
DisNum = 0;
}
Keydata = ReadKeyVar();
if(Keydata == '!') //判断是否是ENTER键
{
//////inhibit = 0; //打开标准键
if(atxtflag == 1) //判断是AX还是XT
{
SEND_byte(0x5A);
SEND_byte(0xf0);
SEND_byte(0x5A);
} //发送编码到PC机
else
{
SEND_byte(0x1C);
////SEND_byte(0x9C);
}
DisplayListChar(0, 1, Cls);//清LCD第二行
DisNum = 0;
inhibit = 1; //打开标准键盘
biaozhiflag = 1;
EA = 1;
return ; //返回
}
else if(Keydata == '~') //判断是否是back键
{
//////inhibit = 0; //打开标准键盘
if(bit1_6flag == 1) //清1位数据
{
if(DisNum==0); //判断当前显示位置是否是0位
else{
--DisNum; //当前位置向左移一位
if(DisNum<16) //判断是否是小于16个字母
{ DisplayOneChar(DisNum, 1, 0x20); } //清除一位数据
}
if(atxtflag == 1) //判断是AX还是XT
{
SEND_byte(0x66);
SEND_byte(0xf0);
SEND_byte(0x66);
} //发送编码到PC机
else
{
SEND_byte(0x0E);
////SEND_byte(0x8E);
}
}
else //清6为数据
{
for(i=0;i<6;i++)
{
if(DisNum==0); //判断当前显示位置是否是0位
else
{
--DisNum; //当前位置向左移一位
if(DisNum<16) //判断是否是小于16个字母
{ DisplayOneChar(DisNum, 1, 0x20); } //清除一位数据
}
if(atxtflag == 1) //判断是AX还是XT
{
SEND_byte(0x66);
SEND_byte(0xf0);
SEND_byte(0x66);
} //发送编码到PC机
else
{
SEND_byte(0x0E);
////SEND_byte(0x8E);
}
} //结束清6位数据
} //结束清6位数据
} //结束BACK键
else //数字键或字母键
{
if(atxtflag == 1) //AT下的数字键或字母键
{
for(TempCyc = 0;(ATunshift[TempCyc][1]!=Keydata)&&(TempCyc<38); TempCyc++); //查表显示
if (ATunshift[TempCyc][1] == Keydata)
{
//////inhibit = 0; //打开标准键盘
if(numberflag == 1)
{ DisplayOneChar(DisNum, 1, ATunshift[TempCyc][1]); }
else
{ DisplayOneChar(DisNum, 1, '*'); }
ASCII_code = ATunshift[TempCyc][0];
SEND_byte(ASCII_code);
SEND_byte(0xf0);
SEND_byte(ASCII_code);
DisNum++;
} //结束解码
} //结束AT下的发送和显示数字键或字母键
else //XT下的数字键或字母键
{
for(TempCyc = 0;(XTunshift[TempCyc][1]!=Keydata)&&(TempCyc<38); TempCyc++); //查表显示
if (XTunshift[TempCyc][1] == Keydata)
{
//////inhibit = 0; //打开标准键盘
if(numberflag == 1)
{ DisplayOneChar(DisNum, 1, XTunshift[TempCyc][1]); }
else
{ DisplayOneChar(DisNum, 1, '*'); }
ASCII_code = XTunshift[TempCyc][0];
SEND_byte(ASCII_code);
////SEND_byte(ASCII_code+0x80);
DisNum++;
} //结束解码
} //结束XT下的发送和显示数字键或字母键
} //结束发送和显示数字键或字母
} //结束解码程序
//////////////////////////小键盘扫描驱动程序开始///////////////////////////
void main(void)
{
unsigned char TempCyc;
a1 = 1;
a2 = 1;
inhibit = 1;
atxtflag = 1;
numberflag = 1;
bit1_6flag = 1;
buzzer = 0;
delay5Ms();
delay5Ms();
buzzer = 1;
delay5Ms();
delay5Ms();
buzzer = 0;
delay5Ms();
delay5Ms();
buzzer = 1;
Delay400Ms(); //启动等待,等LCM讲入工作状态
initlcm4bit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
DisplayListChar(0, 0, cdle_net); //第一行显示 WELCOME!
DisplayListChar(0, 1, email); //第二行显示we do our best!
for (TempCyc=0; TempCyc<4; TempCyc++)
Delay400Ms(); //延时
DisplayListChar(0, 1, Cls); //清显示
IT1 = 0; //设外部中断1为低电平触发
EA = 1;
EX1 = 1; //开中断
while(1)
{
if(BF)
{
Decode(KeyV);
if(biaozhiflag==0)
{
do{
numbertocode();
}while(biaozhiflag==0);
}
else
{
biaozhiflag=1;
inhibit = 1;//////后加07-06-23
EA = 1;
}
}
else
{
biaozhiflag=1;//////后加07-06-23
inhibit = 1;
EA = 1; //开中断
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -