旋转编码器程序.docx

上传人:b****7 文档编号:9247105 上传时间:2023-02-03 格式:DOCX 页数:25 大小:20.14KB
下载 相关 举报
旋转编码器程序.docx_第1页
第1页 / 共25页
旋转编码器程序.docx_第2页
第2页 / 共25页
旋转编码器程序.docx_第3页
第3页 / 共25页
旋转编码器程序.docx_第4页
第4页 / 共25页
旋转编码器程序.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

旋转编码器程序.docx

《旋转编码器程序.docx》由会员分享,可在线阅读,更多相关《旋转编码器程序.docx(25页珍藏版)》请在冰豆网上搜索。

旋转编码器程序.docx

旋转编码器程序

/*****************************/

/*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--;//为低,反转

}

}

updata1=R0IOShadow0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1