📄 i2c.c
字号:
#include <pic.h>
#define portbit(address,bits) ((unsigned)(&address)*8 + (bits))
#define BUSY 0x80
#define WRITE_DATA 0xff
#define delay_data 0xff
#define COMMAND 0x00
#define LCD_CLEAR 0x01
#define portdata PORTB
#define READ 0xa1
#define WRITE 0xa0
#define eeprom_address 0x00
volatile bit E @ portbit(PORTD,7);
volatile bit RW @ portbit(PORTD,6);
volatile bit RS @ portbit(PORTD,5);
volatile bit reload;
volatile unsigned char dispdata;
void delay(unsigned int delay_time)
{
unsigned char i;
while (delay_time--)
{
for (i = 0; i <0xff; i ++)
{
}
}
}
void i2c_init(void)
{
INTCON = 0x00;
SSPSTAT = 0x80;
SSPCON = 0x08;
SSPCON2 = 0x00;
SSPADD = 0x02;
TRISC4 = 1;
TRISC3 = 1;
SSPIF = 0;
SSPIE = 0;
di();
SSPEN = 1;
}
void i2c_send(unsigned char data)
{
unsigned char i;
SEN = 1;
for (i = 2; -- i;)
continue;
do
{
RSEN = 1;
}
while (SSPIF == 0);
SSPIF = 0;
SSPBUF = WRITE;
while (SSPIF == 0);
SSPIF = 0;
SSPBUF = eeprom_address;
while (SSPIF == 0);
SSPIF = 0;
SSPBUF = data;
while (SSPIF == 0);
SSPIF = 0;
PEN = 1;
while (SSPIF == 0);
SSPIF = 0;
}
unsigned char i2c_receive(void)
{
unsigned char temp;
unsigned char i;
SEN = 1;
for (i = 2; -- i;)
{
}
while (SSPIF == 0);
SSPIF = 0;
SSPBUF = WRITE;
while (SSPIF == 0);
SSPIF = 0;
SSPBUF = eeprom_address;
while (SSPIF == 0);
SSPIF = 0;
do
{
RSEN = 1;
}
while (SSPIF == 0);
SSPIF = 0;
SSPBUF = READ;
while (SSPIF == 0);
SSPIF = 0;
while (SSPIF == 0);
temp = SSPBUF;
SSPIF = 0;
PEN = 1;
while (SSPIF == 0);
SSPIF = 0;
return temp;
}
unsigned char lcd_busy(void)
{
unsigned char temp;
portdata = 0xff;
RS = 0;
RW = 1;
E = 1;
TRISB = 0xff;
temp = portdata;
TRISB = 0x00;
E = 0;
return (temp);
}
void lcd_command_writedata(unsigned char check,unsigned char data)
{
if (check == COMMAND)
{
RS = 0;
}
else
{
RS = 1;
}
RW = 0;
portdata = data;
E = 1;
E = 0;
while (lcd_busy() & BUSY);
}
void lcd_disp(unsigned char adr,unsigned char disp_data)
{
lcd_command_writedata(COMMAND,adr);
lcd_command_writedata(WRITE_DATA,disp_data);
}
void lcd_init(void)
{
lcd_command_writedata(COMMAND,LCD_CLEAR);
lcd_command_writedata(COMMAND,0x38);
lcd_command_writedata(COMMAND,0x0e);
lcd_command_writedata(COMMAND,0x06);
}
void system_init(void)
{
INTCON = 0x00;
OPTION = 0xff;
TRISB = 0x00;
TRISD = 0x00;
}
void main(void)
{
system_init();
lcd_init();
i2c_init();
dispdata = 0x38;
i2c_send(dispdata);
dispdata = 0x00;
dispdata = i2c_receive();
lcd_disp(0x84,0X35);
lcd_disp(0x85,dispdata);
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -