📄 坐席.c
字号:
#include<ZX.h>
bit sendflag;
bit requestid;
bit scankey();
bit PTT1=0;
sbit a=P1^0;
sbit PTT=P3^5;
sbit CH451_DCLK=P1^7;
sbit CH451_DIN=P1^6;
sbit CH451_LOAD=P1^5;
uchar code table[10]={0xed,0x21,0xf4,0xf1,0x39,0xd9,0xdd,0x61,0xfd,0xf9};
uchar chmain,chlisten;
uchar recvdata[8],senddata[8];
uchar zxid=16; //the address of zx;
bit PTTTemp;
bit CanSend(void);
bit CanReceive(void);
void InitTimer0(void);
void Init_CH451(void);
void CH451_WriteCom(uint Command);
void InitSJA();
void dlynms(uint n);
void dlyns(uint n);
void dlynus(uchar n);
main()
{
int heard=0x800; //
int i=0,j=0;
chmain=1;
chlisten=1;
Init_CH451();
CH451_WriteCom(heard|table[1]);
InitSJA();
InitTimer0();
PTTTemp=PTT;
while(1)
{
DOG=~DOG;
if(scankey()|PTT1) //PTT1 is the flag of PTT change 1--PTT change 0--no change
{
CH451_WriteCom(heard|table[chmain]);
DOG=~DOG;
senddata[0]=zxid;
if(PTT)
{
senddata[1]=0;
}
else //PTT---0
{
senddata[1]=1; //Ptt is valid
}
senddata[2]=chmain;
senddata[3]=chlisten;
CanSend();
}
DOG=~DOG;
if(CanReceive())
{
if(recvdata[0]==17)
{
if(((recvdata[1]>>(chmain))&0x01))
{
CH451_WriteCom(0x601); //led flash
}
else
{
CH451_WriteCom(0x600); //led don't flash
}
}
else if(recvdata[0]==zxid)
{
;
}
else
{
;
}
}
DOG=~DOG;
}
}
void timer0() interrupt 1 using 1
{
TH0=0x4c;
TL0=0xf6;
if(PTT!=PTTTemp)
{
PTT1=0; //PTT change
PTTTemp=PTT;
}
else
{
PTT1=1;
PTTTemp=PTT;
}
}
void InitTimer0(void)
{
TMOD=0x01;
TH0=0x4c;
TL0=0xf6;
EA=1;
ET0=1;
TR0=1;
}
bit CanReceive(void)
{
uchar SRTemp;
SRTemp=SR;
DOG=~DOG;
if(SRTemp&0x80) //bus off
{
InitSJA();
dlynus(3000);
//return 0;
}
if(SRTemp&0x40) //error
{
dlynus(20);
SRTemp=SR;
}
if(SRTemp&0x20) //is transmitting
{
dlynus(30);
SRTemp=SR;
}
if(SRTemp&0x10) //is recieving
{
dlynus(30);
SRTemp=SR;
}
if(SRTemp&0x02) //overrun
{
CMR|=0xc;
return 0;
}
if(SRTemp&0x01) //recieve buffer has data;
{
recvdata[0]=RXSD1;
recvdata[1]=RXSD2;
recvdata[2]=RXSD3;
recvdata[3]=RXSD4;
recvdata[4]=RXSD5;
recvdata[5]=RXSD6;
recvdata[6]=RXSD7;
recvdata[7]=RXSD8;
CMR|=0xc;
return 1;
}
return 0;
}
bit CanSend(void)
{
uchar SRTemp;
SRTemp=SR;
if(SRTemp&0x80) //bus off
{
InitSJA();
dlynus(3000);
return 0;
}
if(SRTemp&0x40) //error
{
dlynus(20);
SRTemp=SR;
}
if(SRTemp&0x20) //is transmitting
{
dlynus(30);
SRTemp=SR;
}
if(SRTemp&0x10) //is recieving
{
dlynus(30);
SRTemp=SR;
}
if(SRTemp&0x02) //overrun
{
CMR|=0xc;
return 0;
}
TXIF =0x08;
TXID1=0xa5;
TXID2=0x20;
TXSD1=senddata[0]; //requestid
TXSD2=senddata[1]; //PTT
TXSD3=senddata[2]; //main ch
TXSD4=senddata[3]; //listen ch
TXSD5=senddata[4]; //the allowed address is stored;
TXSD6=senddata[5];
TXSD7=senddata[6];
TXSD8=senddata[7];
CMR|=0x01; //send request;
DOG=~DOG;
return 1;
}
void Init_CH451(void)
{
CH451_DIN=0;
dlynus(2);
CH451_DIN=1;
CH451_WriteCom(0x201);//reset ch451;
CH451_WriteCom(0x401);//set system parameter
CH451_WriteCom(0x500);//set display patameter .7--mode
}
void CH451_WriteCom(uint Command)
{
uchar i;
CH451_LOAD=0;
for(i=0;i<12;i++)
{
CH451_DIN=Command&1;
CH451_DCLK=0;
Command=Command>>1;
dlynus(2);
CH451_DCLK=1;
}
dlynus(2);
CH451_LOAD=1;
}
void InitSJA()
{
EX0=0;
MOD=0x01; //复位模式
/*
.4 0:wake up
.3 0:dual filter
.2 0:normal ,not self test
.1 0:normal ,not only listen
.0 1:reset
*/
dlynus(5);
CDR=0xc8;
dlynus(5);
/*
.7 1:PeliCan
.6 1:only RX0
.5 0:not receive interrupt
.3 1:close clock out
.2 000:clkout frequecy
*/
IER=0x00;
dlynus(5);
/*
.7 1:bus error
.6 0:arbitration
.5 0:error passive
.4 0:wake up
.3 1:data over run
.2 1:error warning
.1 1:transimit
.0 1:receive
*/
AMR0=0xff;
dlynus(5);
AMR1=0xff;
dlynus(5);
AMR2=0xff;
dlynus(5);
AMR3=0xff;
dlynus(5);
ACR0=0;
dlynus(5);
ACR1=0;
dlynus(5);
ACR2=0;
dlynus(5);
ACR3=0;
dlynus(5);
BTR0=0x43;
dlynus(5);
BTR1=0x1c; /*set baund rate 50K*/
dlynus(5);
OCR=0xaa; /* out control*/
dlynus(5);
RBSA=0; /*RX buffer start address 0*/
dlynus(5);
TXERR=0; /*clear send buffer error*/
dlynus(5);
RXERR=0;
dlynus(5);
ECC=0; /*clear err reg*/
dlynus(5);
// CMR|=0xe0;
// MOD=0; /*dual filter,work*/
dlynus(5);
MOD=0;
dlynus(50);
}
bit scankey()
{
if(!key1)
{
dlynms(300);
if(!key1)
{
chmain++;
if(chmain>8)
chmain=1;
return 1;
}
else
return 0;
}
else if(!key2)
{
dlynms(300);
if(!key2)
{
chmain--;
if(chmain<1)
chmain=8;
return 1;
}
else
return 0;
}
else if(!key3)
{
dlynms(300);
if(!key3)
{
chlisten++;
if(chlisten>8)
chlisten=1;
return 1;
}
else
return 0;
}
else if(!key4)
{
dlynms(300);
if(!key4)
{
chlisten--;
if(chlisten<1)
chlisten=8;
return 1;
}
else
return 0;
}
else
return 0;
}
void dlynms(uint n)
{
uchar i;
for(;n>0;n--)
{
DOG=~DOG;
for(i=0;i<0x7c;i++);
}
}
void dlynus(uchar n)
{
for(;n>0;n--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -