📄 send.c
字号:
#include<head.c>
#define KEYNO_MAX 26 //只定义了26个英文字母。需要修改
extern unsigned char data last_key;//main_t.c中定义
extern bit last_f; //main_t.c中定义
extern unsigned char data delay_count,send_delay;//protocol.c中定义
extern unsigned char data first_delay,old_delay;//protocol.c中定义
typedef unsigned char code *tt;
extern tt code kk[];//code.c中定义
bit second_f;
void delayl(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=1100;y>0;y--);
}
bit send_code(unsigned char _KeyNo,bit flag)
//发送按键扫描码,flag=0发送断开码,flag=1发送接通码,
//返回0表示发送成功,返回1表示发送失败
{
unsigned char *Key_code;
if(_KeyNo<=KEYNO_MAX)
Key_code=kk[_KeyNo];
else
return 0;
if(!flag) //flag=0,则发送断码,将Key_code调整到指向断码位置.
while(*(Key_code++));//比如Key_code={_A_M,0,_A_B,0},则while循环直到*Key_code为0才退出,同时Key_code指向_A_B
KBACT=0; //LINK ACT
delayl(50);
KBACT=1;
while(1)
{
if(*Key_code)//*Key_code非0,表明尚有扫描码需要发送
{
if(send(*(Key_code++)))
continue;
else
return 0;
}
else //发送完成
return 1;
}
}
void send_buf() //将缓冲区键的接通码或断开码发送给计算机键盘接口
{
unsigned char i=buf_length();
while(i>0)
{
i--;
switch(get_head_f())
{
case 0: //这次扫描该键没有按下
if(send_code(get_head(),0))
del_head();
break;
case 1: //如果缓冲区头地址处的标识为1,表明其对应按键被按下,将其标识置为0,重新插入缓冲区中
if(!insert(get_head(),0))
{
send(0);//插入错误,发送NULL码
clr_buf();
}
else
del_head();
break;
}
}
/*发送last_key对应的按键通码,第一次发送后开启定时器0,将second_f标识设为1,如果按键一直被按住,则经过延缓时间
first_delay后将再次发送扫描码,同时将second_f置0,在此之后将按照拍发速率发送通码(由old_delay决定拍发速率的大小)
*/
if(exist(last_key)!=255)//最后一次扫描到的按键在键盘缓冲区中存在
{
if(last_f==1)//第一次发送扫描码
{
last_f=0;
second_f=1;
send_delay=0;//计数器1中改变该值
send_code(last_key,1);
set_timer0();//计数器1开始计数,delay_count值递增
}
else if(second_f)//第二次发送扫描码,延时由延缓时间决定
{
if(send_delay<first_delay+10)//等待send_delay值超过延缓时间first_delay
return ;
send_delay=0;
send_code(last_key,1);
second_f=0;
}
else //第三 -N次发送,延时由拍发速率决定
{
if(send_delay<old_delay+100)//等待send_delay值超过拍发速率old_delay
return ;
send_delay=0;
send_code(last_key,1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -