版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*****************************//*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;//设置全局变量,用于显示及电位器和编码器桥梁作用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码字映射/************************************************SCLPC0SDAPC1************************************************///立即数码值映射u_int8bLEDTable[]={0x3F, //b00000011 "0"0x06, //b10011111 "1"0x5B, //b00100001 "2"0x4F, //b00001101 "3"0x66, //b10001000 "4"0x6D, //b01001001 "5" 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:0x28hDIG1:0x2ahDIG2:0x2ChDIG3: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<LEDMAPNUM;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; int dat_a[4]={0x00,0x00,0x00,0x00}; /*if(strcmp(acFPStr,"")==0)//比较字符串大小,如果和空格相等则返回 { return; } iLenth=strlen(acFPStr);//计算字符串长度 if(iLenth>4) iLenth=4;//只显示4位 for(i=0;i<iLenth;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<t;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’存,‘0voidX9C102_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; //刷新位暂存值}*//**********************************************************************************//*******************************另外一种判断方法********************************//*voidscan_encoder(void){staticu_int8Aold,Bold;//两个变量用来储存上一次调用时编码开关两引脚的电平staticu_int8st=0;//用来储存以前是否出现了两个引脚都为高电平的状态if(R0IOShadow0&&R0IOShadow2)st=1;if(st)//如果st为1执行下面的步骤{if(R0IOShadow0==0&&R0IOShadow2==0)//如果两引脚都为低执行下面{if(Bold)//为高说明编码开关在向加大的方向转{st=0;if(gbcounter==99)return;elsegbcounter++;}if(Aold)//为高说明编码开关在向减小的方向转{st=0;if(gbcounter==0)return;elsegbcounter--;//设返回值}}}Aold=R0IOShadow0;//保持这次检测的电平,以备下次调用比较用Bold=R0IOShadow2;//}*//*************************************************************************************///静音检测/************************************************************************************/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;//数据暂时存着gbcounter=00;//计数单元清零(归位)即静音 X9C102_csh(); } else { mute_b=0; gbcounter=gbcounterMID;//数据恢复 X9C102_csh(); }}} gbData=gbcounter;//编码器的值给桥梁数据}/********************中断服务程序***************************************/#pragmainterrupt_handlerINTERRUPT:2voidINTERRUPT(void){PID_MID++;//gbcounter=1234;//测试GIFR=0xC0; //清中断标志if(PID_MID==15){PID_MID=0;gbcounterMID=gbcounter+5;//在静音的时候旋转了编码器则存储无效 }//PORTC=0Xff;//delay_us(500);//PORTC=0X00;//delay_us(500);updata0=0;R0IOShadow=PINA;//读引脚if((updata0==0)&&(R0IOShadow2==1))//为高说明编码开关在向加大的方向转{if(gbcounter==99) return;else gbcounter++;gbmode=1;}if((updata0==0)&&(R0IOShadow2==0))//为高说明编码开关在向减小的方向转{if(gbcounter==0) return;else gbcounter--;//设返回值 gbmode=0;}gbData=1;X9C102_WD();}/***********************中断初始化***********************************/voidInterrupt0_Init(void){SREG=0X80;//开全局中断GICR=0X40;//开中断总控MCUCR=0X02;//设置INT0下降沿触发中断MCUCSR=0X00;//此和INT2控制有关,此处未使用,忽略//GIFR=0xC0;}/**********************************************************************************************/voidport_init(void){PORTA=0x1F;/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 炉内器件高纯处理工岗前师带徒考核试卷含答案
- 网络网络安全防御技术操作手册
- 2026南非钻石开采行业市场现状供需分析及投资评估规划分析研究报告
- 茶树栽培工岗前内部考核试卷含答案
- 2026南亚农业技术咨询服务商市场供需互动及投资运营策略规划探讨
- 乳品评鉴师创新方法模拟考核试卷含答案
- 弹簧工岗前生产安全意识考核试卷含答案
- 钽电解电容器成型烧结工岗前技术传承考核试卷含答案
- 助听器验配师持续改进能力考核试卷含答案
- 园林植保工安全宣传模拟考核试卷含答案
- 2026年安全生产月:重大危险源管控与隐患排查治理课件
- 2026广西百色市那坡县劳动人事争议仲裁院招聘编外工作人员5人笔试备考试题及答案解析
- 5.1《阿Q正传(节选)》课件+2025-2026学年统编版高二语文选择性必修下册
- GINA哮喘指南核心更新解读2026
- 2025年甘孜州船头学校选调事业单位工作人员真题
- 2026年汽车维修前台测试题及答案
- 2026福建厦门公交集团有限公司公交招聘考试备考试题及答案解析
- 2026年职业能力倾向验-通关题库及1套参考答案详解
- 百慕大三角分析课件
- 人教版新目标英语七年级下册unit 4 写作市公开课一等奖省课获奖课件
- 八年级家长会-语文老师课件
评论
0/150
提交评论