📄 366.c
字号:
void START24C02(void) /////启动24c02
{
scl=0;sda=1; //用“读”来开始准备启动24C02的工作,把数据线置高,为启动的“下跳”准备
scl=1;sda=0; //启动
scl=0; //为“写”周期做准备,即准备控制线上跳。
}
void STOP24C02(void) /////停止24C02
{
sda=0;scl=1;
sda=1;scl=0;
}
bit Check24C02() //应答位检查
{
bit Check=0;
sda=1;scl=1;
Check=sda; //接收应答信号
scl=0;
return(Check);
}
void MACK(void) //发送应答
{
sda=0;scl=1;scl=0;sda=1;
}
void MNACK(void) //发送非应答
{
sda=1;scl=1;scl=0;sda=0;
}
void WriteOneByte(unsigned char dd) ///写一个字节,已经完善,不再修改-----------------------------
{
ACC=dd;
sda=aa7;scl=1;scl=0; // 数据在scl=0时才能改变
sda=aa6;scl=1;scl=0;
sda=aa5;scl=1;scl=0;
sda=aa4;scl=1;scl=0;
sda=aa3;scl=1;scl=0;
sda=aa2;scl=1;scl=0;
sda=aa1;scl=1;scl=0;
sda=aa0;_nop_();scl=1;scl=0;
sda=0; //令总线处于备用状态
}
unsigned char ReadOneByte(void) /////读一个字节-------------------------------
{
sda=1;
scl=1;aa7=sda;scl=0;sda=1;
scl=1;aa6=sda;scl=0;sda=1;
scl=1;aa5=sda;scl=0;sda=1;
scl=1;aa4=sda;scl=0;sda=1;
scl=1;aa3=sda;scl=0;sda=1;
scl=1;aa2=sda;scl=0;sda=1;
scl=1;aa1=sda;scl=0;sda=1;
scl=1;aa0=sda;scl=0;
return(ACC);
}
//---------------------------------------写整个数组到24c02----------------------------------//
void Write24C02_Array(Number NUMBERW)
/////入口参数为待传送数组
{
unsigned char NUMSERIAL;
unsigned char NUMBYT=NUMBERW[1]+1; //取组成员个数
unsigned char i;
bit Check_bit;
NUMSERIAL=NUMBERW[0]; //取组的序号
switch(NUMSERIAL) //设定数组存放起始位置
{
case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长24位
case 2: NUMSERIAL=124;break; //数组2的起始位置=21 长13位
case 3: NUMSERIAL=144;break; //数组3的起始位置=34 长13位
case 4: NUMSERIAL=164;break; //数组4的起始位置=47 长13位
case 5: NUMSERIAL=184;break; //数组5的起始位置=60 长13位
case 6: NUMSERIAL=204;break; //数组6的起始位置=73 长13位
case 7: NUMSERIAL=224;break; //数组7的起始位置=86 长5 位
case 8: NUMSERIAL=230;break; //数组8的起始位置=90 长2位
case 9: NUMSERIAL=233;break; //数组9的起始位置=91 长3位
}
for(i=1;i<=NUMBYT;i++)
{
startWrite: START24C02(); //START24C02()执行完后,scl=0,sda=0
WriteOneByte(160); //寻址字节为0A0H,“写”;执行完后,scl=0,sda=0
Check_bit=Check24C02(); //校验应答位;执行完后,scl=0,sda不管
if(Check_bit==1) //如果出错,从新启动总线
goto startWrite;
WriteOneByte(NUMSERIAL); //确定片内寻址地址
Check_bit=Check24C02(); //校验应答位
if(Check_bit==1) //如果出错,从新启动总线
goto startWrite;
WriteOneByte(NUMBERW[i]); //原数组把组的序号放在“0”位置,组成员个数放在“1”位置
Check_bit=Check24C02();
if(Check_bit==1) //如果出错,从新启动总线
goto startWrite;
STOP24C02(); //执行完后,scl=0,sda=1
NUMSERIAL=NUMSERIAL+1;
}
}//---------------------------------------写整个数组到24c02结束----------------------------------//
//-----------------------------------读内容到整个结构,数组开始------------------------------------------//
struct ReadArray Read24C02_Array(unsigned char NUMSERIAL)
{
bit Check_bit;
unsigned char i;
struct ReadArray READARRAY;
switch(NUMSERIAL) //设定数组存放起始位置
{
case 1: NUMSERIAL=102; break; //数组1的起始位置=0 长20位
case 2: NUMSERIAL=124;break; //数组2的起始位置=20 长13位
case 3: NUMSERIAL=144;break; //数组3的起始位置=33 长13位
case 4: NUMSERIAL=164;break; //数组4的起始位置=46 长13位
case 5: NUMSERIAL=184;break; //数组5的起始位置=59 长13位
case 6: NUMSERIAL=204;break; //数组6的起始位置=72 长13位
case 7: NUMSERIAL=224;break; //数组7的起始位置=85 长5 位
case 8: NUMSERIAL=230;break; //数组8的起始位置=89 长2位
case 9: NUMSERIAL=233;break; //数组9的起始位置=90 长3位
}
startRead: START24C02();
WriteOneByte(160); //寻址字节为0A0H,“写”
Check_bit=Check24C02(); //校验应答位
if(Check_bit==1) //如果出错,从新启动总线
goto startRead;
WriteOneByte(NUMSERIAL); //确定片内寻址地址
Check_bit=Check24C02(); //校验应答位
if(Check_bit==1) //如果出错,从新启动总线
goto startRead;
STOP24C02(); // 执行完后,scl=0,sda=1
startReadD: START24C02();
WriteOneByte(161); //寻址字节为0A1H,“读”
Check_bit=Check24C02(); //校验应答位
if(Check_bit==1) //如果出错,从新启动总线
goto startReadD;
READARRAY.Number24[1]=ReadOneByte(); //读出本组有多少个成员,[0]位预留,组成员个数放在[1]位置
//执行“读”完后,scl=0,sda任意
if(READARRAY.Number24[1]==0)
MNACK();
else
{
MACK(); //发送校验
for(i=0;i<READARRAY.Number24[1];i++)
{
READARRAY.Number24[i+2]=ReadOneByte();
if(i<READARRAY.Number24[1]-1)
MACK();
else MNACK();
}
}
STOP24C02();
return(READARRAY);
}//---------------------------读内容到整个结构,数组结束------------------------------------------//
//------------------------------处理在一次下位机发送报警信息来过程中的读取 ,存储----------------------------------//
void READ_MESSAGE()
{
unsigned char Number_Note=0; //记录是第几个“下位机输入信号”
unsigned char Number_Key; //存储“电话机输入键值”的中间变量
Number NUMBER; //生成记录一次摘机过程的数组
JISHU=5000; //配合晶振,等待1秒
ReadStatus: MT8880_StatusRegister_READ();
if(MT8880_D2==1) //是否有键值生成
{
MT8880_CP2=0; //停动8880总线
MT8880_CS=1; //停动8880总线
MT8880_DataRegister_READ(); //读入的一个值出现在MT8880_D0-D3
if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1) //输入“1”
{Number_Key=1; }
if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0) //输入“2”
{Number_Key=2; }
if(MT8880_D3==0 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1) //输入“3”
{Number_Key=3; }
if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0) //输入“4”
{Number_Key=4; }
if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==1) //输入“5”
{Number_Key=5; }
if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==0) //输入“6”
{Number_Key=6; }
if(MT8880_D3==0 & MT8880_D2==1 & MT8880_D1==1 & MT8880_D0==1) //输入“7”
{Number_Key=7;}
if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==0) //输入“8”
{Number_Key=8;}
if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==0 & MT8880_D0==1) //输入“9”
{Number_Key=9; }
if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==0) //输入“0”
{Number_Key=0; }
if(MT8880_D3==1 & MT8880_D2==0 & MT8880_D1==1 & MT8880_D0==1) //输入“*”
{Number_Key=11;}
if(MT8880_D3==1 & MT8880_D2==1 & MT8880_D1==0 & MT8880_D0==0) //输入“#”
{Number_Key=12;}
MT8880_CP2=0; //停动8880总线
MT8880_CS=1; //停动8880总线
if(Number_Note>=7) // 已经处理了6次数据
{
J_LineToPhone=1; //模拟挂机
_nop_(); _nop_(); //指令冗余
// NUMBER[4]=0; NUMBER[5]=0; NUMBER[3]=0;
goto SERIAL; //发送给上位机
_nop_(); _nop_(); //指令冗余
return; //软件陷阱
_nop_(); _nop_(); //指令冗余
return; //软件陷阱
}
else
{
if(Number_Note==0)
{Number_Note=Number_Note+1;JISHU=5000;goto ReadStatus;} //丢弃误读的366自己发的握手信号
NUMBER[Number_Note-1]=Number_Key; //把键值写入数组
Number_Note=Number_Note+1;
JISHU=5000;
_nop_(); _nop_(); //指令冗余
goto ReadStatus;
_nop_(); _nop_(); //指令冗余
J_LineToPhone=1; //模拟挂机
return; //软件陷阱
}
}
else //没有生成键值时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -