您的位置 首页 编程

AVR单片机IIC试验

芯片ATMEGA16晶振8mhzincludeiom16h>includeintrinsicsh>defineucharunsignedchardefineuintunsignedint-

//芯片ATMEGA16 晶振8mhz

#include
#include
#define uchar unsigned char
#define uint unsigned int
//—————————–
uchar str1[]={“I%&&&&&% TEST”};
//—————————
void delay(uint k) //延时函数
{
uint i,j;
for(i=0;i
for(j=0;j<1140;j++);
}
#include “1602.h” //1602库函数
//——-按键输入点设置——-
#define s1 (PIND&0x10) //变量值添加键
#define s2 (PIND&0x20) //变量值削减键
#define s3 (PIND&0x40) //存储键
#define s4 (PIND&0x80) //读取键
//——————-
#define TWINT 7 //中止标志
#define TWEN 2 //中止时能
#define TWSTA 5 //发动状况位
#define TWSTO 4 //中止状况位
//—–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 //从机数据非应对
//————————-
#define start() (TWCR=(1<
#define stop() (TWCR=(1<
#define wait() {while(!(TWCR&(1<
#define testack() (TWSR&0xf8) //TWI状况检测,屏蔽预分频位
#define setack() (TWCR|(1<
#define setnoack() (TWCR&=~(1<
#define twi() (TWCR=(1<
#define writebit(x) {TWDR=(x);TWCR=(1<
//——I/0口设置————
void portinit()
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x00;
}
//———–读数据函数———-
uchar iicread(uchar address)
{
uchar temp;
start();
wait();
if(testack()!=START) return 0;
writebit(0xa0);
wait();
if(testack()!=MT_SLA_ACK) return 0;
writebit(address);
wait();
if(testack()!=MT_DATA_ACK) return 0;
start();
wait();
if(testack()!=RE_START) return 0;
writebit(0xa1);
wait();
if(testack()!=MR_SLA_ACK) return 0;
twi();
wait();
if(testack()!=MR_DATA_NOACK) return 0;
temp=TWDR;
stop();
return temp;
}
//—————写数据函数—————-
uchar iicwrite(uchar address,uchar data)
{
start();
wait();
if(testack()!=START) return 1;
writebit(0xa0);
wait();
if(testack()!=MT_SLA_ACK) return 1;
writebit(address);
wait();
if(testack()!=MT_DATA_ACK) return 1;
writebit(data);
wait();
if(testack()!=MT_DATA_ACK) return 1;
stop();
delay(10);
return 0;
}
void main()
{
uchar val=0; //数据值变量
portinit();
delay(200);
init();
delay(200);
display(2,0,str1);
delay(200);
while(1)
{
displayz(5,1,val/10+0x30);
displayz(6,1,val%10+0x30);
delay(10);
if(s1==0) //值添加键
{
delay(100); //软件延时100ms避免按键颤动
if(s1==0)
{
val++;
if(val>30)val=0;
}
}
if(s2==0) //值削减键
{
delay(100);
if(s2==0)
{
val–;
if(val<1)val=40;
}
}
if(s3==0) //值存储键
{
delay(100);
if(s3==0)
{
iicwrite(70,val);
}
}
if(s4==0) //值读取键
{
delay(100);
if(s4==0)
{
val=iicread(70);
}
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/318366.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部