Re: 各位高手我把程式pO上來了~~~指點中
|
||||
---|---|---|---|---|
高級會員
|
Hello,
temp宣告為local variable好像沒什幫助。 union及struct用在A/D讀值的擷取,你可以參考TAIWAN MICROCHIP的範例程式!
發表於: 2007/4/25 11:32
|
|||
|
各位高手我把程式pO上來了~~~指點中
|
||||
---|---|---|---|---|
高級會員
|
各位高高手我把我的程式都PO上來 想問為何無法顯示 我將電壓輸入經由A/D轉換顯示在LCD
#include <pic.h> // processor if/def file #include "cnfig877a.h" #include "mid_lcd.h" unsigned char i ; //================================ //////// A/D延遲 ///////////////////////////// void ADdelay(unsigned char i) { while(i--); } //********************************** //* Function Prototype Declaration //********************************** void Init_IO(void); void Init_Adc( void ); void A2D( unsigned char ); void LCD_ItoA(unsigned int); unsigned char Set_BCD_ASCII(unsigned char); __CONFIG ( HS_OSC & BODEN_ON & WDT_OFF & CP_OFF & LVP_OFF & DEBUG_ON ); const char LCD_Msg1[]=" Voltage: "; const char LCD_Msg2[]=" MSB: LSB: "; unsigned int AD_Temp; bit DS_Zero_Flag; union { int AD_10bit; struct { char AD_LSB; char AD_MSB; } AD_Byte; } AD_Int; /***************************** INITIALIZE I/O PORT *****************************/ void Init_IO(void) { TRISA0=1; // Set RA0 for input } /***************************************** Initialize A/D & Comparator Module ******************************************/ void Init_Adc( void ) { ADCON1=0b00001110; // AN0 is A/D input ADFM=1; // Right justified ADCON0=0b10000001; // Selext CH0 , A/D on ADdelay(2); //delay20us } /*********************************** Convert A/D Channel ************************************/ void A2D( unsigned char channel ) { unsigned char temp; // Temp storage ADGO = 1; //啟動一次A/D轉換 while (ADGO==1) ; // 等待AD轉換完成 temp = ADRESH*256+ ADRESL; } //*************************************** //* Program Main ( ) * //*************************************** void main(void) { Init_IO(); Init_Adc(); OpenLCD(); LCD_Set_Cursor(0,0); putrsLCD(LCD_Msg1); while(1) { A2D(0x00); // Get 10-bit A/D result from CH0 LCD_Set_Cursor(7,0); LCD_ItoA(AD_Int.AD_10bit); } } void LCD_ItoA(unsigned int AD_Data) { AD_Temp=AD_Data; DS_Zero_Flag=1; putcLCD(Set_BCD_ASCII(AD_Data/1000));// 顯示千位數 AD_Temp=AD_Temp%1000; // 取出百位以後的數 putcLCD(Set_BCD_ASCII(AD_Temp/100));// 顯示百位數 AD_Temp=AD_Temp%100; putcLCD(Set_BCD_ASCII(AD_Temp/10)); // 顯示十位數 AD_Temp=AD_Temp%10; putcLCD(AD_Temp+='0'); // 顯示個位數 } unsigned char Set_BCD_ASCII(unsigned char BCD_Data) { if (BCD_Data==0) { if (DS_Zero_Flag) return ' '; // 居先零抑制 else return '0'; // 顯示一般的零 } else { DS_Zero_Flag=0; // 取消居先零的抑制 return (BCD_Data +='0');// 並傳回 ASCII Code } }
發表於: 2007/4/24 11:52
|
|||
|