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