主函数文件:
#include <reg52.h>
#include <intrins.h>
#include "./delay/delay.h"
sbit SCL = P1^0;
sbit SDA = P1^1;
bit ack = 0;
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
#define SUCC 1
#define ERR 0
#define LCDPORT P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0
void lcd1602_write(unsigned char byte,unsigned char flag)
{
if(flag)
{
RS = 1;
}
else
{
RS = 0;
}
RW = 0;
E = 1;
LCDPORT = byte;
delay_us(5);
E = 0;
}
void lcd_dis_char(unsigned char x, unsigned char y, unsigned char byte)
{
if((x > 15) || (y > 1))
{
return ;
}
if(0 == y)
{
lcd1602_write(0x80 + x,LCD_WRITE_COM);
}
else
{
lcd1602_write(0x80 + 0x40 + x,LCD_WRITE_COM);
}
lcd1602_write(byte,LCD_WRITE_DATA);
}
void lcd1602_dis_str(unsigned char x, unsigned char y, unsigned char *str)
{
if((x > 15) || (y > 1))
{
return ;
}
if(0 == y)
{
lcd1602_write(0x80 + x,LCD_WRITE_COM);
}
else
{
lcd1602_write(0x80 + 0x40 + x,LCD_WRITE_COM);
}
while(*str != '\0')
{
lcd1602_write(*str,LCD_WRITE_DATA);
str++;
}
}
void lcd_init()
{
delay_ms(15);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x08,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x01,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x06,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x0c,LCD_WRITE_COM);
delay_ms(5);
}
void iic_start()
{
SDA = 1;
SCL = 1;
delay_us(1);
SDA = 0;
delay_us(1);
SCL = 0;
}
void iic_stop()
{
SDA = 0;
SCL = 1;
delay_us(1);
SDA = 1;
delay_us(1);
SCL = 0;
}
bit iic_send_byte(unsigned char byte)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SDA = byte & 0x80;
SCL = 1;
delay_us(1);
SCL = 0;
delay_us(1);
byte <<= 1;
}
SCL = 1;
SDA = 1;
delay_us(1);
if(0 == SDA)
{
ack = 1;
}
else
{
ack = 0;
}
SCL = 0;
return ack;
}
unsigned char iic_rcv_byte()
{
unsigned char i;
unsigned char temp;
unsigned char a;
SDA = 1;
for(i = 0; i < 8; i++)
{
SCL = 0;
delay_us(1);
SCL = 1;
if(SDA)
{
a = 0x01;
}
else
{
a = 0;
}
temp |= (a <<(7 - i));
delay_us(1);
}
SCL = 0;
return temp;
}
void iic_ack()
{
SDA = 0;
SCL = 1;
delay_us(1);
SCL = 0;
}
void iic_noack()
{
SDA = 1;
SCL = 1;
delay_us(1);
SCL = 0;
}
unsigned char AT24C02_send_str(unsigned char devaddr,unsigned char romaddr,unsigned char *s,unsigned char num)
{
unsigned char i;
iic_start();
iic_send_byte(devaddr);
if(0 == ack) return ERR;
iic_send_byte(romaddr);
if(0 == ack) return ERR;
for(i = 0; i < num; i++)
{
iic_send_byte(*s);
if(0 == ack) return ERR;
s++;
}
iic_stop();
return SUCC;
}
unsigned char AT24C02_rcv_byte(unsigned char devaddr,unsigned char romaddr,unsigned char *s,unsigned char num)
{
unsigned char i;
iic_start();
iic_send_byte(devaddr);
if(0 == ack) return ERR;
iic_send_byte(romaddr);
if(0 == ack) return ERR;
iic_start();
iic_send_byte(devaddr + 1);
for(i = 0; i < num - 1; i++)
{
*s = iic_rcv_byte();
iic_ack();
s++;
}
*s = iic_rcv_byte();
iic_noack();
iic_stop();
return SUCC;
}
unsigned char AD_Read()
{
unsigned char temp;
iic_start();
iic_send_byte(0x90);
if(0 == ack) return ERR;
iic_send_byte(0x40);
if(0 == ack) return ERR;
iic_start();
iic_send_byte(0x90 + 1);
if(0 == ack) return ERR;
temp = iic_rcv_byte();
iic_noack();
iic_stop();
return temp;
}
unsigned char DA_Write(unsigned char num)
{
iic_start();
iic_send_byte(0x90);
if(0 == ack) return ERR;
iic_send_byte(0x40);
if(0 == ack) return ERR;
iic_send_byte(num);
if(0 == ack) return ERR;
iic_stop;
}
void main()
{
unsigned char test;
// unsigned char num;
lcd_init();
while(1)
{
test = AD_Read();
test = test*50 / 255;
lcd_dis_char(0,0,(test / 10) + 0x30);
lcd_dis_char(1,0,'.');
lcd_dis_char(2,0,(test % 10) + 0x30);
// DA_Write(num);
// num++;
delay_ms(20);
}
}
void delay_us(unsigned char t)
{
while(--t);
}
void delay_ms(unsigned char t)
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
void delay_s(unsigned char t)
{
while(t--)
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}