#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
sbit lcdrs=P2^0; //1602:0写指令,1写数据
sbit lcdwr=P2^1; //1602读写信号
sbit lcden=P2^2; //1602片选信号
sbit TLC549_CS = P3^1; //TLC549片选,低电平有效
sbit TLC549_DO = P3^5; //TLC549数字量输出
sbit TLC549_CLK = P3^0; //TLC549片外独立时钟
sbit sta7=P0^7;
unsigned char data1_convert(unsigned char dat_temp)
{
unsigned char data1;
data1=(unsigned char)(((float)dat_temp/255)*5); //换算为电压值的个位值
data1=data1+48; //转换为对应的ASCII码,因为0对应ASCII码的48,以此类推
return data1;
}
unsigned char data0_convert(unsigned char dat_temp)
{
unsigned char data0,data1; data1=(unsigned char)(((float)dat_temp/255)*5); //换算为电压值的个位值
data0=(unsigned char)((((float)dat_temp/255)*5-data1)*10);//换算为为电压值的小--
//--数点后第一位的那个?
data0=data0+48;
return data0; //转换为对应的ASCII码
}
/**********************主函数*********************/
void main()
{
unsigned char dat; //用于接收从8591中读到的数据
lcd1602_init();
lcd_write_cmd(0x80);
lcd_write_data('C');
lcd_write_data('H');
lcd_write_data('1');
lcd_write_data(':');
lcd_write_cmd(0x85);
lcd_write_data('.');
lcd_write_cmd(0x87);
lcd_write_data('V'); //上面的这些都是为了在1602中显示"CH1: : V"
while(1)
{
iic_start();
iic_write(0x90); //对8591进行写操作
iic_ack();
iic_write(0x01); //设置为4路独立信号输入,并关闭通道自动加1,只用通道1
iic_ack();
iic_start(); //重新开始,为读数据作准备
iic_ack();
iic_write(0x91); //对8591进行读操作
iic_ack();
dat=iic_read(); //这还只是一个8位的数据(需进一步转换为实际电压值)
iic_send_no_ack();
iic_stop();
lcd_write_cmd(0x84); //将要显示的字符显示在此地址处
lcd_write_data(data1_convert(dat)); //显示电压的整数部分
lcd_write_cmd(0x86); //将要显示的字符显示在此地址处
lcd_write_data(data0_convert(dat)); //显示电压的小数部分
}
}
/***********************1ms延时函数**********************/
void delayms(uint ms)
{
uint y;
while(ms--)
{
for(y=0;y<125;y++);
}
}
//******************判忙*********************
void lcd_busy_check(void) //1602忙信号检测,忙则等待
{
P0=0xff;
do
{
lcdrs=0; //读状态操作,为0
lcdwr=1; //读操作为1
lcden=0;
lcden=1; //读状态,需为高电平
}
while (sta7==1); //如果为1则忙,等待...直到为0
lcden=0;
}
/***********************LCD写指令 写数据**********************/
void lcd_write_comdata(unsigned char cmd) //液晶写?
{
lcd_busy_check(); //每次操作之前都要进行忙信号检测
lcdrs=0; //执行数据操作,为1
lcdwr=0; //写操作,为0
P0=cmd; //送数据到液晶数据端口P0,准备执行数据操?
lcden=1; //高电平,数据送入液晶液晶数据RAM
//保持一会儿,使显示数据可靠地送入液晶数据RAM
lcden=0; //低电平,显示数据
}
void lcd_write_data(unsigned char dat) //液晶写数据函数
{
lcd_busy_check(); //每次操作之前都要进行忙信号检测
lcdrs=1; //执行数据操作,为1
lcdwr=0; //写操作,为0
P0=dat; //送数据到液晶数据端口P0,准备执行数据操作
lcden=1; //高电平,数据送入液晶液晶数据RAM
//保持一会儿,使显示数据可靠地送入液晶数据RAM
lcden=0; //低电平,显示数据
}
/***********************LCD初始化*********************/
void lcd1602_init()
{
P0=0x00;
lcden=0;
lcd_write_cmd(0,0x38); //显示模式5*7
lcd_write_cmd(0,0x0c);
lcd_write_cmd(0,0x06); //设置指针+1 屏幕不移动
lcd_write_cmd(0,0x01); //清屏
lcd_write_cmd(0,0x80); //初始化显示地址
}
|