![]() |
admin 發表于 2018-4-18 00:31 程序是按照例程寫的,查了說有可能是LCD1602忙檢測的問題,然后把忙檢測刪了,改成延時,還是不亮。。 #include<at89x52.h> #include<stdio.h> #include<intrins.h> #define TLC549_CS P1_1 //片選信號 #define TLC549_DATAOUT P1_0 //數據輸入口 #define TLC549_CLK P1_2 //時鐘信號 #define LCM_RW P2_1 //定義引腳 #define LCM_RS P2_2 #define LCM_E P2_0 #define LCM_Data P0 //#define Busy 0x80 //用于檢測LCM 狀態字中的Busy 標識 /*------------------------------------------ 子函數聲明 ------------------------------------------*/ 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--; } } /*========================= 函數名:Read_Status_LCM() 功 能:忙檢測函數 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; } /*------------------------------------------- 函數名:Write_Data_LCM ( ) 功 能:對LCD 1602 寫數據 --------------------------------------------*/ void Write_Data_LCM(unsigned char WDLCM) { // Read_Status_LCM(); //檢測忙 LCM_RS = 1; LCM_RW = 0; LCM_Data &= 0x0f; LCM_Data |= WDLCM&0xf0; LCM_E = 1; //若晶振速度太高可以在這后加小的延時 LCM_E = 1; //延時 LCM_E = 0; WDLCM = WDLCM<<4; LCM_Data &= 0x0f; LCM_Data |= WDLCM&0xf0; LCM_E = 1; LCM_E = 1; //延時 LCM_E = 0; } /*------------------------------------------------ 函數名:Write_Command_ LCM ( ) 功 能:對LCD 1602 寫指令 --------------------------------------------------*/ void Write_Command_LCM(unsigned char WCLCM) //BuysC 為0 時忽略忙檢測 { // if (BuysC) // Read_Status_LCM(); //根據需要檢測忙 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; //傳輸低四位 LCM_Data &= 0x0f; LCM_Data |= WCLCM&0xf0; LCM_E = 1; LCM_E = 1; LCM_E = 0; } /*--------------------------------------------- 函數名:LCM_Init() 功 能:對LCD 1602 初始化 ----------------------------------------------*/ void LCM_Init(void) //LCM 初始化 { LCM_Data = 0; Write_Command_LCM(0x28); //三次顯示模式設置,不檢測忙信號 delay_nms(15); Write_Command_LCM(0x28); delay_nms(15); Write_Command_LCM(0x28); delay_nms(15); // Write_Command_LCM(0x28,1); //顯示模式設置,開始要求每次檢測忙信號 Write_Command_LCM(0x08,1); //關閉顯示 delay_nms(15); Write_Command_LCM(0x01,1); //顯示清屏 delay_nms(15); Write_Command_LCM(0x06,1); //顯示光標移動設置 delay_nms(15); Write_Command_LCM(0x0C,1); //顯示開及光標設置 delay_nms(15); } /*------------------------------------------- 函數名:Set_xy_LCM () 功 能:設定顯示坐標位置 --------------------------------------------*/ 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); } /*------------------------------------------- 函數名: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轉換子函數 { unsigned char i; unsigned char tmp_data=0; TLC549_CS=1; //此時DATA OUT接口處于高阻態,I/O CLK不起作用 _nop_(); TLC549_CLK=0; _nop_(); TLC549_CS=0; //等待兩個內部時鐘上升沿和一個下降沿,單片機確認這一變化,然后自動將前一次轉換結果的最高位(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() //串口初始化子函數 { TMOD=0x20; //use timer1,mode2 TH1=0xfd; //19200 TL1=0xfd; //19200 PCON=0x80; SCON=0x52; TCON=0x69; EA=1; //start uart } void main() //主函數 { 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; //轉換成毫伏顯示 L=v*10.0*100.0; //標定后0~50000lux對應輸出0~5V DC,則Y=10X sprintf(str,"U=%.2fmV",u); //顯示電壓值 sprintf(longstr,"L=%.2fLux",L); //顯示光照強度值,單位為lux Display_List_Char(0,0,&str); Display_List_Char(1,0,&longstr); delay_nms(200); printf("U=%.2fmV\r\n",u); //輸出U=?V的字符串,帶小數點,兩位小數 } } |
應該是程序有問題吧,,你應該把程序也帖出來的 先轉移此貼了 |