📄 实用的源码.c
字号:
//实用的程序
//以下是我本人使用的程序!不敢独享!---YWBS
//增加---计数器---4个字节---最大99999999
//增加T9输入法---主程序
//增加程序---拼音输入
//增加程序---字节颠倒
//增加程序---串口命令的分类
//增加程序---DEC
//为方便大家请发信到huafang@china.com!!!
//来信很多在此向大家说明我的有时间回信,所以还没有收到的朋友请来信
//说明,我一定回给您的。
//工作愉快!
//IIC
unsigned char FgTimeout;
unsigned char IicByteRead(unsigned char device,unsigned char address) /*002---读取指定器件指定地址中的数据*/
{
unsigned char bytedata; /*定义一个变量bytedata,用来存放数据*/
IicStart(); /*开始传送起始信号*/
IicSentByte(device); /*传送一字节(slave)地址*/
IicSentByte(address); /*传送一字节(address)地址*/
IicStart(); /*开始传送起始信号*/
IicSentByte(device|0x01); /*传送读取信号*/
bytedata=IicReceiveByte(); /*从slave端读取一个数据并存入变量bytedata*/
SendAcknowledge(1); /*Master端送出确认的信号等于“1”*/
IicStop(); /*传送停止信号*/
return bytedata; /*返回读出值bytedata给原调用程序*/
}
void IicByteWrite(unsigned char device,unsigned char address,unsigned char bytedata)/*003*/
{
unsigned char i;
bit ack;
FgTimeout=1;
for(i=0;i<10;i++)
{
IicStart();
ack=IicSentByte(device);
if(ack==1)
{
IicStop();
continue;
}
ack=IicSentByte(address);
if(ack==1)
{
IicStop();
continue;
}
ack=IicSentByte(bytedata);
if(ack==1)
{
IicStop();
continue;
}
IicStop();
FgTimeout=0;
if(ack==0)
break;
}
DelayX1ms(10);
}
unsigned char IicReceiveByte(void) /*004从slave端读取一个数据*/
{
unsigned char i; /*定义变量 i 和变量 bytedata */
unsigned char bytedata=0x00;
for(i=0;i<8;i++) /*由于读的时一个字节的数据所以要循环8次*/
{
ISCL=1; /*先将SCL设定为1,并等待一定的时间*/
IicWait();
bytedata<<=1; /*先将数据变量bytedata左移1位---*/
if (ISDA) bytedata |=0x01; /*---此时如果SDA=“1”则将接受到的数据加(bit0=1)1---*/
/*---否则自动清楚为0*/
ISCL=0; /*SCL恢复为0,并等待一定的时间*/
IicWait();
}
return bytedata; /*返回调用程序*/
}
unsigned char IicSentByte(unsigned char bytedata) /*005传送一个 Byte 数据到 slave */
{
unsigned char i; /*定义一个变量 i */
bit ack; /*定义一个变量 ack */
for(i=0;i<8;i++) /*循环8次*/
{
if(bytedata & 0x80)
{ /*如果bytedata和0x80作AND逻辑运算等于0x80---*/
ISDA=1;
/*---即表示位7等于1则条件成立---*/
}
else
{
ISDA=0;
/*---所以设定SDA=1,否则清除SDA=0*/
}
bytedata <<=1; /*每传送1位,则须将待传送的数据左移1位,以便继续测试下1位*/
IicWait(); /*延时等候*/
ISCL=1;
/*SCL置位*/
IicWait(); /*延时等候*/
ISCL=0;
/*SCL清零*/
IicWait(); /*延时等候---SCL作“1”---“0”的变化*/
}
ISDA=1;
/*SDA置位*/
IicWait(); /*延时等候*/
ISCL=1;
/*SCL置位*/
IicWait(); /*延时等候---SDA先设定为1,SCL也设定为1,等待确认信号的出现*/
ack=ISDA; /*读取确认信号*/
ISCL=0;
/*将SCL恢复为0电平*/
IicWait(); /*延时等候*/
return ack; /*返回确认信号到原调用程序*/
}
void iicStart(void) /*006起始信号*/
{
ISDA=1; /*数据线等于1*/
ISCL=1; /*时钟线等于1*/
IicWait(); /*延时等候*/
ISDA=0; /*数据线等于0*/
IicWait(); /*延时等候*/
ISCL=0; /*时钟线等于0*/
}
void IicStop(void) /*007停止信号*/
{
ISDA=0; /*数据线清零*/
IicWait(); /*延时等候*/
ISCL=1; /*时钟线置位*/
IicWait(); /*延时等候*/
ISDA=1; /*数据线置位*/
}
void IicWait(void) /*008*/
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void SendAcknowledge(bit ack) /*009应答信号*/
{
ISDA=ack; /*发送应答信号ack*/
ISCL=1; /*ISCL作“1”到“0”的变化*/
IicWait();
ISCL=0;
}
//HEX-BCD
char HexBcd(char Byte)
{
signed char i,j; /*定义减数i,被减数j,相减蚀锡k,余数h*/
EA=0;
i=0;
j=Byte;
while(j>=0x0a)
{
j=j-0x0a;
i=i+1;
}
switch(i) /*命令的分类*/
{
case 1 : /*主机对从机写数据。*/
Byte=0x10+j;
break;
case 2 : /*主机对从机读数据。*/
Byte=0x20+j;
break;
case 3 : /*主机要求从机自检。*/
Byte=0x30+j;
break;
case 4 :
Byte=0x40+j;
break;
case 5 :
Byte=0x50+j;
break;
case 6 :
Byte=0x60+j;
break;
case 7 :
Byte=0x70+j;
break;
case 8 :
Byte=0x80+j;
break;
case 9 :
Byte=0x90+j;
break;
default :
break;
}
return Byte;
EA=1;
}
//68 10 10 68 10 10 10 10 10 10 10 10 10 10 a0 16
if(intserialcounter>=5)
{
if(databuf[1]==0x68)
{
if(databuf[2]==databuf[3])
{
if(databuf[4]==0x68)
{
for(i=0;i<databuf[2];i++)
{
jyh=jyh+databuf[5+i];
}
if(jyh==databuf[4+databuf][3]]);
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -