?? 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 + -