补发目前状况
while(1)
{
part[0]=hal_matris_read();//接收扫描码
Process_scan_code(&part);
Generate_usb_code(&tx_buf,&part);
}
long int hal_matris_read()//char* queue,char *sign)
{
static unsigned int andbit2 = 0x01;
char key[3];
unsigned long int scan_data;
int k;
//设置P1口 某根线为低扫描 j行
P2= (~andbit2 & 0xff00)>>8;
P1= ~andbit2 &0x00ff;
P2= (~andbit2 & 0xff00)>>8;
for(k=0;k<0xffff;k++);//30ms //延时去抖处理
key[0] = P2;
key[1] = P1;
key[2] = P0;
memcpy(&scan_data,key,3);
scan_data=scan_data>>8; //得到当前扫描码
andbit2=(andbit2>>(16-1))|(andbit2<<1);
return scan_data;
}
void Process_scan_code(unsigned long *part)
{
//列按键分离
part[1]=part[0]|0xfe;
part[2]=part[0]|0xfd;
part[3]=part[0]|0xfb;
part[4]=part[0]|0xf7;
part[5]=part[0]|0xef;
part[6]=part[0]|0xdf;
part[7]=part[0]|0xbf;
part[8]=part[0]|0x7f;
}
void Generate_usb_code(unsigned char *tx_buf,unsigned long int* scan_code)
{
//根据扫描码生成usb码
//填充usb数据表
unsigned char usb,i;
unsigned long tmp;
for(i=0;i<8;i++)
{
tmp=scan_code[1+i];
switch(tmp)
{ //usb
case 0xfffeff: usb=0xE3; break; // L GUI
case 0xfffefe: usb=0xE4; break; // R ctrl
case 0xfffefd: usb=0xE7; break; // R GUI
case 0xfffefb: usb=0xE6; break; // R ALT
case 0xfffef7: usb=0x65; break; // APP
case 0xfffeef: usb=0x49; break; // Keyboard insert
case 0xfffedf: usb=0x4A; break; // Keyboard home
case 0xfffebf: usb=0x4B; break; // Keyboard page up
case 0x00007f: usb=0x4C; break; // Keyboard delete
default: usb=0;
}
tx_buf[i]=usb;
}
}
|