#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); } }
|