📄 at24c02.c
字号:
PIN_LCMRD=1;
data_lcm=LCM_WRITE_ID;//LCM_DISP.LCM_ID;
for(unI=0;unI<3;unI++)//write id
{
PIN_LCMWR=0;
if(data_lcm&0x01)
PIN_LCMDATA=1;
else
PIN_LCMDATA=1;
data_lcm=data_lcm>>1;
PIN_LCMWR=1;
}
data_lcm=lcmaddr;//LCM_DISP.LCM_ADDR;
for(unI=0;unI<8;unI++)//write addr
{
PIN_LCMWR=0;
if(data_lcm&0x01)
PIN_LCMDATA=1;
else
PIN_LCMDATA=1;
data_lcm=data_lcm>>1;
PIN_LCMWR=1;
}
data_lcm=wdata;//LCM_DISP.LCM_DATA;
for(unJ=0;unJ<4;unJ++)
{
PIN_LCMWR=0;
if(data_lcm&0x01)
PIN_LCMDATA=1;
else
PIN_LCMDATA=1;
data_lcm=data_lcm>>1;
PIN_LCMWR=1;
}
}
void LCM_WRITE_ALL(uint *data_addr,uint *lcm_addr,uchar datalen)
{
uchar unI,unJ,unK;
uchar data_lcm;
PIN_LCMCS=0;
PIN_LCMRD=1;
data_lcm=LCM_DISP.LCM_ID;
for(unI=0;unI<3;unI++)//write id
{
PIN_LCMWR=0;
if(data_lcm&0x01)
PIN_LCMDATA=1;
else
PIN_LCMDATA=1;
data_lcm=data_lcm>>1;
PIN_LCMWR=1;
}
data_lcm=*lcm_addr;//LCM_DISP.LCM_ADDR;
for(unI=0;unI<8;unI++)//write addr
{
PIN_LCMWR=0;
if(data_lcm&0x01)
PIN_LCMDATA=1;
else
PIN_LCMDATA=1;
data_lcm=data_lcm>>1;
PIN_LCMWR=1;
}
for(unK=0;unK<datalen;unK++)
{
LCM_DATA.vimdata[0]=*data_addr++;//LCM_DISP.LCM_DATA;
data_lcm=LCM_DATA.DISP.data_h;
for(unJ=0;unJ<4;unJ++)
{
PIN_LCMWR=0;
if(data_lcm&0x01)
PIN_LCMDATA=1;
else
PIN_LCMDATA=1;
data_lcm=data_lcm>>1;
PIN_LCMWR=1;
}
data_lcm=LCM_DATA.DISP.data_l;
for(unJ=0;unJ<4;unJ++)
{
PIN_LCMWR=0;
if(data_lcm&0x01)
PIN_LCMDATA=1;
else
PIN_LCMDATA=1;
data_lcm=data_lcm>>1;
PIN_LCMWR=1;
}
}
}
void LCM_READ_MODIFY_WRITE(void)
{
}
void LCM_READ_MODIFY_WRITE_ALL(void)
{
}
void LCM_COMMAND_MODE(void)
{
}
void SendBit_1626(uchar Wdata,uchar cnt) //data 的高cnt 位写入HT1621,高位在前
{
uchar i;
for(i =0; i <cnt; i ++)
{
if((Wdata&0x80)==0) PIN_LCMDATA=0;
else PIN_LCMDATA=1;
PIN_LCMWR=0;
delay();
PIN_LCMWR=1;
Wdata<<=1;
}
}
void SendDataBit_1626(uchar Wdata,uchar cnt) //data 的低cnt 位写入HT1621,低位在前
{
uchar i;
for(i =0; i <cnt; i ++)
{
if((Wdata&0x01)==0) PIN_LCMDATA=0;
else PIN_LCMDATA=1;
PIN_LCMWR=0;
delay();
PIN_LCMWR=1;
Wdata>>=1;
}
}
void SendCmd(uchar command)
{
PIN_LCMCS=0;
SendBit_1626(0x80,4); //写入标志码“100”和9 位command 命令于
SendBit_1626(command,8); //没有使有到更改时钟输出等命令,为了编程方便
PIN_LCMCS=1; //直接将command 的最高位写“0”
}
void Write_1626(uchar addr,uchar Wdata)
{
PIN_LCMCS=0;
SendBit_1626(0xa0,3); //写入标志码“101”
SendBit_1626(addr,8); //写入addr 的8 位
SendDataBit_1626(Wdata,4); //写入data 的低4 位
PIN_LCMCS=1;
}
void WriteAll_1626(uchar addr,uchar *p,uchar cnt)
{
uchar i;
PIN_LCMCS=0;
SendBit_1626(0xa0,3); //写入标志码“101”
SendBit_1626(addr,8); //写入addr 的高8 位
for(i =0; i <cnt; i++) //连续写入数据
{
SendDataBit_1626(*p++,4);
}
PIN_LCMCS=1;
}
void delay(void)
{
uchar unI;
for(unI=0;unI<100;unI++)
{
;
}
}
void HW_Intialize(void)
{
SYSCLK_Init(); // 时钟初始化
//CP0E ECI0E PCA0ME UART0EN SPI0EN SMB0EN
//位7 位6 位5 位4 位3 位2 位1 位0
XBR0 = 0x05; // XBAR0: Initial Reset Value
//SYSCKE T2EXE T2E INT1E T1E INT0E T0E CP1E
//位7 位6 位5 位4 位3 位2 位1 位0
XBR1 = 0x04; // XBAR1: Initial Reset Value
//WEAKPUD XBARE - T4EXE T4E UART1E EMIFLE CNVSTE
//位7 位6 位5 位4 位3 位2 位1 位0
XBR2 = 0xC4; // XBAR2: Initial Reset Value
// Select Pin I/0
SMB0CN = 0x44; // 允许SMBUS, 应答返回AA(低电平
SMB0CR = 0xc9; // SMBus 速率= 100 kHz,系统时钟为11.0592MHZ
EIE1 |= 2; // SMBus 中断使能
TMOD=0x11; //定时器0,1和2设定及开启
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
TR0=1;
TR1=1;
IE=0x8a; //定时中断开启
EA = 1; // 开中断
SM_BUSY = 0; // SM_BUSY是忙碌标志位
SI = 0; //SM_BUSY中断标志位
}
/**********************************************************************
* 名称: timer0_Interrupt
*
* 参数:
*
* 返回:
*
* 描述:
*
*********************************************************************/
void timer0_Interrupt() interrupt 1 //基准定时0中断 1ms
{
Key_Time_Counter++;
VFD_Refresh_Time_Counter++;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}
/**********************************************************************
* 名称: timer0_Interrupt
*
* 参数:
*
* 返回:
*
* 描述:
*
*********************************************************************/
void timer1_Interrupt() interrupt 3 //基准定时1中断10ms
{
Key_Stuck_Time_Counter++;
flash_time_counter++;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
}
void SMBUS_ISR (void) interrupt 7 //中断服务程序
{
switch (SMB0STA)
{ // 根据中断状态码跳转
//(SMB0STA 是中断状态寄存器)
case SMB_START: //0x08, (MT & MR) 发送起始位
SMB0DAT =SLADDR; // 装入被访问的从芯片的写地址//WW
STA = 0; // 人工清除 STA 位
SI = 0; // 清除中断标志位
break;
case SMB_RP_START: //0x10,(MT & MR) 重复发送起始位
SMB0DAT =SLADDR; // 装入被访问的从芯片的读地址//R
STA = 0; // 人工清除 STA 位
SI = 0; // 清除中断标志位
break;
case SMB_MTADDACK: //0x18 ,(MT) 发送从地址 + W 后收到ACK
SMB0DAT = WORDADR;
SI = 0; // 清除中断标志位
break;
case SMB_MTADDNACK: //0x20,(MT) 发送从地址 + W 后收到NACK
STO = 1;
STA = 1;
SI = 0; // 清除中断标志位
break;
case SMB_MTDBACK: //0x28,(MT) 发送数据后收到ACK
switch (SENDMODE)
{ // 检查低1位
case 1:
sendnumber--;
if(sendnumber)
SMB0DAT = WORD;
else{
STO=1;
SM_BUSY=0;
}
break;
case 0:
STO = 0;
STA = 1;
break;
default:
STO = 1;
SM_BUSY = 0;
break;
}
SI = 0;
break;
case SMB_MTDBNACK: //0x30
STO = 1;
STA = 1;
SI = 0; // 清除中断标志
break;
case SMB_MRADDACK: //0x40
AA = 0;
SI = 0;
break;
case SMB_MRADDNACK: //0x48
STO = 0;
STA = 1;
SI = 0;
break;
case SMB_MRDBNACK: //0x58
WORD = SMB0DAT;
STO = 1;
SM_BUSY = 0;
AA = 1;
SI = 0;
break;
default:
STO = 1;
SM_BUSY = 0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -