#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); //初始化顯示地址
}
|