📄 master._c
字号:
/*
文件名:master.c
两个Mega8间的TWI通信实验主模式单片机程序
内部 8MHz振荡器
芯艺 2004-09-02 ---------- 2004-09-03
*/
#include <iom8v.h>
#include"delay.h"
#define uint unsigned int
#define uchar unsigned char
#define uchar unsigned char
#define TW_STATUS (TWSR&0xf8)
#define TW_WRITE 0xa0
#define TW_READ 0xa1
#define WAITPRINTDEBUG Delay_nms(100) //为从模式单片机打印调试信息而延时
#define KEY 0X04
#define FREQ 8
#define TWI_ADDRESS 0X32
/*************主模式TWI操作部分*************开始**************/
//总线上起动停止条件
void twi_stop(void)
{
TWCR =(1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
}
//总线上起动开始条件
uchar twi_start(void)
{
uchar trycount=0;
TWCR =(1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0) ;
return TW_STATUS;
}
//写一字节
uchar twi_writebyte(uchar c)
{
TWDR = c;
TWCR = (1<<TWINT) | (1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
return TW_STATUS;
}
//读一字节 ack: true时发ACK,false时发NACK
uchar twi_readbyte(uchar *c ,uchar ack)
{
uchar tmp=(1<<TWINT)|(1<<TWEN);
if(ack) //可以选择是否发送 ACK
tmp|=(1<<TWEA);
TWCR=tmp;
while ((TWCR & (1<<TWINT)) == 0) ;
*c=TWDR;
return TW_STATUS;
}
/*************主模式IIC操作部分*************结束**************/
//检测按键
uchar WaitKeyDown(void)
{
uchar key;
while(1)
{
key=PINC & 0x04;
if( key!=0x04)
{
Delay_nms(20);
key=PINC & 0x04;
if(key!=0x04)
break;
}
Delay_nms(1);
}
while((PINC & 0x04)!=0x04)
Delay_nms(10); //等待按键弹起
return key;
}
void main(void)
{
uchar i;
//使能SCL、SDA引脚内部上拉电阻
DDRC=0;
PORTC=0X3f;
//
DDRD=0;
PORTD=0;
TWBR=73;//波特率
while(1)
{
//WaitKeyDown(); //等待按键
// Delay_nms(1000);
twi_start();
WAITPRINTDEBUG;
twi_writebyte(TWI_ADDRESS|TW_WRITE);
WAITPRINTDEBUG; //延时100MS 宏
for(i=0;i<10;i++)
{
twi_writebyte(i);
WAITPRINTDEBUG; //延时100MS
}
twi_stop(); //一次发送10 个数
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -