📄 kbv10work.c
字号:
#include "reg52.h"
#include "stdio.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define XBYTE ((uchar *) 0x50000L)
#define PRESSKEY_MAX 5
#define MAX_LEN 16
#define WAITPS2CLK 250
#define CONFIG_COM 0X53
#define KEYMAP_COM 0X5C
#define READ_COM 0X7f
#define OSTEST_COM 0X63
#define VERSION_COM 0X62
#define CHECKKEYBEGIN_COM 0X67
#define CHECKKEYOVER_COM 0X68
#define PS2MARK 0XF2
#define MEMORYMARK 0XF3
#define CARDMARK 0XF4
#define PS2MARKERROR 0XF5
#define MEMORYMARKERROR 0XF6
#define CARDMARKERROR 0XF7
#define SENDCHARMAX 3000
#define ISP_COM 0X66
#define CONFIGADDL 0X00
#define CONFIGADDH 0X70
#define CONFIG_BASE 0X7000
#define KEYADD_BASE 0X7200
#define KEYMSG_BASE 0X8600
#define KEYADDH 0X72
#define TRK1DELAY_MS 3
#define KEYDELAY_MS 3
#define ACKTOHOST 0X31
#define ROWNUM 7
#define COLNUM 11
#define ROWCOL1 (2*COLNUM)
#define ROWCOL2 (ROWNUM*COLNUM*2 )
#define READDELAY 3
#define CARDBEEP 200
#define HOSTACK 0X31
#define CHECKACK 0X01
#define CHECKACK1 0Xfb
sfr ISPFAH=0XF4;
sfr ISPFAL=0XF5;
sfr ISPFD=0XF6;
sfr ISPC=0XF7;
sfr SCONF=0XBF;
sfr WDTC= 0X9F;
sbit JP_DATA=P1^3;
sbit JP_CLK=P1^0;
sbit BJP_CLK=P3^6;
sbit BJP_DATA=P3^5;
sbit READER_CLK=P3^1;
sbit READER_DATA=P3^2;
sbit BEEP_EN=P2^7;
sbit LED1_EN=P1^5;
sbit LED2_EN=P1^6;
sbit LED3_EN=P1^7;
sbit SCAN_A0=P2^0;
sbit SCAN_A1=P2^1;
sbit SCAN_A2=P2^2;
sbit SCAN_A3=P2^3;
sbit EN_SCAN=P3^7;
sbit LOCK_EN=P2^4;
bit HostApa_Flag=0;
bit DelayPs2_Flag=0;
bit Timer2_Flag=0;
bit CheckCard_Flag=0;
bit Caps_Flag=0,ProBeep_Flag=0;
bit SendApa_Flag=0;
bit ReadHost_Flag=0;
bit Config_Flag=0,KeyMap_Flag=0,Isp_Flag=0;
bit FirstPress_Flag=0;
bit ED_Flag=0;
bit TypeDelay_Flag=0;
bit LockShiftOld_Flag=0,LockShiftNew_Flag=0,LockCtrlOld_Flag=0,LockCtrlNew_Flag=0,LockAltOld_Flag=0,LockAltNew_Flag=0;
bit LockOldCaps_Flag=0,LockNewCaps_Flag=0,LockOldNum_Flag=0,LockNewNum_Flag=0,LockNewScroll_Flag=0,LockOldScroll_Flag=0;
uchar Lock_Layer=0,KeyNew_Layer=0;
uchar TypeMaticCount=0,LockNew_Status=0,LockOld_Status=0;
bit SpecialTypeDelay_Flag=0;
uchar SpecialTypeMaticCount=0;
bit KeyOldCaps_Flag=0,KeyNewCaps_Flag=0,KeyOldNum_Flag=0,KeyNewNum_Flag=0, KeyOldScroll_Flag=0,KeyNewScroll_Flag=0;
uchar WriteIndex=0,ReadIndex=0,DataCount=0;
uchar xdata DataBuffer[MAX_LEN];
uchar SendApa=0;
uchar LayerNew_Sum=0,LayerOld_Sum=0;
uint KeySendRow=0,KeySendCol=0;
uchar KeyNew_Num=0,KeyOld_Num=0,KeyNewAsci_Num=0,KeyOldAsci_Num=0;
uint xdata OldKey[PRESSKEY_MAX],CurKey[PRESSKEY_MAX],KeyNewAsci[PRESSKEY_MAX],KeyOldAsci[PRESSKEY_MAX];
bit ShiftNew_Flag=0,ShiftOld_Flag=0,AltNew_Flag=0,AltOld_Flag=0,CtrlNew_Flag=0,CtrlOld_Flag=0;
uchar rece_host_byte=0,rece_ps2_byte=0;
const code bitmask[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40};
const code tableChar[]= {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '+', '_', ':', '<', '>', '?',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}' , '~' , '"', 0
};
const code tableChar1[]={'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '=', '-', ';', ',', '.', '/',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '\\', ']', '`', '\'', ' '
};
const code tableScan[]= {0x16, 0x1e, 0x26, 0x25, 0x2e, 0x36, 0x3d, 0x3e, 0x46, 0x45, 0x55, 0x4e, 0x4c, 0x41, 0x49, 0x4a,
0x1c, 0x32, 0x21, 0x23, 0x24, 0x2b, 0x34, 0x33, 0x43, 0x3b, 0x42, 0x4b, 0x3a, 0x31, 0x44 , 0x4d,
0x15, 0x2d, 0x1b, 0x2c, 0x3c, 0x2a, 0x1d, 0x22, 0x35, 0x1a, 0x54, 0x5d, 0x5b, 0x0e, 0x52, 0x29
};
void Delay_ms(uint);
void Delay_40us(void);
void Delay_10us(void);
void Delay_25us(void);
void Delay_5us(void);
bit Key_Scan(void);
bit SendMakeToHost(uchar);
void Service_Timer1(void);
void Service_Timer2(void);
uchar Lock_Scan(void);
void Service_In0(void);
void Ini_Int0(void);
void Ini_Timer2(void);
void Ini_Timer1(void);
bit SendComToPs( uchar);
uchar CheckLock_Layer(uchar );
uchar CheckKey_Layer(void);
void CheckKey_Special(void);
bit CompareSame_Special(void);
bit CompareSame_Asci(void);
void SendCurKeyCode(uint ,uint );
void UpDateOldKey(void);
void ClearAll_Flag(void);
void Send_Locks(uchar );
void AddDataToBuffer(uchar );
void SendDataToHost(void);
void GetByteFromHost(void);
void SendSpecialKeyCode(void);
void Version_IAP(void);
void Ini_Flash(void);
void SendLock_Msg(uchar );
void SendMakeToHostCount(uchar );
void Version_IAP(void);
/*--------------------------------------------------*/
/*--------------------------------------------------*/
/* Delay1ms() */
/*--------------------------------------------------*/
void Delay_ms(uint lin)
{
uchar j;
while(lin>0)
{
for(j=0;j<125;j++);
lin--;
}
}
/*--------------------------------------------------*/
/* Delay5us() */
/*--------------------------------------------------*/
void Delay_5us()
{
}
/*--------------------------------------------------*/
/* Delay10us() */
/*--------------------------------------------------*/
void Delay_10us()
{
uchar i;
i=0;
i++;
i++;
i++;
}
/*--------------------------------------------------*/
/* Delay25us() */
/*--------------------------------------------------*/
void Delay_25us(void)
{
uchar i;
for(i=0;i<1;i++);
}
/*--------------------------------------------------*/
/* Delay40us() */
/*--------------------------------------------------*/
void Delay_40us(void)
{
uchar i;
i=0;
for(i=0;i<2;i++);
while(i==0);
while(i==0);
while(i==0);
}
/*--------------------------------------------------*/
/* ClearBuffer() */
/*--------------------------------------------------*/
void ClearBuffer()
{
uchar i;
WriteIndex=0;
ReadIndex=0;
DataCount=0;
for(i=0;i<MAX_LEN;i++)
DataBuffer[i]=0;
}
/*--------------------------------------------------*/
/* AddDataToBuffer() */
/*--------------------------------------------------*/
void AddDataToBuffer(uchar aData)
{
if(DataCount<MAX_LEN)
{
DataBuffer[WriteIndex]=aData;
WriteIndex++;
if(WriteIndex==MAX_LEN)
{
WriteIndex=0;
}
DataCount++;
}
}
/*--------------------------------------------------*/
/* SendDataToHost() */
/*--------------------------------------------------*/
void SendDataToHost(void)
{
if(!DelayPs2_Flag)
{
while(DataCount>0)
{
BJP_CLK=0;
if(SendMakeToHost(DataBuffer[ReadIndex])==1)
{
break;
}
else
{
ReadIndex++;
if(ReadIndex==MAX_LEN)
{
ReadIndex=0;
}
DataCount--;
}
}
}
BJP_CLK=1;
}
/*--------------------------------------------------*/
/* void GetByteFromHost(void ) */
/*--------------------------------------------------*/
void GetByteFromHost(void)
{
uchar i;
bit flag_check=1;
uchar rece_host_data[11];
BJP_CLK=0;
EA=0;
TF2=0X00;
ET2=0;
TR2=0;
while(!JP_CLK);
if(!JP_DATA)
{
Delay_10us();
rece_host_data[0]=JP_DATA;
Delay_10us();
for(i=1;i<10;i++)
{
JP_CLK =0;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_5us();
JP_CLK=1;
Delay_10us();
rece_host_data[i]=JP_DATA;
Delay_10us();
}
Delay_5us();
JP_CLK=0;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_5us();
JP_CLK=1;
Delay_10us();
rece_host_data[10]=JP_DATA;
Delay_5us();
if(rece_host_data[10]!=1)
{
//error host not realse data line
}
Delay_5us();
JP_DATA=0;
Delay_10us();
JP_CLK=0;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_5us();
JP_CLK=1;
Delay_10us();
JP_DATA=1;
//receive over check the data
for(i=1;i<9;i++)
{
if(rece_host_data[i]==1)
{
flag_check=!flag_check;
}
}
if(rece_host_data[10]==1)
{
if(flag_check==rece_host_data[9])
{
rece_host_byte=0;
for(i=1;i<9;i++)
rece_host_byte+=rece_host_data[i]<<(i-1);
ReadHost_Flag=1;
if((!Config_Flag)&&(!KeyMap_Flag)&&(!Isp_Flag)&&(HostApa_Flag))
{
DelayPs2_Flag=1;
}
if((!Config_Flag)&&(!KeyMap_Flag)&&(!Isp_Flag)&&(!HostApa_Flag))
{
if((rece_host_byte==0xed)||(rece_host_byte==0xee)||(rece_host_byte>=0xf0))
DelayPs2_Flag=1;
}
}
else
{
//error data return error message
}
}
}
else
{
ReadHost_Flag=0;
rece_host_byte=0;
}
TR2=1;
ET2=1;
EA=1;
BJP_CLK=1;
}
/*--------------------------------------------------*/
/* send_make_to HOST */
/*--------------------------------------------------*/
bit SendMakeToHost(uchar x)
{
uchar i,tmpChar;
bit Parity_make=1 ;
bit tmpBit;
ET2=0;
TR2=0;
if(!JP_CLK)
{
Timer2_Flag=1;
ET2=1;
TR2=1;
return(1);
}
tmpChar=x;
Delay_40us();
Delay_10us();
if(!JP_CLK)
{
Timer2_Flag=1;
ET2=1;
TR2=1;
return (1);
}
JP_DATA=0;
Delay_10us();
Delay_10us();
JP_CLK=0;
Delay_40us();
JP_CLK=1;
for(i=0;i<8;i++)
{
tmpBit=tmpChar&0X01;
if(tmpBit)
{
Parity_make=!Parity_make;
}
else
{
Parity_make=Parity_make;
}
if(!JP_CLK)
{
Timer2_Flag=1;
ET2=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -