📄 yxkeyv1.0.c
字号:
if (!((SerData[3]==0)&&(SerData[5]==0)))
goto ReadClear;/*地址相同或00*/
SerN=0; //!bug 有不发送应答的处理
//所以先清除SerN,否则后继第一条指令丢失
switch (SerData[4]) /*命令码*/
{
case 0x50:
ReadCmd50();
//InputN=6; //按键不能再输入 no 会影响启动扫描命令的InputClr
bRcvOk=0;
return;
case 0x51:/*多键带计时,包含抢答*/
case 0x52:
if (SerData[2]==4)//len
SendMoreKey();
bRcvOk=0;
return;/*不用break,保证SERN不改写为0*/
case 0x53: /*单键不带计时*/
if (SerData[2]==4)//len
SendOneKey();
bRcvOk=0;
return;
case 0x5A: //显示数字
InputN=0;
bEnter=0;
break;
default:
break;
};
ReadClear:
SerN=0;
bRcvOk=0;
return;
}
void InputClr()
{ uchar i;
for (i=0;i<6;i++) LcdBuf[i]=0x0f;
for (i=0;i<3;i++) KeyBuf[i]=0xff;
InputN=0;
bDot=0;bEnter=0;
TimerA=0;
}
void SystemIni()
{ register uchar i;
TMOD=0x21; /*定时器0工作于方式1,定时器1工作于方式0*/
PCON=0x80; /*波特率19200*/
SCON=0x50; /*串行口为方式1,10位异步收发模式*/
TH0=C_T0H;
TL0=C_T0L;
TH1=0xFD;
TL1=0xFD;
TR0=1;TR1=1; /*启动定时器0和定时器1*/
IT0=1; /*外中断为下降沿触发*/
IP=0; /*中断优先级全部设为低优先级*/
//PS=1;/*串口设为高优先级 No!除非使用不同的BankRam否则影响其他中断的@R0等操作*/
EX0=1; /*开发各个中断*/
ET0=1;ES=1; /*开定时器0中断和串行口中断*/
TR=1; /*系统先置为接收状态*/
if ((InitOkNum!=0xAA) | (InitOkNum2!=0x55))
{ ReadIni();
InitOkNum=0xAA;
InitOkNum2=0x55;
}
P1Led=0xff;
PwrTimer=PwrT*120;
TimerN=C_TIMERN;
SerN=0;
bRcvOk=0;bSendOk=1;
LED=0;
//for (i=0;i<20;i++) DelayMs(200);//复位测试
InputClr();
REN=1;
EA=1;
}
void int0 (void) interrupt 0 using 1
{
IE0=0;
}
void timer0 (void) interrupt 1 using 1
{ /*TR0=0;*/
TH0=C_T0H;
TL0=TL0+C_T0L;
if (--TimerN==0 )
{ bTimer=1;
TimerN=C_TIMERN;}
/*TR0=1;*/
TimerA++;
bKeyScan=1;/*键盘防抖*/
}
void Int1 (void) interrupt 2 using 1
{
IE1=0;
}
void timer1 (void) interrupt 3 using 1
{
TR1=0;
}
/*串口数据接收*/
void RecvData() using BANK_SERI
{
if (bRcvOk) return;
switch (SerN)
{
case 0:
if (SBUF==0xAA) {
SerData[0]=SBUF;
SerN++;
}
break;
case 1:
if (SBUF==0x55) {
SerData[1]=SBUF;
SerN++;
} else{
SerN=0;
}
break;
case 2:
if ((SBUF>3)&&(SBUF<14)) {//长度
SerData[2]=SBUF;
SerN++;
} else{
SerN=0;
}
break;
default:
if (SerN < C_SERMAXN )
{
SerData[SerN]=SBUF;
SerN++;
if (SerN == (SerData[2]+3)) {/*[0]=AA [1]=55 [2]=Len*/
bRcvOk=1;
}
}else{
SerN=0;
}
break;
}
}
/*发送的数据入串口Buf*/
void PushSendBuf(uchar i)
{
if (SerN >= C_SERMAXN) return;
SerData[SerN]=i;
SerN++;
SerBufN++;
}
/*开始发送数据包*/
void StartSendBuf()
{
TR=0;/*切换到发送状态*/
IconTX=1;
DelayMs(2);
SerHeadN=C_HEADN ;
SerN=0;
SBUF=0x55;
bSendOk=0;
}
/*串口发送中断调用的 串口数据发送*/
void SendData() using BANK_SERI
{
if (bSendOk) return;
/* if (SerHeadN>0) /*发送引导数据*/
/* { if (SerHeadN==1) SBUF=0x66 ;
else
if (SerHeadN==2) SBUF=0xFF ;
else SBUF=0x55;
SerHeadN--;
return;
}
*/
SBUF=SerData[SerN];
SerN++;
//if (SerN>=SerBufN)//Bug!最后一个字节不发送
if (SerN>SerBufN)
{
TR=1; /*切换到接收状态*/
bSendOk=1;
SerN=0;
SerBufN=0;
}
}
void serials(void) interrupt 4 using BANK_SERI
{
if(RI==1)
{
RI=0;
//if (TR==1) RecvData();/*有发送状态产生接受中断的情况*/
RecvData();
return;
}
if(TI==1)
{
TI=0;
SendData();
}
}
/*------------------------------*/
void KeyScan()
{ uchar code KEYTAB[] =
{ 0,0x0e,0x0f,0x0c,0x0d,1,4,7,0x0a,2,5,8,0,3,6,9,0x0b,0x10};
register uchar i,KeyTemp;
bKeyScan=0;
bKeyOk=0;
P1=0xff;
for (i=0;i<4;i++)
{
if (i==0) K0=0;
if (i==1) K1=0;
if (i==2) K2=0;
if (i==3) K3=0;
KeyTemp = i*4;
if (K4==0) {KeyTemp=KeyTemp+1;break;}
if (K5==0) {KeyTemp=KeyTemp+2;break;}
if (K6==0) {KeyTemp=KeyTemp+3;break;}
if (K7==0) {KeyTemp=KeyTemp+4;break;}
KeyTemp=0;
};
P1=P1Led;//重写
if (KeyTemp==0)
{ KeyNo=0;
LED=1;
return;
}
LED=0;
KeyTemp=KEYTAB[KeyTemp];
if (KeyTemp==KeyNo ) return;
KeyNo=KeyTemp;
bKeyOk=1;
}
/*---24c02--*/
void Start24()
{ SDA=1;
NOP
SCL=1;//When CLK=1,SDA 1->0 =START!
NOP
SDA=0;
NOP
SCL=0;
NOP
}
void Stop24()
{
SDA=0;
NOP
SCL=1;
NOP
SDA=1;
NOP
}
unsigned char Rd24(void)
{ register unsigned char i;
SDA=1;
/* SCL=1;a7=SDA;SCL=0;
SCL=1;a6=SDA;SCL=0;
SCL=1;a5=SDA;SCL=0;
SCL=1;a4=SDA;SCL=0;
SCL=1;a3=SDA;SCL=0;
SCL=1;a2=SDA;SCL=0;
SCL=1;a1=SDA;SCL=0;
SCL=1;a0=SDA;SCL=0;*/
ICData=0;
SCL=0;
for (i=0;i<8;i++)
{ SCL=1; NOP /*实测5V下不延时也可*/
ICDataB0=SDA; NOP
SCL=0; NOP
if (i!=7) ICData=ICData<<1;
}
SDA=bAck;
SCL=1;NOP
SCL=0;NOP /*写应答位*/
return(ICData);
}
bit Wr24(unsigned char dd)
{ register unsigned char i;
/* ACC=dd;
SDA=a7;SCL=1;SCL=0;
SDA=a6;SCL=1;SCL=0;
SDA=a5;SCL=1;SCL=0;
SDA=a4;SCL=1;SCL=0;
SDA=a3;SCL=1;SCL=0;
SDA=a2;SCL=1;SCL=0;
SDA=a1;SCL=1;SCL=0;
SDA=a0;SCL=1;SCL=0; */
ICData=dd;
for (i=0;i<8;i++)
{
SDA=ICDataB7; NOP /*实测5V下不延时也可*/
SCL=1; NOP
SCL=0; NOP
ICData=ICData<<1;
}
SDA=1;SCL=1; /*等待应答0*/
for (i=0;i<100;i++)
{ if (SDA==0) break;
}
bAck=SDA;
SCL=0;
return bAck;
}
bit RdBytes24(unsigned int iAddr,uchar iLen)
{ unsigned char ddd,i;
ddd=((iAddr&0x7ff)/256)<<1;
Start24();
if (Wr24(0xa0|ddd)==1)
{bAck=0;goto RDSTOP;}//err
Wr24(iAddr);
NOP
Start24();Wr24(0xa1|ddd);
for (i=0;i<iLen;i++)
{
bAck=0;if (i==(iLen-1)) bAck=1;
IcBuf[i]=Rd24();
};
Stop24();
return bAck;
RDSTOP:
Stop24();
return bAck;
}
bit WrBytes24(unsigned int iAddr,uchar iLen)
{
unsigned char ddd,i;
ddd=((iAddr&0x7ff)/256)<<1;
Start24();
if (Wr24(0xa0|ddd)==1)
{bAck=0;goto WRSTOP;}//err
Wr24(iAddr);
for (i=0;i<iLen;i++)
{
if (Wr24(IcBuf[i])==1)
{bAck=0;goto WRSTOP;}//err
};
bAck=1;//OK
Stop24();
DelayMs(10); //wait 10ms...
return bAck;
WRSTOP:
Stop24();
return bAck;
}
void Tst24()
{ Stop24();NOP
RdBytes24(0,6);
// WrBytes24(0,6);
}
void DelayMs(uchar Ms)
{ uchar i;
do
{
for (i=0;i<100;i++) ; /*12us*100?*/
Ms--;
} while (Ms!=0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -