旋转编码器程序.docx
- 文档编号:16247544
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:26
- 大小:19.83KB
旋转编码器程序.docx
《旋转编码器程序.docx》由会员分享,可在线阅读,更多相关《旋转编码器程序.docx(26页珍藏版)》请在冰点文库上搜索。
旋转编码器程序
旋转编码器程序
/*****************************/
/*Author:
FD.chdHiSiAllrightReserved*/
/*****************************/
#include"AMP_BTL.h"
#include
#include
#include"string.h"
#include"delay.h"
#include
/*************************************************************************************/
//sbitFD650_SCL=P2^7;
//sbitFD650_SDA=P2^6;
/*************************************************************************************/
#defineLEDMAPNUM22
#defineConnectOkPortOnPORTC&=~(1< #defineConnectOkPortOffPORTC|=(1< //#defineConOkErrorDirSetDDRC|=0xC0 #defineErrorPortOnPORTC&=~(1< #defineErrorPortOffPORTC|=(1< /*LEDbitmap*/ intKeyNumber; u_int32gbData;//设置全局变量,用于显示及电位器和编码器桥梁作用 u_int16gbX9C102_Data;//电位器全局变量 u_int16gbmode;//0下调,1上调 u_int16gbsave;//1保存,0不保存 u_int16gbcounter;//计数值 u_int16gbcounterMID;//静音存储用的 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码字映射 /************************************************ SCLPC0 SDAPC1 ************************************************/ //立即数码值映射 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;//可选延时 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;//可选延时 FD650_SCL_SET(); DELAY;//可选延时 dat<<=1; if(FD650_SDA) { dat++; }; FD650_SCL_CLR(); } FD650_SDA_SET(); DELAY; FD650_SCL_SET(); DELAY; FD650_SCL_CLR(); returndat; } /****************************************FD650操作函数*********************************************/ /**************************************************************** * *FunctionName: FD650_Write * *Description: 通过发送命令参数 DIG0: 0x28h DIG1: 0x2ah DIG2: 0x2Ch DIG3: 0x2Eh * *Parameter: cmd见FD650.H * *return: 无 ****************************************************************/ voidFD650_Write(u_int16cmd)//写命令 { FD650_Start(); FD650_WrByte(((u_int8)(cmd>>7)&0x3E)|0x40);//高7位写&00111110|01000000 FD650_WrByte((u_int8)cmd); FD650_Stop(); return; } /**************************************************************** * *FunctionName: FD650_Read * *Description: 读取按键按下状态的键值,如读到无效按键值返回0 * *Parameter: 无 * *return: 按键按下状态的键值 ****************************************************************/ /*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; }*/ /********************应用**********************************/ /**************************************************************** * *FunctionName: Led_Get_Code * *Description: 转换字符为数码管的显示码,如遇到无法转换的字符返回0 * *Parameter: cTemp待转换为显示码的字符 * *return: 显示码值 ****************************************************************/ staticu_int8Led_Get_Code(charcTemp) { u_int8i,bitmap=0x00; for(i=0;i { if(BCD_decode_tab[i].character==cTemp)//字符和其相等吗,相等则后面码值 { bitmap=BCD_decode_tab[i].bitmap;//显示码送出 break; } } returnbitmap; } /****************************************************** * *FunctionName: Led_Show_650 * *Description: 简单的数码管显示应用示例 * *Parameter: acFPStr显示的字符串; *sec_flag开启小数点标志位; *Lock开启锁定灯; *Stdby开启待机显示灯; *return: 无 ****************************************************************/ //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; intdat_a[4]={0x00,0x00,0x00,0x00}; /*if(strcmp(acFPStr,"")==0)//比较字符串大小,如果和空格相等则返回 { return; } iLenth=strlen(acFPStr);//计算字符串长度 if(iLenth>4) iLenth=4;//只显示4位 for(i=0;i { dat_a[i]=Led_Get_Code(acFPStr[i]);//字符串转换为数组 }*/ //gbData=gbData;//删除 Energy_1=gbData/1000; Data=gbData%1000; if(Energy_1>9) { Energy_1=0x0E;//若值大于9999则显示E开头 } 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];//第一个LED显示的值 dat_a[1]=bLEDTable[Energy_2];//第二个LED显示的值 dat_a[2]=bLEDTable[Energy_3];//第三个LED显示的值 dat_a[3]=bLEDTable[Energy_4];//第四个LED显示的值 FD650_Write(FD650_SYSON_4);//开启显示和键盘,8段显示方式 //发显示数据 FD650_Write(FD650_DIG0|(u_int8)dat_a[0]);//点亮第一个数码管 if(sec_flag) FD650_Write(FD650_DIG1|(u_int8)dat_a[1]|FD650_DOT);//点亮第二个数码管 else FD650_Write(FD650_DIG1|(u_int8)dat_a[1]); if(Lock) FD650_Write(FD650_DIG2|(u_int8)dat_a[2]|FD650_DOT);//点亮第三个数码管 else FD650_Write(FD650_DIG2|(u_int8)dat_a[2]); if(Stdby) FD650_Write(FD650_DIG3|(u_int8)dat_a[3]|FD650_DOT);//点亮第四个数码管 else FD650_Write(FD650_DIG3|(u_int8)dat_a[3]); } /*******************************************************************************/ //全局数据和数字电位器之间的转换; /******************************************************************************/ voidX9C102_Change(void) { if(gbData>99) { gbData=99;//若值大于99则等于99 } } /***********************************************************************************************/ voidX9C102_WD(void);//声明 //延时程序us级 voiddelay_us(u_int16t) { u_int16i; for(i=0;i ; } //X9C102初始化 voidX9C102_csh(void) { gbData=99;//电位器全局变量 gbmode=0;//0下调,1上调 gbsave=1;//1保存。 0不保存 X9C102_WD();//向下调99步至0 /*************************************************/ //gbData=50;//电位器全局变量 gbData=gbcounter; gbmode=1;//0下调,1上调 gbsave=1;//1保存。 0不保存 X9C102_WD();//向上调节 /*************************************************/ } //数字电位器调整: gbX9C102_Data为调整步数; //mode为方向选择为‘1’时向上,为‘0’时向下; //save为存储有效‘1’存,‘0’不存; voidX9C102_WD(void) { u_int16j,k; CS_SCL_CLR();//片选 if(gbmode! =0)//上调 {UD_SCL_SET();//上调有效 delay_us (1); for(k=gbData;k>0;k--) //for(k=1;k>0;k--)//测试 { INC_SCL_SET(); delay_us (1); INC_SCL_CLR(); delay_us (2);//等待输出稳定 } delay_us(10); if(gbsave==1) { INC_SCL_SET();//存储滑动端位置 delay_us (2); CS_SCL_SET(); }//不存储,返回等待 } if(gbmode==0)//下调 {UD_SCL_CLR();//下调有效 delay_us (1); for(k=gbData;k>0;k--) //for(k=1;k>0;k--)//测试 { INC_SCL_SET(); delay_us (1); INC_SCL_CLR(); delay_us (2);//等待输出稳定 } delay_us (2); if(gbsave==1) { INC_SCL_SET();//存储滑动端位置 delay_us (2); CS_SCL_SET(); }//不存储,返回等待 } } /**************************************************************************************/ //LED测试函数 /**************************************************************************************/ voidLedTest(void) { Led_Show_650(0,1,1); } /************************************************************************************/ //旋转编码器检测程序 /************************************************************************************/ /***************************************************************************************/ /*voidscan_encoder(void) { if(updata1==1&&R0IOShadow0==0)//判断前后状态以识别是否发生下降沿 { if(R0IOShadow2==0)//判断另一相电平 { if(gbcounter==99) return; gbcounter++;//为高,正转 } else { if(gbcounter==0) return; gbcounter--;//为低,反转 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 旋转 编码器 程序