[转帖] ·AT24C02 C语言驱动程序—MAX7219 显示
转自http://www.blog.edu.cn:AT24C02 C语言驱动程序—MAX7219 显示 -|wolf0801 发表于 2005-8-25 9:19:00
//AT24C02 EEPROM drive program
//for 51 mcu with max7219 as display
//designed by zhaoliang
//2005-6-15 14:23
#i nclude " reg51.h "
#i nclude " intrins.h "
/********************************************************************/
//common part
#defineHIGH 1
#defineLOW 0
#defineTRUE 1
#defineZERO 0
#defineMSB 0x80
//at24c02 part
#defineWRITE24C02 0xA0
#define READ24C02 0xA1
//I2C part
#defineACK 0
#define NO_ACK 1
#defineMSB 0x80
//max7219 part
#defineDECODE_MODE 0x09
#defineINTENSITY 0x0A
#defineSCAN_LIMIT 0x0B
#defineSHUT_DOWN 0x0C
#defineDISPLAY_TEST 0x0F
/********************************************************************/
//pin defined
/***********************************************************************/
//change this part at different board
sbit LOAD=P1^2; //MAX7219 Load-Data Input: rising edgepin 12
sbit DIN=P1^1; //MAX7219 Serial-Data Input: rising edgepin 1
sbit CLK=P1^0; //MAX7219 Serial-Clock Input:maximum 10MHzpin 13
//function define
/***********************************************************************/
void Write_7219(unsigned char address,unsigned char dat);//write max7219 command and data
void Init_7219(void);//Initize max7219
void Write_7219_byte(unsigned char temp);//write max7219 a byte
sbit SDA=P2^3; //AT24C02 serial data pin 5
sbit SCLK=P2^2; //AT24C02 serial clock pin 6
/********************************************************************/
void Write_7219(unsigned char address,unsigned char dat);//write max7219 command and data
void Init_7219(void);//Initize max7219
void Write_7219_byte(unsigned char temp);//write max7219 a byte
/********************************************************************/
void I2C_delay(void);//I2C delay function
void I2C_start(void);//I2C start function
void I2C_stop(void);//I2C stop function
void I2C_send_ack(bit k);//I2C send responsion function
void I2C_write_byte(unsigned char dat);//I2C bus write byte function
unsigned char I2C_read_byte(void);//I2C bus read byte function
/********************************************************************/
void AT24C02_write(unsigned char address,unsigned char dat);//write 24c02 information function
unsigned char AT24C02_read(unsigned char address);//read 24c02 information function
/********************************************************************/
void Mcu_init(void);//system initize funcition
void Display(void);//24c02 display function
unsigned char count;
/********************************************************************/
void main()
{
Mcu_init();
while(1)
{
Display();
}
}
/***********************************************************************/
void timer0(void) interrupt 1 using 1
{
TH0=-(12000/256);
TL0=-(12000%256);
count=count+1;
if(count==100)
{
count=0;
count=count+1;
if(count==99)
count=0;
}
}
/***********************************************************************/
void Mcu_init(void)
{
TMOD=0x11;
TH0=-(12000/256);
TL0=-(12000%256);
EA=HIGH;
ET0=HIGH;
TR0=HIGH;
Init_7219();
}
/***********************************************************************/
/******************************** I2C PART **************************/
void I2C_delay(void)
{
_nop_();_nop_();_nop_();_nop_();
}
/***********************************************************************/
void I2C_start(void)
{
SDA=HIGH;
_nop_();
SCLK=HIGH;
_nop_();
SDA=LOW;
_nop_();
SCLK=LOW;
_nop_();
}
/***********************************************************************/
void I2C_stop(void)
{
SDA=LOW;
_nop_();
SCLK=HIGH;
_nop_();
SDA=HIGH;
_nop_();
SCLK=LOW;
_nop_();
}
/***********************************************************************/
void I2C_send_ack(bit k)
{
SDA=k;
I2C_delay();
SCLK=HIGH;
I2C_delay();
SCLK=LOW;
}
/***********************************************************************/
void I2C_write_byte(unsigned char dat)
{
unsigned char i;
for (i=8;i>0;i--)
{
SCLK=LOW;
I2C_delay();
SDA=(bit)(dat&MSB);
dat<<=1;
I2C_delay();
SCLK=HIGH;
I2C_delay();
}
SCLK=LOW;
}
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
unsigned char i,dat;
for (i=0;i<8;i++)
{
SCLK=LOW;
I2C_delay();
SDA=HIGH;
I2C_delay();
SCLK=HIGH;
dat<<=1;
I2C_delay();
if(SDA)
dat++;
}
SCLK=LOW;
return (dat);
}
/***********************************************************************/
/************************ 24C02 PART **********************************/
void AT24C02_write(unsigned char address,unsigned char dat)
{
unsigned char temp;
temp=dat/10;
temp<<=4;
temp=dat%10+temp;
I2C_start();
I2C_write_byte(WRITE24C02);
I2C_send_ack(ACK);
I2C_write_byte(address);
I2C_send_ack(ACK);
I2C_write_byte(temp);
I2C_send_ack(NO_ACK);
I2C_stop();
}
/***********************************************************************/
unsigned char AT24C02_read(unsigned char address)
{
unsigned char temp,dat;
I2C_start();
I2C_write_byte(WRITE24C02);
I2C_send_ack(ACK);
I2C_write_byte(address);
I2C_send_ack(NO_ACK);
I2C_stop();
I2C_start();
I2C_write_byte(READ24C02);
I2C_send_ack(ACK);
dat=I2C_read_byte();
I2C_send_ack(NO_ACK);
I2C_stop();
temp=dat/16;
dat=dat%16;
dat=dat+temp*10;
return (dat);
}
/***********************************************************************/
void Write_7219_byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
CLK=LOW;
DIN=(bit)(temp&MSB);
temp<<=1;
CLK=HIGH;
}
}
/***********************************************************************/
void Write_7219(unsigned char address,unsigned char dat)
{
LOAD=LOW;
Write_7219_byte(address);
Write_7219_byte(dat);
LOAD=HIGH;
}
/***********************************************************************/
void Init_7219(void)
{
Write_7219(SHUT_DOWN, 0x01); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0
Write_7219(DISPLAY_TEST,0x00); //Normal Operation XXXXXXX0 Display Test Mode XXXXXXXX1
Write_7219(DECODE_MODE, 0xfb); //Decode Mode Select D7~D0 1 B decode 0 No decode
Write_7219(SCAN_LIMIT, 0x07); //SCAN LIMIT 0~7 0xX0~0xX7
Write_7219(INTENSITY, 0x04); //Set Intensity 0xX0~0xXf
}
/***********************************************************************/
void Display(void)
{
unsigned char temp;
AT24C02_write(0x00,count);
temp=AT24C02_read(0x00);
Write_7219(7,temp/10);
Write_7219(8,temp%10);
Write_7219(1,2);
Write_7219(2,4);
Write_7219(3,0x4e);//no decode mode 'c'
Write_7219(4,0);
Write_7219(5,2);
Write_7219(6,0x0f);
AT24C02_write(0x00,count);
}
页:
[1]