- #include <msp430x14x.h>
- double data;//用來存儲(chǔ)ADC12MEM中的數(shù)據(jù)
- unsigned int a,b,c=0; //用來存儲(chǔ)將要顯示在LCD上的各位數(shù)據(jù)
- //初始化時(shí)鐘
- void initClock(void){
- BCSCTL1=RSEL2+RSEL1+RSEL0+DIVA_1;//XT2開啟 LFXT1工作在低頻模式 ACLK 2分頻( 注釋:原來的人沒做分頻,我擔(dān)心頻率過高) 最高的標(biāo)稱頻率
- DCOCTL=DCO2+DCO1+DCO0;//DCO為最高頻率
- do{
- IFG1&=~OFIFG;//清除振蕩器失效標(biāo)志
- for(unsigned int i=255;i>0;i--);
- }while(IFG1&OFIFG);//判斷XT2是否起振
- BCSCTL2=SELM1+SELS;//MCLK SMCLK時(shí)鐘源為TX2CLK不分頻
- }
- //延時(shí)函數(shù)
- void delay(unsigned int m){
- for(unsigned int i=0;i<m;i++)
- _NOP();
- }
- //ADC12采樣初始化,并打開中斷子程序計(jì)算采樣值的大小
- void initADC12(){
- P6SEL=0X01;//P6.0作為模擬輸入
- ADC12IE=0X01; //開放中斷ADC12IFG.0
- ADC12CTL0=ADC12ON+SHT0_4+REFON+REF2_5V;//打開ADC轉(zhuǎn)換的核,采用內(nèi)部參考電壓2.5v;
- ADC12CTL1=SHP; //信號(hào)源內(nèi)部觸發(fā)
- ADC12CTL0 |=ENC; //開放使能
- _EINT();//開放系統(tǒng)總中斷
- ADC12CTL0 |=ADC12SC; //開始轉(zhuǎn)換,轉(zhuǎn)換完成之后自動(dòng)進(jìn)入中斷服務(wù)子程序
- }
- #pragma vector=ADC_VECTOR
- __interrupt void ADC12ISR(){
- data=ADC12MEM0*2.5/4095; //data為全局變量
- }
- //基本寫入函數(shù)命令
- void Lcd_InsWrite(unsigned int i,char Instruction)
- {
- P4DIR=0XFF; // P4口設(shè)置成輸出模式
- if(i==0)
- P3OUT=0x1F; // RS=0,R/W=0 寫指令
- else P3OUT=0x9F; // RS=0,R/W=0 寫數(shù)據(jù)
- P3OUT|=BIT5; //E=1 使能
- P4OUT=Instruction; //功能設(shè)定
- delay(3); //延時(shí)
- P3OUT&=~BIT5; //E=0:下降沿鎖存數(shù)據(jù)
- }
- //LCD初始化函數(shù)
- //函數(shù)聲明:采用MSP430端口p3.5-3.7連接LCD的E,RW,和RS端口;P4口用來傳送數(shù)據(jù)
- void init_lcd(void)
- {
- P3DIR=0XE0; //P3.5-E,P3.6-R/W,P3.7-RS輸出
- Lcd_InsWrite(0,0x38);//8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
- delay(400);
- Lcd_InsWrite(0,0x0c);//開啟顯示, 無光標(biāo)
- delay(400);
- Lcd_InsWrite(0,0x06);//AC遞增, 畫面不動(dòng)
- delay(400);
- Lcd_InsWrite(0,0x01);//清屏
- delay(400);
- }
- //將ADC轉(zhuǎn)換后的值寫入LCD
- void WriteData(){
- data*=100;
- int temp=(int)data;
- a=temp/100;//考慮到由于內(nèi)部參考電壓的限制,且僅考慮兩位小數(shù)的情況
- b=(temp%100)/10;
- c=(temp%10);
- Lcd_InsWrite(1,a+0x30);
- Lcd_InsWrite(1,'.');
- Lcd_InsWrite(1,b+0x30);
- Lcd_InsWrite(1,c+0x30);
- }
- //主函數(shù)部分
- void main(){
- WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗
- initClock();//初始化時(shí)鐘
- initADC12();//ADC12采樣初始化,并打開中斷子程序計(jì)算采樣值的大小
- init_lcd(); //lcd初始化
- Lcd_InsWrite(0,0x80); //顯示在第一行
- WriteData(); //將采樣值分別計(jì)算出對(duì)應(yīng)位的輸出
- }
復(fù)制代碼 |