📄 i2cled.c
字号:
//I2C LED
#include "DSP28_Device.h"
const Uint16 LedCode[]= { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };
#define I2CLEDWRITEADDR 0x72
void delay(unsigned int);
void ldelay(unsigned int);
void IOINIT()
{
GpioDataRegs.GPBDAT.bit.GPIOB8=1;
GpioDataRegs.GPBDAT.bit.GPIOB9=1;
GpioDataRegs.GPBDAT.bit.GPIOB15=1;
}
//////////////////////////////////////////
void START()
{
GpioDataRegs.GPBDAT.bit.GPIOB15=1;//ENABLE
GpioDataRegs.GPBDAT.bit.GPIOB8=1;//SCL
GpioDataRegs.GPBDAT.bit.GPIOB9=1;//SDA
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB9=0;//SDA
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB8=0;//SCL
delay(200);
}
//////////////////////////////////////////////////
void STOP()
{
GpioDataRegs.GPBDAT.bit.GPIOB15=1;//ENABLE
GpioDataRegs.GPBDAT.bit.GPIOB9=0;//SDA
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB8=1;//SCL
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB9=1;//SDA
delay(200);
}
///////////////////////////////////////
void TRANSMIT(unsigned int input)
{
unsigned int temp;
GpioDataRegs.GPBDAT.bit.GPIOB8=0;//SCL
delay(200);
for(temp=8;temp!=0;temp--)
{
if ((input&0x80))
{
GpioDataRegs.GPBDAT.bit.GPIOB15=1;//ENABLE
GpioDataRegs.GPBDAT.bit.GPIOB9=1;//SDA
}
else
{
GpioDataRegs.GPBDAT.bit.GPIOB15=1;//ENABLE
GpioDataRegs.GPBDAT.bit.GPIOB9=0;//SDA
}
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB8=1;//SCL
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB8=0;//SCL
delay(200);
input=input<<1;
}
}
///////////////////////////////////////////
unsigned int SLAVE_ACK() //0=OK,1=fail
{
unsigned int k;
GpioDataRegs.GPBDAT.bit.GPIOB15=1;//ENABLE
GpioDataRegs.GPBDAT.bit.GPIOB9=0;//SDA
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB15=0;//DISABLE
GpioDataRegs.GPBDAT.bit.GPIOB8=1;//SCL
delay(2000);
if (GpioDataRegs.GPBDAT.bit.GPIOB14==1) k=1; else k=0;
GpioDataRegs.GPBDAT.bit.GPIOB15=1;//ENABLE
GpioDataRegs.GPBDAT.bit.GPIOB9=0;//SDA
delay(200);
GpioDataRegs.GPBDAT.bit.GPIOB8=0;//SCL
delay(200);
return (k);
}
////////////////////////////////////////////////////
unsigned int BYTE_WR(unsigned int BYTE_ADDR,unsigned int T_DATA) //0=OK,1=fail
{
unsigned int k;
START();
TRANSMIT(BYTE_ADDR);
k=SLAVE_ACK();
if (k==0) TRANSMIT(T_DATA);
if (k==0) k=SLAVE_ACK();
if (k==0) STOP();
return (k);
}
////////////////////////////////////
void main(void)
{
unsigned int i;
InitSysCtrl(); //初始化系统
DINT; //关中断
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE参数表
InitPeripherals(); //初始化外设寄存器
InitGpio(); //初始化IO口
EINT; //Enable INTM
ERTM; //Enable DBGM
IOINIT();
while(1)
for (i=0;i<16;i++)
{
BYTE_WR(I2CLEDWRITEADDR,LedCode[i]);
ldelay(200);
}
}
void ldelay(unsigned int k)
{
while(k>0)
{
k--;
delay(20000);
}
}
void delay(unsigned int t)
{
while(t>0)
t--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -