📄 max5478.c
字号:
/***************MAX5478数字电位器-I2C**********************/
#include <iom16v.h> //包含型号头文件
#include <macros.h> //包含"位"操作头文件
#include <stdio.h> //标准输入输出头文件
/******************数据类型宏定义******************/
#define TRUE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
//******************按键常量******************/
#define KEY_DDR DDRD //按键方向定义
#define KEY_PORTO PORTD //按键端口输出定义
#define KEY_PORTI PIND //按键端口输入定义
#define OUT 0xFF //输出常量
#define IN 0xF0 //输入常量
/*******************************************
函数名称: Delayms
功 能: 延时指定毫秒(12M晶振)
参 数: MS--延时的毫秒数
返回值 : 无
/********************************************/
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
//************************************************
#include "Skey.C" //包含键盘扫描函数
/******************TWI(IIC)常量******************/
#define START 0x08 //START信号发送完毕状态
#define MT_SLA_ACK 0x18 //从器件地址发送,返回ACK
#define MT_SLA_NOACK 0x20 //从器件地址发送,但是返回NOACK
#define MT_DATA_ACK 0x28 //数据已发送,返回ACK
#define MT_DATA_NOACK 0x30 //数据已发送,返回NOACK
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //产生START信号
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号
#define Wait() while(!(TWCR&(1<<TWINT))) //等待当前操作完成
#define TestACK() (TWSR&0xF8) //取出状态码
#define SetACK() (TWCR|=(1<<TWEA)) //产生ACK
#define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);} //发送一个字节(twi_d为写入的数据)
//************************************************************************************************************
void Twi_init(void)
{
TWBR= 0x20; //设置波特率
TWSR= 0x00; //设置预分频比
TWCR= 0x44; //使能应答,使能TWI
}
/*******************************************
函数名称: MAX5478_writeB
功 能: 向MAX5478写入电阻值数据
参 数: devadd--器件地址
cmd--控制命令
rdata--电阻数据
返回值 : success--数据成功标志(为TRUE时写入成功,为FALSE时失败)
/********************************************/
uchar MAX5478_writeB(uchar devadd,uchar cmd,uchar rdata)
{
uchar success=FALSE; //默认返回是写入失败
Start(); //产生START信号
Wait(); //等待START信号发送完毕
if(TestACK()!=START) //检查是否是START信号发送完毕状态
{
success=FALSE; //如果不是,则返回写入失败
return success;
}
Writebyte(devadd); //发送从器件地址
Wait(); //等待发送完毕
if(TestACK()!=MT_SLA_ACK)//检查是否是从器件地址发送完毕状态
{
success=FALSE; //如果不是,则返回写入失败
return success;
}
Writebyte(cmd); //发送MAX5478的命令字节(具体含义请参看MAX5478的数据手册)
Wait(); //等待发送完毕
if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
{
success=FALSE; //如果不是,则返回写入失败
return success;
}
Writebyte(rdata); //发送电阻值数据
Wait(); //等待发送完毕
if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
{
success=FALSE; //如果不是,则返回写入失败
return success;
}
Stop(); //对MAX5478的一次操作完毕,发送STOP信号
Delayms(10); //等待发送完毕
success=TRUE; //本次写入成功
return success; //返回写入成功状态
}
/*******************************************
函数名称: main
功 能: 按键更新数字电位器的阻值(电阻是A和W端的阻值,默认B端是开路的)
参 数: 无
返回值 : 无
/********************************************/
void main(void)
{
uchar i,data=255; //初始电阻是满量程
Twi_init( ); //初始化TWI
MAX5478_writeB(0x50,0x13,data); //设置初始电阻
while(1)
{
if(Skey_press()) //是否有按键按下
{
i=Skey_scan(); //扫描并反回翻译后的键码
switch(i)
{
case 0: //S1键按下,减少电阻的数字量(MAX5478的特性是减少电阻的数字量,阻值增加)
data-=5;
break;
case 1: //S2键按下,增加电阻的数字量
data+=5;
break;
case 2: //S3键按下,使电阻的数字量为零(阻值满量程)
data=0;
break;
case 3: //S3键按下,使电阻的数字量为满(阻值清零,只剩下接触电阻)
data=255;
break;
}
MAX5478_writeB(0x50,0x13,data); //更新电阻
Delayms(5);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -