📄 1797 05 protocol
字号:
//接收子函数
#include <head.c>
#define SECRET 0X89
unsigned char bdata s_buf,r_buf;
unsigned char data last_s;
extern bit scan_on,secret_f;
extern unsigned char delay_count;
sbit s_buf0=s_buf^0;
sbit r_buf7=r_buf^7;
//sbit r_buf0=r_buf^0;
//sbit r_buf1=r_buf^1;
//sbit r_buf2=r_buf^2;
unsigned char bdata parity_buf;
sbit parity_buf0=parity_buf^0;
unsigned char data first_delay,old_delay;
extern unsigned char data delay_count;
unsigned char bdata scan_v,temp1,temp2;
sbit c0=scan_v^5;
sbit c1=scan_v^6;
sbit a0=scan_v^0;
sbit a1=scan_v^1;
sbit a2=scan_v^2;
sbit b0=scan_v^3;
sbit b1=scan_v^4;
sbit temp1_0=temp1^0;
sbit temp1_1=temp1^1;
sbit temp1_2=temp1^2;
sbit temp2_0=temp2^0;
sbit temp2_1=temp2^1;
void set_scan_v(unsigned char vv)
{
scan_v=vv;
temp1=0;
temp1_0=c0;
temp1_1=c1;
first_delay=(1+temp1)*60;
first_delay=first_delay/6*Frequence;
temp1=0;
temp2=0;
temp1_0=a0;
temp1_1=a1;
temp1_2=a2;
temp2_0=b0;
temp2_1=b1;
old_delay=(8+temp1)*(1<<temp2);
old_delay=old_delay/6*Frequence;
}
//unsigned char data counter=0,counter1=0,counter2=0;
void set_led(unsigned char c)
{
// counter++;
temp1=c;
scroll_led=!temp1_0;
num_led=!temp1_1;
caps_led=!temp1_2;
}
void set_default()
{
KBCLK=1;
KBDATA=1;
clr_buf();
set_scan_v(SCAN_V_DEFAULT);
}
bit parity()
{
bit PARITY=1;
unsigned char data c;
for(c=0;c<8;c++)
{
PARITY^=parity_buf0;
parity_buf=parity_buf>>1;
}
return PARITY;
}
void delay()//reentrant //延时24us
{
unsigned char data t=DELAY;
for(;--t;);
}
void sleep() //延时16us
{
unsigned char data t=SLEEP;
for(;--t;);
}
unsigned char receive(void) //接收子函数
{
unsigned char data i;
bit PARITY;
ET1=0;
r_buf=0;
while(!KBCLK);
delay();
if(KBDATA)
{ send(0xfe);
return 0;}
delay();
sleep();
KBCLK=0;
for(i=0;i<8;i++)
{
delay();
sleep();
KBCLK=1;
sleep();
if(!KBCLK) return 1; //接收中断
r_buf7=KBDATA;
if(i!=7)
r_buf=r_buf>>1;
delay();
KBCLK=0;
}
delay();
sleep();
KBCLK=1;
sleep();
PARITY=KBDATA;
delay();
KBCLK=0;
delay();
sleep();
KBCLK=1;
//停止位
delay();
if(!KBDATA) {send(0xfe);return 0;}
KBDATA=0;
sleep();
KBCLK=0;
sleep();
delay();
KBCLK=1;
sleep();
KBDATA=1;
sleep();
ET1=1;
parity_buf=r_buf;
if(PARITY==parity())
return r_buf;
else {send(0xfe);return 0;}
//缺错误处理 *
}
bit send(unsigned char c) //发送子函数
{
unsigned char data i;
bit PARITY;
ET1=0;
parity_buf=c;
PARITY=parity();
last_s=c;
s_buf=c;
if(command_s())
return 0;
KBDATA=0;
sleep();
KBCLK=0;
for(i=0;i<8;i++)
{
sleep();
delay();
KBCLK=1;
sleep();
if(!KBCLK)
return 0;
KBDATA=s_buf0;
s_buf=s_buf>>1;
sleep();
KBCLK=0;
}
delay();
sleep();
KBCLK=1;
sleep();
if(!KBCLK)
return 0;
KBDATA=PARITY;
delay();
KBCLK=0;
delay();
KBCLK=1;
sleep();
KBDATA=1;
delay();
KBCLK=0;
delay();//延时60us
delay();
sleep();
KBCLK=1;
sleep();
ET1=1;
return 1;
}
void receive_v()
{
scan_on=0;
set_timer1();
while(delay_count<200)
{
if(command_s())
{
set_scan_v(receive());
send(0xfa);
scan_on=1;
break;
}
}
}
void receive_led()
{
set_timer1();
while(delay_count<200)
{
if(command_s())
{
set_led(receive());
send(0xfa);
break;
}
}
}
re_send()
{
send(last_s);
}
void receive_process()
{
unsigned char data command;
if(!command_s()) return;
command=receive();
if(!command) return;
switch(command)
{
case 0xff:
send(0xfa);////////////////
reset();
break;
case 0xfe:
send(0xfa);
re_send();
break;
case 0xf6:
send(0xfa);
set_default();
scan_on=1;
break;
case 0xf5:
send(0xfa);
set_default();
scan_on=0;
break;
case 0xf4:
send(0xfa);
scan_on=1;
clr_buf();
break;
case 0xf3:
send(0xfa);
receive_v();
break;
case 0xee:
send(0xee);
break;
case 0xed:
send(0xfa);
receive_led();
break;
case SECRET:
secret_f=1;
break;
default:
send(0xfe);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -