|
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;
}
}
}
|
|