您的位置 首页 产品

AVR M16试验之八 AT24C02测验

***********************************************************************文件名称:mainc*程序作者:kidcao1987*程序

/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版别: V1.0
* 功用描绘: 装上LCD1602,在其上显现如下:
“This an IIC demo
www.CEPARK.com
1st data : 0x”
2nd data : 0x”
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:http://bbs.cepark.com
**********************************************************************/
#include
#include

#define SETLCD1602RS PORTA |= (1<#define CLRLCD1602RS PORTA &= ~(1<#define SETLCD1602RW PORTA |= (1<#define CLRLCD1602RW PORTA &= ~(1<#define SETLCD1602EN PORTA |= (1<#define CLRLCD1602EN PORTA &= ~(1<ICDEVICEADDR 0xa0 //器材地址

//主机发送形式时的状况码,芯片手册P174
#define TW_START 0x08 //START已宣布
#define TW_REP_START 0x10 //重复START已宣布
#define TW_MT_SLA_ACK 0x18 //SLA+W已宣布并收到ACK信号
#define TW_MT_SLA_NACK 0x20 //SLA+W已宣布并收到NACK信号
#define TW_MT_DATA_ACK 0x28 //数据已宣布并收到ACK信号
#define TW_MT_DATA_NACK 0x30 //数据已宣布并收到NACK信号
#define TW_MT_ARB_LOST 0x38 //写字节或许数据的裁定失利
//主机接纳形式时的状况码,芯片手册P176
#define TW_MR_ARB_LOST 0x38 //丢掉总线操控权或许未收到应对信号
#define TW_MR_SLA_ACK 0x40 //读指令已宣布并收到ACK信号
#define TW_MR_SLA_NACK 0x48 //读指令已宣布并收到NACK信号
#define TW_MR_DATA_ACK 0x50 //数据已收到而且回来ACK信号
#define TW_MR_DATA_NACK 0x58 //数据已收到而且回来NACK信号

unsigned char const ucString1[]={“This an IIC demo”};
unsigned char const ucString2[]={“www.CEPARK.com”};
unsigned char const ucString3[]={“1st data : 0x”};
unsigned char const ucString4[]={“2nd data : 0x”};

void LCD1602BusyCheck(void); //忙检测
void LCD1602WriteOperation(unsigned char,unsigned char); //写操作
void LCD1602Init(void); //初始化函数
void LCD1602MoveToPosition(unsigned char,unsigned char); //定位到拟定方位
void LCD1602PrintString(unsigned char const * str); //输出一串字符

void IICInit(void); //初始化
void IICStart(void); //起始信号
void IICStop(void); //中止信号
void IICWriteOneChar(unsigned char); //写一个字节
unsigned char IICReadOneChar(unsigned char); //读一个字节,ack or nack
void IICWriteOneCharOnAddr(unsigned char,unsigned char); //在指定方位写一个字节
unsigned char IICReadOneCharFromAddr(unsigned char); //从指定方位读一个字节

int main(void)
{
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0xFF;

PORTC = 0xFF;
DDRC = 0xFF;

LCD1602Init();
IICInit();
_delay_ms(2);

LCD1602MoveToPosition(0,0);
LCD1602PrintString(ucString1);
LCD1602MoveToPosition(1,0);
LCD1602PrintString(ucString2);
_delay_ms(2000);
//while(1);
IICWriteOneCharOnAddr(0x43,0x10); //在0x10,0x11两个测验方位写入两个数据,将其显现
IICWriteOneCharOnAddr(0x21,0x11);

LCD1602Init();
while(1)
{
LCD1602WriteOperation(0x01,0);
_delay_ms(2);
LCD1602MoveToPosition(0,0);
LCD1602PrintString(ucString3);

LCD1602WriteOperation(IICReadOneCharFromAddr(0x10)/16 + 48,1);
LCD1602WriteOperation(IICReadOneCharFromAddr(0x10)%16 + 48,1);

LCD1602MoveToPosition(1,0);
LCD1602PrintString(ucString4);

LCD1602WriteOperation(IICReadOneCharFromAddr(0x11)/16 + 48,1);
LCD1602WriteOperation(IICReadOneCharFromAddr(0x11)%16 + 48,1);
while(1);
}
}

//初始化
void IICInit()
{
TWSR = 0x00; //预分频系数为1
TWBR = 0x10; //波特率操控寄存器,波特率为153.6KHZ
TWAR = 0x00; //被控器地址寄存器,能够不设置,做为从机时有必要设置
TWCR = (1 << TWEA) | (1 << TWEN); //TWEN使能TWI功用,PC0、PC1变成SCL、SDA引脚
//TWEA应对使能位
}

//起始信号
void IICStart(void)
{
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); //清零中止标志位,请求成为主机,发送开端信号
while(!(TWCR & (1 << TWINT))); //检测中止标志,为1标明完结发送开端信号
//TWCR &= ~(1<}

//中止信号
void IICStop(void)
{
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); //清零中止标志位,发送中止信号
}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部