📄 h_iic._c
字号:
#include <mega128.h>
//TWI状态定义
//MT 主方式传输 MR 主方式接收
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
//hardware IIC
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWEN 2
//常用TWI操作(主模式写和主模式读)
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait() {while(!(TWCR&(1<<TWINT)));}
#define TestAck() (TWSR&0xf8)
#define SetAck() (TWCR|=(1<<TWEA))
#define SetNoAck() (TWCR&=~(1<<TWEA))
#define TWI() (TWCR=(1<<TWINT)|(1<<TWEN))
#define TWE() (TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
#define zlg7290 0x70
/******************************************
I2C总线写字符串
返回0:写成功
返回非0:写失败
*******************************************/
unsigned char ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{ unsigned char i;
#asm("cli")
Start();//I2C启动
Wait();
if(TestAck()!=START){Stop(); return 1;} //ACK
Write8Bit(sla);//写I2C从器件地址和写方式
Wait();
if(TestAck()!=MT_SLA_ACK){Stop(); return 1;} //ACK
Write8Bit(suba);//写地址
for(i=0;i<no;i++)
{ Wait();
if(TestAck()!=MT_DATA_ACK){Stop(); return 1;}//ACK
Write8Bit(*s);//写数据
s++;
}
Wait();
if(TestAck()!=MT_DATA_ACK){Stop(); return 1;} //ACK
Stop();//I2C停止
#asm("sei")
return 0;
}
/******************************************
I2C总线读字符串
如果读失败也返回0,正确返回1;
*******************************************/
unsigned char IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
#asm("cli")
Start();//I2C启动
Wait();
if (TestAck()!=START) {Stop(); return 0;}//ACK
Write8Bit(sla);//写I2C从器件地址和写方式
Wait();
if (TestAck()!=MT_SLA_ACK) {Stop(); return 0;}//ACK
Write8Bit(suba);//写地址
Wait();
if (TestAck()!=MT_DATA_ACK) {Stop(); return 0;}
Start();//I2C重新启动
Wait();
if (TestAck()!=RE_START) {Stop(); return 0;}
Write8Bit(sla+1);//写I2C从器件地址和读方式
Wait();
if(TestAck()!=MR_SLA_ACK) {Stop(); return 0;}//ACK
for(i=0;i<no-1;i++)
{ TWE();//启动主I2C读方式
Wait();
if(TestAck()!=MR_DATA_ACK) {Stop(); return 0;};//ACK
*s=TWDR;//读取I2C接收数据
s++;
}
TWI();//启动主I2C读方式
Wait();
if(TestAck()!=MR_DATA_NOACK) {Stop(); return 0;}//ACK
*s=TWDR;//读取I2C接收数据
Stop();//I2C停止
#asm("sei")
return 1;
}
unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)
{
if(SubAdd>0x17)
return 0;
ISendStr(zlg7290,SubAdd,&Data,1);
// delay_ms(10);
return 1;
}
//向zlg7290命令缓冲区发送命令(2个字节)
unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
{
unsigned char Data[2];
Data[0]=Data1;
Data[1]=Data2;
ISendStr(zlg7290,0x07,Data,2);
// delay_ms(10);
return 1;
}
//向zlg7290的显示缓冲区发送数据
void ZLG7290_SendBuf(unsigned char *display_buf,unsigned char num)
{
unsigned char i;
for(i=0;i<num;i++)
{
ZLG7290_SendCmd(0x60+i,*display_buf);
display_buf++;
}
}
//zlg7290的键值
unsigned char ZLG7290_GetKey()
{ unsigned char rece=0;
if( IRcvStr(zlg7290,1,&rece,1)==0 ) return (0);
// delay_ms(10);
return rece;
}
//向ZLG7290发送字符串
void disstring(char *tmp)
{
unsigned char num;
unsigned char i;
unsigned char chr,chr1,chr2;
signed char at;
num=strlen(tmp);
at=strpos(tmp,'.');
if ((at<10) & (at>1)) num=num-1;
if (num>=8) num=8;
for (i=0;i<num;i++)
{
i2cstart();
i2cwrite(0x70);
i2cwrite(0x07);
chr=0x68-i;
i2cwrite(chr);
chr=*tmp;
switch (chr)
{
case '0' : chr1=0; break;
case '1' : chr1=1; break;
case '2' : chr1=2; break;
case '3' : chr1=3; break;
case '4' : chr1=4; break;
case '5' : chr1=5; break;
case '6' : chr1=6; break;
case '7' : chr1=7; break;
case '8' : chr1=8; break;
case '9' : chr1=9; break;
case ' ' : chr1=31; break;
case 'A' : chr1=10; break;
case 'b' : chr1=11; break;
case 'C' : chr1=12; break;
case 'd' : chr1=13; break;
case 'E' : chr1=14; break;
case 'F' : chr1=15; break;
case 'G' : chr1=16; break;
case 'H' : chr1=17; break;
case 'i' : chr1=18; break;
case 'J' : chr1=19; break;
case 'L' : chr1=20; break;
case 'O' : chr1=21; break;
case 'P' : chr1=22; break;
case 'q' : chr1=23; break;
case 'r' : chr1=24; break;
case 't' : chr1=25; break;
case 'U' : chr1=26; break;
case 'y' : chr1=27; break;
case 'c' : chr1=28; break;
case 'h' : chr1=29; break;
case 'T' : chr1=30; break;
case '.' : chr1=128; break;
default : chr1=31;
}
tmp++;
chr2=*tmp;
if (chr2=='.')
{
chr1=chr1+128;
tmp++;
}
i2cwrite(chr1);
i2cstop();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -