旋轉(zhuǎn)編碼器程序_第1頁(yè)
旋轉(zhuǎn)編碼器程序_第2頁(yè)
旋轉(zhuǎn)編碼器程序_第3頁(yè)
旋轉(zhuǎn)編碼器程序_第4頁(yè)
旋轉(zhuǎn)編碼器程序_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

/*****************************//*Author:FD.chdHiSiAllrightReserved*//*****************************/#include"AMP_BTL.h"#include<iom16v.h>#include<macros.h>#include"string.h"#include"delay.h"#include<signal.h>/*************************************************************************************///sbitFD650_SCL=P2^7;//sbitFD650_SDA=P2^6;/*************************************************************************************/#defineLEDMAPNUM22#defineConnectOkPortOnPORTC&=~(1<<PC6)#defineConnectOkPortOffPORTC|=(1<<PC6)//#defineConOkErrorDirSetDDRC|=0xC0#defineErrorPortOnPORTC&=~(1<<PC7)#defineErrorPortOffPORTC|=(1<<PC7)/*LEDbitmap*/intKeyNumber;u_int32gbData;//設(shè)置全局變量,用于顯示及電位器和編碼器橋梁作用u_int16gbX9C102_Data;//電位器全局變量u_int16gbmode;//0下調(diào),1上調(diào)u_int16gbsave;//1保存,0不保存u_int16gbcounter;//計(jì)數(shù)值u_int16gbcounterMID;//靜音存儲(chǔ)用的u_int8PID_MID=0;u_int16gbX9C102_Data_MID;constintKeyCode[8]={0x47,0x4f,0x57,0x5f,0x67,0x6f,0x77};typedefstruct_led_bitmap{ u_int8character; u_int8bitmap;}led_bitmap;constled_bitmapBCD_decode_tab[LEDMAPNUM]={ {'0',0x3F},{'1',0x06},{'2',0x5B},{'3',0x4F}, {'4',0x66},{'5',0x6D},{'6',0x7D},{'7',0x07}, {'8',0x7F},{'9',0x6F},{'a',0x77},{'A',0x77}, {'b',0x7C},{'B',0x7C},{'c',0x58},{'C',0x39}, {'d',0x5E},{'D',0x5E},{'e',0x79},{'E',0x79}, {'f',0x71},{'F',0x71}};//BCD碼字映射/************************************************SCLPC0SDAPC1************************************************///立即數(shù)碼值映射u_int8bLEDTable[]={0x3F, //b00000011 "0"0x06, //b10011111 "1"0x5B, //b00100001 "2"0x4F, //b00001101 "3"0x66, //b10001000 "4"0x6D, //b01001001 "5"0x7D, //b01000001 "6"0x07, //b00011111 "7"0x7F, //b00000001 "8"0x6F, //b00001001 "9"0x77, //b00010001 "A"0x7C, //b11000001 "b"0x39, //b01100011 "C"0x5E, //b10000101 "d"0x79, //b01100001 "E"0x71, //b01110001 "F"};/****************************************************************** FunctionName:FD650_Start** Description:**Parameter:**return:****************************************************************/voidFD650_Start(void){ FD650_SDA_SET(); FD650_SDA_D_OUT; FD650_SCL_SET(); FD650_SCL_D_OUT; DELAY; FD650_SDA_CLR(); DELAY; FD650_SCL_CLR();}/****************************************************************** FunctionName:FD650_Stop** Description:**Parameter:**return:****************************************************************/voidFD650_Stop(void){ FD650_SDA_CLR(); FD650_SDA_D_OUT; DELAY; FD650_SCL_SET(); DELAY; FD650_SDA_SET(); DELAY; FD650_SDA_D_IN();}/****************************************************************** FunctionName:FD650_WrByte** Description:WriteOneBytedata**Parameter:data**return:****************************************************************/voidFD650_WrByte(u_int8dat){ u_int8i; FD650_SDA_D_OUT; for(i=0;i!=8;i++) { if(dat&0x80) { FD650_SDA_SET(); } else { FD650_SDA_CLR(); } DELAY; FD650_SCL_SET(); dat<<=1; DELAY;//可選延時(shí) FD650_SCL_CLR(); } FD650_SDA_D_IN(); FD650_SDA_SET(); DELAY; FD650_SCL_SET(); DELAY; FD650_SCL_CLR();}/****************************************************************** FunctionName:FD650_WrByte** Description:ReadOneBytedata**Parameter:**return:data****************************************************************/u_int8FD650_RdByte(void){ u_int8dat,i; FD650_SDA_SET(); FD650_SDA_D_IN(); dat=0; for(i=0;i!=8;i++) { DELAY;//可選延時(shí) FD650_SCL_SET(); DELAY;//可選延時(shí) dat<<=1; if(FD650_SDA) { dat++; }; FD650_SCL_CLR(); } FD650_SDA_SET(); DELAY; FD650_SCL_SET(); DELAY; FD650_SCL_CLR(); returndat;}/****************************************FD650操作函數(shù)*********************************************//****************************************************************** FunctionName:FD650_Write** Description:通過(guò)發(fā)送命令參數(shù)DIG0:0x28hDIG1:0x2ahDIG2:0x2ChDIG3:0x2Eh**Parameter:cmd見(jiàn)FD650.H**return:無(wú)****************************************************************/voidFD650_Write(u_int16cmd) //寫(xiě)命令{ FD650_Start(); FD650_WrByte(((u_int8)(cmd>>7)&0x3E)|0x40);//高7位寫(xiě)&00111110|01000000 FD650_WrByte((u_int8)cmd); FD650_Stop(); return;}/****************************************************************** FunctionName:FD650_Read** Description:讀取按鍵按下?tīng)顟B(tài)的鍵值,如讀到無(wú)效按鍵值返回0**Parameter:無(wú)**return:按鍵按下?tīng)顟B(tài)的鍵值****************************************************************//*u_int8FD650_Read(void) //讀取按鍵{ u_int8keycode=0; FD650_Start(); FD650_WrByte((u_int8)(FD650_GET_KEY>>7)&0x3E|0x01|0x40);//00111110|00000001|01000000 keycode=FD650_RdByte(); FD650_Stop(); if(keycode&0x40==0) keycode=0; returnkeycode;}*//********************應(yīng)用**********************************//****************************************************************** FunctionName:Led_Get_Code** Description:轉(zhuǎn)換字符為數(shù)碼管的顯示碼,如遇到無(wú)法轉(zhuǎn)換的字符返回0**Parameter:cTemp待轉(zhuǎn)換為顯示碼的字符**return:顯示碼值****************************************************************/staticu_int8Led_Get_Code(charcTemp){ u_int8i,bitmap=0x00; for(i=0;i<LEDMAPNUM;i++) { if(BCD_decode_tab[i].character==cTemp)//字符和其相等嗎,相等則后面碼值 { bitmap=BCD_decode_tab[i].bitmap;//顯示碼送出 break; } } returnbitmap; }/******************************************************** FunctionName:Led_Show_650** Description:簡(jiǎn)單的數(shù)碼管顯示應(yīng)用示例**Parameter: acFPStr 顯示的字符串;* sec_flag開(kāi)啟小數(shù)點(diǎn)標(biāo)志位;* Lock 開(kāi)啟鎖定燈;* Stdby開(kāi)啟待機(jī)顯示燈;*return:無(wú)****************************************************************///voidLed_Show_650(char*acFPStr,unsignedcharsec_flag,unsignedcharLock,unsignedcharStdby)voidLed_Show_650(unsignedcharsec_flag,unsignedcharLock,unsignedcharStdby){ inti,Data,iLenth,Energy_1,Energy_2,Energy_3,Energy_4; int dat_a[4]={0x00,0x00,0x00,0x00}; /*if(strcmp(acFPStr,"")==0)//比較字符串大小,如果和空格相等則返回 { return; } iLenth=strlen(acFPStr);//計(jì)算字符串長(zhǎng)度 if(iLenth>4) iLenth=4;//只顯示4位 for(i=0;i<iLenth;i++) { dat_a[i]=Led_Get_Code(acFPStr[i]);//字符串轉(zhuǎn)換為數(shù)組 }*/ //gbData=gbData;//刪除 Energy_1=gbData/1000; Data=gbData%1000; if(Energy_1>9) { Energy_1=0x0E;//若值大于9999則顯示E開(kāi)頭 } Energy_2=Data/100; Data=Data%100; Energy_3=Data/10; Data=Data%10; Energy_4=Data; Data=Data%1000; dat_a[0]=bLEDTable[Energy_1];//第一個(gè)LED顯示的值 dat_a[1]=bLEDTable[Energy_2];//第二個(gè)LED顯示的值 dat_a[2]=bLEDTable[Energy_3];//第三個(gè)LED顯示的值 dat_a[3]=bLEDTable[Energy_4];//第四個(gè)LED顯示的值 FD650_Write(FD650_SYSON_4);//開(kāi)啟顯示和鍵盤,8段顯示方式 //發(fā)顯示數(shù)據(jù) FD650_Write(FD650_DIG0|(u_int8)dat_a[0]); //點(diǎn)亮第一個(gè)數(shù)碼管 if(sec_flag) FD650_Write(FD650_DIG1|(u_int8)dat_a[1]|FD650_DOT);//點(diǎn)亮第二個(gè)數(shù)碼管 else FD650_Write(FD650_DIG1|(u_int8)dat_a[1]); if(Lock) FD650_Write(FD650_DIG2|(u_int8)dat_a[2]|FD650_DOT);//點(diǎn)亮第三個(gè)數(shù)碼管 else FD650_Write(FD650_DIG2|(u_int8)dat_a[2]); if(Stdby) FD650_Write(FD650_DIG3|(u_int8)dat_a[3]|FD650_DOT);//點(diǎn)亮第四個(gè)數(shù)碼管 else FD650_Write(FD650_DIG3|(u_int8)dat_a[3]);}/*******************************************************************************///全局?jǐn)?shù)據(jù)和數(shù)字電位器之間的轉(zhuǎn)換;/******************************************************************************/voidX9C102_Change(void){if(gbData>99) { gbData=99;//若值大于99則等于99 }}/***********************************************************************************************/voidX9C102_WD(void); //聲明//延時(shí)程序us級(jí)voiddelay_us(u_int16t){ u_int16i; for(i=0;i<t;i++) ; }//X9C102初始化voidX9C102_csh(void){gbData=99;//電位器全局變量gbmode=0;//0下調(diào),1上調(diào)gbsave=1;//1保存。0不保存 X9C102_WD(); //向下調(diào)99步至0/*************************************************/ //gbData=50;//電位器全局變量 gbData=gbcounter;gbmode=1;//0下調(diào),1上調(diào)gbsave=1;//1保存。0不保存 X9C102_WD(); //向上調(diào)節(jié)/*************************************************/}//數(shù)字電位器調(diào)整:gbX9C102_Data為調(diào)整步數(shù);//mode為方向選擇為‘1’時(shí)向上,為‘0//save為存儲(chǔ)有效‘1’存,‘0voidX9C102_WD(void){ u_int16j,k; CS_SCL_CLR(); //片選 if(gbmode!=0) //上調(diào) { UD_SCL_SET(); //上調(diào)有效 delay_us(1);for(k=gbData;k>0;k--) // for(k=1;k>0;k--)//測(cè)試 { INC_SCL_SET(); delay_us(1); INC_SCL_CLR(); delay_us(2);//等待輸出穩(wěn)定 } delay_us(10); if(gbsave==1) { INC_SCL_SET(); //存儲(chǔ)滑動(dòng)端位置 delay_us(2); CS_SCL_SET(); }//不存儲(chǔ),返回等待 } if(gbmode==0) //下調(diào) { UD_SCL_CLR(); //下調(diào)有效 delay_us(1); for(k=gbData;k>0;k--) //for(k=1;k>0;k--)//測(cè)試 { INC_SCL_SET(); delay_us(1); INC_SCL_CLR(); delay_us(2);//等待輸出穩(wěn)定 } delay_us(2); if(gbsave==1) { INC_SCL_SET(); //存儲(chǔ)滑動(dòng)端位置 delay_us(2); CS_SCL_SET(); }//不存儲(chǔ),返回等待 }}/**************************************************************************************///LED測(cè)試函數(shù)/**************************************************************************************/voidLedTest(void){Led_Show_650(0,1,1);}/************************************************************************************///旋轉(zhuǎn)編碼器檢測(cè)程序/************************************************************************************//***************************************************************************************//*voidscan_encoder(void){if(updata1==1&&R0IOShadow0==0)//判斷前后狀態(tài)以識(shí)別是否發(fā)生下降沿{if(R0IOShadow2==0) //判斷另一相電平{if(gbcounter==99)return;gbcounter++; //為高,正轉(zhuǎn)}else{if(gbcounter==0)return;gbcounter--;//為低,反轉(zhuǎn)}}updata1=R0IOShadow0; //刷新位暫存值}*//**********************************************************************************//*******************************另外一種判斷方法********************************//*voidscan_encoder(void){staticu_int8Aold,Bold;//兩個(gè)變量用來(lái)儲(chǔ)存上一次調(diào)用時(shí)編碼開(kāi)關(guān)兩引腳的電平staticu_int8st=0;//用來(lái)儲(chǔ)存以前是否出現(xiàn)了兩個(gè)引腳都為高電平的狀態(tài)if(R0IOShadow0&&R0IOShadow2)st=1;if(st)//如果st為1執(zhí)行下面的步驟{if(R0IOShadow0==0&&R0IOShadow2==0)//如果兩引腳都為低執(zhí)行下面{if(Bold)//為高說(shuō)明編碼開(kāi)關(guān)在向加大的方向轉(zhuǎn){st=0;if(gbcounter==99)return;elsegbcounter++;}if(Aold)//為高說(shuō)明編碼開(kāi)關(guān)在向減小的方向轉(zhuǎn){st=0;if(gbcounter==0)return;elsegbcounter--;//設(shè)返回值}}}Aold=R0IOShadow0;//保持這次檢測(cè)的電平,以備下次調(diào)用比較用Bold=R0IOShadow2;//}*//*************************************************************************************///靜音檢測(cè)/************************************************************************************/voidMUTE(void){staticu_int8mute_b=0;if(R0IOShadow4==0){ delay_us(500); R0IOShadow=PINA; if(R0IOShadow4==0){mute_b++; delay_us(500);if(mute_b==1) { gbcounterMID=gbcounter;//數(shù)據(jù)暫時(shí)存著gbcounter=00;//計(jì)數(shù)單元清零(歸位)即靜音 X9C102_csh(); } else { mute_b=0; gbcounter=gbcounterMID;//數(shù)據(jù)恢復(fù) X9C102_csh(); }}} gbData=gbcounter;//編碼器的值給橋梁數(shù)據(jù)}/********************中斷服務(wù)程序***************************************/#pragmainterrupt_handlerINTERRUPT:2voidINTERRUPT(void){PID_MID++;//gbcounter=1234;//測(cè)試GIFR=0xC0; //清中斷標(biāo)志if(PID_MID==15){PID_MID=0;gbcounterMID=gbcounter+5;//在靜音的時(shí)候旋轉(zhuǎn)了編碼器則存儲(chǔ)無(wú)效 }//PORTC=0Xff;//delay_us(500);//PORTC=0X00;//delay_us(500);updata0=0;R0IOShadow=PINA;//讀引腳if((updata0==0)&&(R0IOShadow2==1))//為高說(shuō)明編碼開(kāi)關(guān)在向加大的方向轉(zhuǎn){if(gbcounter==99) return;else gbcounter++;gbmode=1;}if((updata0==0)&&(R0IOShadow2==0))//為高說(shuō)明編碼開(kāi)關(guān)在向減小的方向轉(zhuǎn){if(gbcounter==0) return;else gbcounter--;//設(shè)返回值 gbmode=0;}gbData=1;X9C102_WD();}/***********************中斷初始化***********************************/voidInterrupt0_Init(void){SREG=0X80;//開(kāi)全局中斷GICR=0X40;//開(kāi)中斷總控MCUCR=0X02;//設(shè)置INT0下降沿觸發(fā)中斷MCUCSR=0X00;//此和INT2控制有關(guān),此處未使用,忽略/

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論