LCD1602封装函数用的江科大的
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
// PCF8591相关地址及控制字定义
sbit SCL = P1^1; // I2C时钟线,假设连接到P2.0,根据实际电路图修改
sbit SDA = P1^2; // I2C数据线,假设连接到P2.1,根据实际电路图修改
// 延时函数
void delayms(uchar ms)
{
uchar i;
while(ms--)
{
for(i = 0; i < 123; i++);
}
}
// I2C起始信号
void I2C_Start()
{
SDA = 1;
SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL = 0;
}
// I2C停止信号
void I2C_Stop()
{
SDA = 0;
SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL = 0;
}
// I2C发送应答信号
void I2C_SendAck()
{
SDA = 0;
SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL = 0;
SDA = 1;
}
// I2C发送非应答信号
void I2C_SendNotAck()
{
SDA = 1;
SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL = 0;
SDA = 0;
}
// I2C发送一个字节数据
void I2C_SendByte(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
SDA = (bit)(dat & 0x80);
SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL = 0;
dat <<= 1;
}
// 接收应答信号
SDA = 1;
SCL = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
while(SDA);
SCL = 0;
}
// I2C接收一个字节数据
uchar I2C_RecvByte()
{
uchar i, dat = 0;
SDA = 1;
for(i = 0; i < 8; i++)
{
SCL = 1;
dat <<= 1;
if(SDA)
{
dat |= 0x01;
}
SCL = 0;
}
return dat;
}
// PCF8591进行DA转换
void PCF8591_DA(uchar dat)
{
I2C_Start();
I2C_SendByte(0x90); // PCF8591写地址
I2C_SendAck();
I2C_SendByte(0x40); // 控制字节,选择通道0进行DA转换
I2C_SendAck();
I2C_SendByte(dat);
I2C_SendAck();
I2C_Stop();
}
// PCF8591进行AD转换,选择通道2
uchar PCF8591_AD()
{
uchar dat;
I2C_Start();
I2C_SendByte(0x90); // PCF8591写地址
I2C_SendAck();
I2C_SendByte(0x42); // 控制字节,选择通道2进行AD转换
I2C_SendAck();
I2C_Start();
I2C_SendByte(0x91); // PCF8591读地址
I2C_SendAck();
dat = I2C_RecvByte();
I2C_SendNotAck();
I2C_Stop();
return dat;
}
// 主函数
void main()
{
uchar ad_value;
uchar da_value = 0;
char ad_str[16];
char da_str[16];
LCD_Init();
while(1)
{
PCF8591_DA(da_value);
delayms(10);
ad_value = PCF8591_AD();
//转换AD值为字符串
sprintf(ad_str, "AD: %d", ad_value);
//转换DA值为字符串
sprintf(da_str, "DA: %d", da_value);
LCD_ShowString(1, 1, "sdhjkbv");
LCD_ShowString(2, 1, da_str);
da_value++;
if(da_value > 255)
{
da_value = 0;
}
}
}
|