/*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;