1、LCD1602.c源程序 //液晶控制与显示驱动程序 #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写入一个字节的数据函数-----------------*/ 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() //液晶初始化函数 { Write_LCD_Command(0x38);delay50us(10); //功能设置,数据长度为8位,双行显示,5×7点阵字体 Write_LCD_Command(0x0C);delay50us(10); // 显示开,关光标 Write_LCD_Command(0x06);delay50us(10); //字符进入模式:屏幕不动,字符后移 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 数据 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写入一个字节的数据函数 voidInitialize_LCD1602(); //液晶初始化函数 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'; //整数位 display_buffer[1][9] = t/10%10+'0'; //两个小数位 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);// 延时 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);//设置显示的初始位置 LCD_Display(display_buffer[0]);//显示"Thevoltage is: " while(1) { adc0808_init(); Refresh_show(); Write_LCD_Command(0xC0);//设置显示的初始位置 LCD_Display(display_buffer[1]); //显示测得的数据 } } voidTimer0_INT() interrupt 1 { CLOCK=!CLOCK; }
|