#include <reg52.h> #include<intrins.h> #include <string.h> #define uint unsigned int #define uchar unsigned char sbit adcs=P3^2; //端口定义 sbit adwr=P3^6; sbit adrd=P3^7; sbit RS = P3^5; sbit RW = P3^6; sbit E= P3^4; uint Result_ADC0804; //转换结果变量 uchar Display_Buffer[2][16] ={{"CurrentVoltage:"},{"(CH)=0.00V"}}; //函数声明 uchar Get_Value_ADC0804(); //获取指定通道A/D转换结果 void Refesh_Disp_Buffer(); //刷新显示缓冲 void LCD_Busy_Check(); //忙检查 void LCD_Write_Command(uchar cmd); //向lcd写入命令 void Write_LCD_Data(uchar dat); //向lcd写入数据 void Initialize_LCD1602(); //液晶初始化函数 void LCD_Display(uchar str[]); //在lcd上显示字符串 void DelayMS(uint X); //延时 uchar Read_State(); //读取lcd的状态 void main() //主程序 {uchar j; Initialize_LCD1602(); //液晶初始化函数 while(1) //循环显示 { for(j=0;j<2;j++) { Get_Value_ADC0804(); //A/D转换 Refesh_Disp_Buffer(); //刷新显示缓冲 if (j==0) { LCD_Write_Command(0x80); //写lcd命令,设置从第0行位置开始显示 LCD_Display(Display_Buffer[j]); //在lcd上显示字符串 } else { LCD_Write_Command(0xC0); //写命令,设置从第1行位置开始显示 LCD_Display(Display_Buffer[j]); //在lcd上显示字符串 } }}} uchar Get_Value_ADC0804() //获取指定通道的A/D转换结果 {adcs=0; //片选信号输入端,低电平有效 adwr=0; //开始写入信号 _nop_();_nop_(); //2个机器周期,将写入的模拟信号转换为数字信号 adwr=1; //关闭写入 DelayMS(1); //延时 adrd=0; //输出信号 _nop_();_nop_(); //2个机器周期,将转换的信号输出到P1端口 Result_ADC0804=P1; //将输出的信号赋给Result_ADC0804 adrd=1; //关闭输出 DelayMS(1); //延时 adcs=1; } void Refesh_Disp_Buffer() //刷新显示脉冲 { uint t=(Result_ADC0804*500.0)/255; //将A/D输出的结果转换为2进制数 Display_Buffer[1][5] = t/100+'0'; //显示个位 Display_Buffer[1][7] = t/10%10+'0'; //显示十分位 Display_Buffer[1][8] = t%10+'0'; //显示百分位 } void DelayMS(uint X) //延时程序 { uchar i; while(X--) for(i=0;i<120;i++); //延时10us } uchar Read_State() //读取lcd的状态 {uchar state; RS=0; RW=1; E=1; //RS=0,RW=1,E=1 读状态 state=P0; //输出D0~D7 DelayMS(1); E=0; DelayMS(1); return state; } void LCD_Busy_Check() //忙等待 {while(Read_State()&&0x80!=0x80); DelayMS(1); } void LCD_Write_Command(uchar cmd) //向lcd写入命令 { LCD_Busy_Check(); //忙等待 RS=0; RW=0; P0=cmd; //将命令赋给P0端口 E=1; //RS=0,RW=0,E=1 写指令 E=0; } void Write_LCD_Data(uchar dat) //向lcd写入数据 { LCD_Busy_Check(); RS=1; RW=0; P0=dat; E=1; //RS=1,RW=0,E=1 写数据 DelayMS(1); E=0; } void Initialize_LCD1602() //lcd初始化 { LCD_Write_Command(0x38);DelayMS(1); //功能设置,数据长度为8位,双行显示,5*7点阵 LCD_Write_Command(0x0C);DelayMS(1); //显示开,关光标 LCD_Write_Command(0x06);DelayMS(1); //字符进入模式:屏幕不动,字符后移 LCD_Write_Command(0x01);DelayMS(1); //清屏 } void LCD_Display(uchar str[]) //在lcd上显示字符串 { uchar k; for(k=0;k<=strlen(str);k++) { Write_LCD_Data(str[k]); //依次在lcd上显示字符串 DelayMS(1); } }
|