?? hnr_s4.c
字號:
//I2C存儲器AT24C64讀寫實驗
//需要將多功能模塊電路板接到P1口上
//將數碼管電路板接到J11插座上,注意引腳位置
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
//共陽數碼管的表格為:
//本表格通過LEDSET軟件可以快速得到
const uchar Seg[]=
{
0X84, // 0
0XBD, // 1
0XE0, // 2
0XB0, // 3
0X99, // 4
0X92, // 5
0X82, // 6
0XBC, // 7
0X80, // 8
0X90, // 9
0X88, // A
0X83, // b
0XC6, // C
0XA1, // d
0XC2, // E
0XCA // F
};
//SDA
#define SDA_OUT P1DIR|=BIT7
#define SDA_IN P1DIR&=~BIT7
#define SDA_HIGH P1OUT|=BIT7
#define SDA_LOW P1OUT&=~BIT7
#define SDA_DATA P1IN&BIT7
//SCL
#define SCL_OUT P1DIR|=BIT6
#define SCL_HIGH P1OUT|=BIT6
#define SCL_LOW P1OUT&=~BIT6
//SWP
#define SWP_OUT P1DIR|=BIT5
#define SWP_HIGH P1OUT|=BIT5
#define SWP_LOW P1OUT&=~BIT5
//10us級延時子程序
void Delayus(uint us)
{
while(us--)
{
for(uint i=0;i<5;i++);
}
}
//I2C起始條件
void I2cStart()
{
SDA_OUT;
SDA_HIGH;
Delayus(1);
SCL_OUT;
SCL_HIGH;
Delayus(1);
SDA_LOW;
Delayus(1);
SCL_LOW;//鉗住I2C總線,準備發送或接收數據
}
//I2C停止條件
void I2cStop()
{
SCL_OUT;
SCL_LOW;
Delayus(1);
SDA_OUT;
SDA_LOW;
Delayus(1);
SCL_HIGH;
Delayus(1);
SDA_HIGH;
Delayus(1);
}
//發ACK應答
void I2cAck()
{
SDA_OUT;
SDA_LOW;
Delayus(1);
SCL_OUT;
SCL_HIGH;
Delayus(1);
SCL_LOW;
Delayus(1);
}
//發NAK應答
void I2cNAk()
{
SDA_OUT;
SDA_HIGH;
Delayus(1);
SCL_OUT;
SCL_HIGH;
Delayus(1);
SCL_LOW;
Delayus(1);
}
//等待應答
int WaitAck()
{
uchar Time=255;
SDA_OUT;
SDA_HIGH;
Delayus(1);
SDA_IN;
SCL_OUT;
SCL_HIGH;
Delayus(1);
while(SDA_DATA)
{
Time--;
if(Time==0)
{
I2cStop();
return (0);
}
}
SCL_LOW;
Delayus(1);
return (1);
}
//I2C寫一字節數據
void I2cWriteByte(uchar Data){
uchar i;
SDA_OUT;
SCL_OUT;
for(i=0;i<8;i++)
{
SCL_LOW;
Delayus(1);
if(Data&0x80) SDA_HIGH;
else SDA_LOW;
Data<<=1;
SCL_HIGH;
Delayus(1);
Delayus(1);
}
SCL_LOW;
}
//I2C讀一字節數據
uchar I2cReadByte()
{
uchar i,TmpData=0;
SDA_IN;
SCL_OUT;
// SDA_HIGH;
for(i=0;i<8;i++)
{
SCL_LOW;
Delayus(1);
SCL_HIGH;
Delayus(1);
SDA_IN;
TmpData<<=1;
if(SDA_DATA) TmpData|=1;
}
SCL_LOW;
return(TmpData);
}
//I2C寫數據到AT24C64
void I2cWrite(uchar Address,uchar Data)
{
I2cStart();//啟動總線
I2cWriteByte(0xAE);//發送器件地址
WaitAck();
I2cWriteByte(Address);//發送器件子地址
WaitAck();
I2cWriteByte(Data);//發送數據
WaitAck();
I2cStop();
}
//I2C從AT24C64讀數據
uchar I2cRead(uchar Address)
{
uchar TmpData;
I2cStart();//啟動總線
I2cWriteByte(0xAE);//發送器件地址
WaitAck();
I2cWriteByte(Address);//發送器件子地址
WaitAck();
I2cStart();//啟動總線
I2cWriteByte(0xAF);//發送器件地址
I2cAck();
TmpData=I2cReadByte();//讀取數據
I2cNAk();
I2cStop();
return(TmpData);
}
void main()
{
uchar cpos;
uint i,j;
WDTCTL=WDTPW+WDTHOLD;//關閉看門狗
//初始化端口
P4DIR = 0XFF; //P4作為段輸出
P5DIR = 0X0F; //P5作為位輸出
P4OUT = 0XFF; //熄滅所有數碼管
P5OUT = 0X00; //熄滅所有數碼管
SWP_OUT;
SWP_LOW; //禁用寫保護
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2開啟 LFXT1工作在低頻模式 ACLK不分頻 最高的標稱頻率
DCOCTL=DCO2+DCO1+DCO0;//DCO為最高頻率
do
{
IFG1&=~OFIFG;//清除振蕩器失效標志
for(uint i=255;i>0;i--);
}while(IFG1&OFIFG);//判斷XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK時鐘源為TX2CLK不分頻
_DINT();//關閉中斷
I2cWrite(0x00,Seg[0x08]);//在地址0x00寫入數據8
while(1)
{
for(cpos=0;cpos<16;cpos++)
{
P5OUT |= BIT0; //點亮數碼管1
P4OUT=I2cRead(0x00);//讀出地址0x00~0x0a的數據并顯示
for(i=0;i<1000;i++) //粗略延時
{
for(j=0;j<1000;j++);
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -