|
程序是按照例程寫(xiě)的,查了說(shuō)有可能是LCD1602忙檢測(cè)的問(wèn)題,然后把忙檢測(cè)刪了,改成延時(shí),還是不亮。。
#include<at89x52.h>
#include<stdio.h>
#include<intrins.h>
#define TLC549_CS P1_1 //片選信號(hào)
#define TLC549_DATAOUT P1_0 //數(shù)據(jù)輸入口
#define TLC549_CLK P1_2 //時(shí)鐘信號(hào)
#define LCM_RW P2_1 //定義引腳
#define LCM_RS P2_2
#define LCM_E P2_0
#define LCM_Data P0
//#define Busy 0x80 //用于檢測(cè)LCM 狀態(tài)字中的Busy 標(biāo)識(shí)
/*------------------------------------------
子函數(shù)聲明
------------------------------------------*/
void Write_Data_LCM(unsigned char WDLCM);
void Write_Command_LCM(unsigned char WCLCM,BuysC);
void Read_Status_LCM(void);
void LCM_Init(void);
void Set_xy_LCM(unsigned char x, unsigned char y);
void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s);
void delay_nms(unsigned char n)
{
while(n)
{
_nop_();
n--;
}
}
/*========================= 函數(shù)名:Read_Status_LCM() 功 能:忙檢測(cè)函數(shù)
void Read_Status_LCM(void)
{
unsigned char read=0;
LCM_RW = 1;
LCM_RS = 0;
LCM_E = 1;
LCM_Data = 0xff;
do read = LCM_Data;
while(read & Busy);
LCM_E = 0;
}
/*-------------------------------------------
函數(shù)名:Write_Data_LCM ( )
功 能:對(duì)LCD 1602 寫(xiě)數(shù)據(jù)
--------------------------------------------*/
void Write_Data_LCM(unsigned char WDLCM)
{
// Read_Status_LCM(); //檢測(cè)忙
LCM_RS = 1;
LCM_RW = 0;
LCM_Data &= 0x0f;
LCM_Data |= WDLCM&0xf0;
LCM_E = 1; //若晶振速度太高可以在這后加小的延時(shí)
LCM_E = 1; //延時(shí)
LCM_E = 0;
WDLCM = WDLCM<<4;
LCM_Data &= 0x0f;
LCM_Data |= WDLCM&0xf0;
LCM_E = 1;
LCM_E = 1; //延時(shí)
LCM_E = 0;
}
/*------------------------------------------------
函數(shù)名:Write_Command_ LCM ( )
功 能:對(duì)LCD 1602 寫(xiě)指令
--------------------------------------------------*/
void Write_Command_LCM(unsigned char WCLCM) //BuysC 為0 時(shí)忽略忙檢測(cè)
{
// if (BuysC)
// Read_Status_LCM(); //根據(jù)需要檢測(cè)忙
LCM_RS = 0;
LCM_RW = 0;
LCM_Data &= 0x0f;
LCM_Data |= WCLCM&0xf0;//傳輸高四位
LCM_E = 1;
LCM_E = 1;
LCM_E = 0;
WCLCM = WCLCM<<4; //傳輸?shù)退奈?
LCM_Data &= 0x0f;
LCM_Data |= WCLCM&0xf0;
LCM_E = 1;
LCM_E = 1;
LCM_E = 0;
}
/*---------------------------------------------
函數(shù)名:LCM_Init() 功 能:對(duì)LCD 1602 初始化
----------------------------------------------*/
void LCM_Init(void) //LCM 初始化
{
LCM_Data = 0;
Write_Command_LCM(0x28); //三次顯示模式設(shè)置,不檢測(cè)忙信號(hào)
delay_nms(15);
Write_Command_LCM(0x28);
delay_nms(15);
Write_Command_LCM(0x28);
delay_nms(15);
// Write_Command_LCM(0x28,1); //顯示模式設(shè)置,開(kāi)始要求每次檢測(cè)忙信號(hào)
Write_Command_LCM(0x08,1); //關(guān)閉顯示
delay_nms(15);
Write_Command_LCM(0x01,1); //顯示清屏
delay_nms(15);
Write_Command_LCM(0x06,1); //顯示光標(biāo)移動(dòng)設(shè)置
delay_nms(15);
Write_Command_LCM(0x0C,1); //顯示開(kāi)及光標(biāo)設(shè)置
delay_nms(15);
}
/*-------------------------------------------
函數(shù)名:Set_xy_LCM ()
功 能:設(shè)定顯示坐標(biāo)位置
--------------------------------------------*/
void Set_xy_LCM(unsigned char x, unsigned char y)
{
unsigned char address;
if( x == 0 )
address = 0x80+y;
else
address = 0xc0+y;
Write_Command_LCM(address,1);
}
/*-------------------------------------------
函數(shù)名:Display_List_Char()
功 能:按指定位置顯示一串字符
--------------------------------------------*/
void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s)
{
Set_xy_LCM(x,y);
while(*s)
{
LCM_Data = *s;
Write_Data_LCM(*s);
s++;
}
}
void delay_us(unsigned char n)
{
while(n)
{
_nop_();
n--;
}
}
unsigned char ad_conv_tlc549() //TLC549A/D轉(zhuǎn)換子函數(shù)
{
unsigned char i;
unsigned char tmp_data=0;
TLC549_CS=1; //此時(shí)DATA OUT接口處于高阻態(tài),I/O CLK不起作用
_nop_();
TLC549_CLK=0;
_nop_();
TLC549_CS=0; //等待兩個(gè)內(nèi)部時(shí)鐘上升沿和一個(gè)下降沿,單片機(jī)確認(rèn)這一變化,然后自動(dòng)將前一次轉(zhuǎn)換結(jié)果的最高位(D7)位輸出到DATAOUT
_nop_();
_nop_();
for(i=0;i<8;i++)
{
TLC549_CLK=1;
tmp_data=(tmp_data<<1)|TLC549_DATAOUT;
TLC549_CLK=0;
}
TLC549_CS=1;
delay_us(17);
return tmp_data;
}
void init_uart() //串口初始化子函數(shù)
{
TMOD=0x20; //use timer1,mode2
TH1=0xfd; //19200
TL1=0xfd; //19200
PCON=0x80;
SCON=0x52;
TCON=0x69;
EA=1; //start uart
}
void main() //主函數(shù)
{
unsigned char str[32];
unsigned char longstr[16];
float v;
float L;
float u;
init_uart();
LCM_Init();
while(1)
{
v=(int)ad_conv_tlc549()*1.0/256.0*5.0;
u=v*1000; //轉(zhuǎn)換成毫伏顯示
L=v*10.0*100.0; //標(biāo)定后0~50000lux對(duì)應(yīng)輸出0~5V DC,則Y=10X
sprintf(str,"U=%.2fmV",u); //顯示電壓值
sprintf(longstr,"L=%.2fLux",L); //顯示光照強(qiáng)度值,單位為lux
Display_List_Char(0,0,&str);
Display_List_Char(1,0,&longstr);
delay_nms(200);
printf("U=%.2fmV\r\n",u); //輸出U=?V的字符串,帶小數(shù)點(diǎn),兩位小數(shù)
}
} |
|