1、LCD1602.c源程序 //液晶控制與顯示驅(qū)動(dòng)程序 #include<reg52.h> #include<intrins.h> #include<string.h> #include"LCD1602.h" #include"ADC0808.h" //---------------忙檢查-------------------// ucharLCD_Busy_Check() { ucharLCD_Status; RS = 0; RW = 1; E = 1; delay4us(); LCD_Status = P0; E = 0; return LCD_Status; } //--------------向LCD寫入命令--------------------// voidWrite_LCD_Command(uchar cmd) { while((LCD_Busy_Check()&0x80)==0x80); //忙等待 RS = 0; RW = 0; E =0; P0 = cmd; delay4us(); E = 1; delay4us(); E = 0; } //-----------向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)函數(shù)-----------------*/ voidWrite_LCD_Data(uchar dat) { while((LCD_Busy_Check()&0x80)==0x80); RS = 1; RW = 0; E =0; P0 = dat; delay4us(); E = 1; delay4us(); E = 0; } //-----------LCD初始化-----------------*/ voidInitialize_LCD1602() //液晶初始化函數(shù) { Write_LCD_Command(0x38);delay50us(10); //功能設(shè)置,數(shù)據(jù)長度為8位,雙行顯示,5×7點(diǎn)陣字體 Write_LCD_Command(0x0C);delay50us(10); // 顯示開,關(guān)光標(biāo) Write_LCD_Command(0x06);delay50us(10); //字符進(jìn)入模式:屏幕不動(dòng),字符后移 Write_LCD_Command(0x01); delay50us(10);//清屏 } //-----------在LCD上顯示字符串-----------------*/ voidLCD_Display(uchar *str) { uchar i; for(i=0;i<strlen(str);i++) { Write_LCD_Data(str); delay50us(100); } } 2、lCD1602_H頭文件 #ifndef__lCD1602_H__ #define __LCD1602_H__ #include<reg52.h> #definedat_port P0 #defineuchar unsigned char #defineuint unsigned int #definedelay4us() {_nop_();_nop_();_nop_();_nop_();} sbitRS=P2^0;//RS=1 數(shù)據(jù) RS=0 命令 sbitRW=P2^1;//RW=1 讀取 RW=0 寫入 sbitE=P2^2;//E 使能信號 ucharLCD_Busy_Check();//忙檢查 voidWrite_LCD_Command(uchar cmd);//向LCD寫入命令 voidWrite_LCD_Data(uchar dat); //向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)函數(shù) voidInitialize_LCD1602(); //液晶初始化函數(shù) voidLCD_Display(uchar *str);//在LCD上顯示字符串 #endif 3、ADC0808.C源程序 #include<reg52.h> #include<intrins.h> #include"ADC0808.h" unsignedlong dat_adc0808; uchardisplay_buffer[][16]={ {"Currentvoltage:"}, {" (CH) =0.00V"} }; voiddelay50us(uint m) { uint n,k; for(n=m;n>0;n--) for(k=25;k>0;k--); } uintadc0808_init() // AD初始化 { START=0; OE=0; START=1; START=0; while(EOC==0); OE=1; dat_adc0808=P1; OE=0; returndat_adc0808; } void Refresh_show() //刷新顯示 { uintt=dat_adc0808*500.0/255; // display_buffer[1][7] = t/100+'0'; //整數(shù)位 display_buffer[1][9] = t/10%10+'0'; //兩個(gè)小數(shù)位 display_buffer[1][10]= t%10+'0'; } 4、ADC0808.h 頭文件 #ifndef__ADC0808_H__ #define __ADC0808_H__ #include<reg52.h> #definedata_port P1 #defineuchar unsigned char #defineuint unsigned int sbitSTART=P2^3; sbitEOC=P2^4; sbitOE=P2^5; voiddelay50us(uint m);// 延時(shí) uintadc0808_init(); // AD初始化 voidRefresh_show(); #endif 5、main.c 主程序 #include<reg52.h> #include<intrins.h> #include"LCD1602.h" #include"ADC0808.h" sbitCLOCK=P2^6; externuchar display_buffer[][16]; voidmain() { TMOD=0x02; TH0=0x14; TL0=0x00; IE=0x82; TR0=1; Initialize_LCD1602(); delay50us(10); Write_LCD_Command(0x80);//設(shè)置顯示的初始位置 LCD_Display(display_buffer[0]);//顯示"Thevoltage is: " while(1) { adc0808_init(); Refresh_show(); Write_LCD_Command(0xC0);//設(shè)置顯示的初始位置 LCD_Display(display_buffer[1]); //顯示測得的數(shù)據(jù) } } voidTimer0_INT() interrupt 1 { CLOCK=!CLOCK; }
|