..
//-------------------------------------------------------------------------
INT16U ADCave(INT8U n,INT8U channel) {
//求n次A/D转换的平均值 INT8U i; INT16U j;
if(0 == n) n = 1; j = 0;
描读取键值
INT8U KB_Def(INT8U KB_valve); //键值转为定义值
INT8U KB_ScanN(INT8U KB_count); //多次扫描键盘 (2)KB.c源程序 //[KB.c]键盘扫描识别-------------------------------------------------------
//本文件包含: for (i=0; i j += ADCmid(channel); j /= n; return j; } 4、键盘扫描子函数(包括键盘函数定义头函数KB.h和键盘函数定义KB.c) 入口参数:无 出口参数:无 调用函数:KB_Init、KB_Scan1、KB_Def、KB_ScanN 功 能:键盘初始化、扫描读取键值、键值转换为定义值、多次扫描键盘 调试时间:2012-6-8 作 者: (1)KB.h源程序 //键盘扫描识别寄存器及标志位定义 #define KB_P PTH //键盘接在PTH口上 #define KB_D DDRH //相应的方向寄存器 #define KB_PE PERH //相应的上拉下拉电阻允许寄存器 #define KB_PS PPSH //相应的极性选择寄存器 #define KB_IE PIEH //相应的中断允许寄存器 #define KB_IF PIFH //相应的中断标志寄存器 ///键盘扫描识别函数声明 void KB_Init(void); //键盘初始化 INT8U KB_Scan1(void); //扫 ;. // (1)KB_Init:键盘初始化 // (2)KB_Scan1:单次扫描读取键值 // (3)KB_Def:键值转为定义值 // (4)KB_ScanN:多次扫描键盘消除\抖动\问题 //------------------------------------------------------------------------- #include #include #include \ //键盘扫描识别头文件 //KB_Init:键盘初始化函数--------------------------------------------------- //功 能:初始化键盘中断的引脚,但未开放键盘中断 //参 数:无 //返 回:无 //------------------------------------------------------------------------- void KB_Init(void) { KB_P = 0x00; //复位KB_P KB_D = 0x0F; //定义7-4为输入,3-0为输出 KB_PE = 0xF0; //定义KB_P.7-4允许上拉或下拉 KB_PS = 0x00; //定义KB_P.7-4上拉电阻,并且下降沿产生中断 KB_IE = 0x00; //定义KB_P.7-4输入引脚禁止中断 KB_IF = 0xFF; //清除键盘中断标志位(写1清) .. } 0xFF tmp = 0xFF; return (tmp); //KB_Scan1:扫描读取键值函数 ------------------------------------------------ } //功 能:扫描一次4*4键盘上的按键,读取 键值->*p;若无按键,*p为0xff //KB_ScanN:多次扫描键盘函数//参 数:无 ------------------------------------------------ //返 回:扫描到的键值 // 功 能 :多次扫描键盘,消除 \ 抖动 \ //------------------------------------------------------//参 数:KB_count=多次扫描键盘的的次数 ------------------- INT8U KB_Scan1(void) { INT8U line,i,tmp; line=0xFE; //使第一根行 线为0(低电平) for (i = 1; i <= 4; i++) //最多将扫描 4根行线 { //当前扫描的一行,输出低电平 tmp = KB_P; tmp |= 0X0F; KB_P = tmp & line; asm(\ asm(\ //读取键盘口数据寄存器 tmp = KB_P; //通过观察4根列线中是否出现低 电平来判断当前行有无按键 tmp &= 0XF0; //仅保留列线的 值 if (tmp != 0xF0) //当前行有键按下 { tmp=KB_P; //读取 扫描到的键值 break; //退出循环不再扫描 } else //当前行无按键,准备扫描下一行 line = (line << 1) | 0x01; } if (i == 5) //无按键,以后将返回;. //返 回:多次扫描键盘得到的键值: // 正常按键--KB_value_now; 非正常按键(包括无按键)--0xFF //内部调用函数:KB_Scan1 //------------------------------------------------------------------------- INT8U KB_ScanN(INT8U KB_count) { INT8U i,KB_value_last,KB_value_now; if (0 == KB_count || 1 == KB_count) return KB_Scan1(); //先扫描一次得到的键值,便于下面比较 KB_value_now = KB_value_last = KB_Scan1(); //以下多次扫描消除误差 for (i=0; i KB_value_now = KB_Scan1(); if (KB_value_now == KB_value_last) return KB_value_now; //返回扫描的键值 else KB_value_last = KB_value_now; } return 0xFF; //返回出错标志 } //KB_Def:键值转为定义值函数 ------------------------------------------------ //功 能:键值转为定义值 //参 数:KB_valve=键值 //返 回:KeyPress=键定义值 .. //------------------------------------------------------ } ------------------- } return KeyPress; //键盘定义表 const INT8U KB_Table[]= { 0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A', 0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B', 0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C', 0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D', 0x00 }; INT8U KB_Def(INT8U KB_valve) { INT8U KeyPress; INT8U i; INT8U j; i = 0; while (1) { j = KB_Table[i]; //与0(定义表结束标志)相比较 if (j == 0) //=0,即表中无次定义值 { KeyPress = 0xFF; //返回0xFF break; } else { //与键值相比较 if(j == KB_valve) //找到 { KeyPress = KB_Table[i+1]; //取键定义值 break; } else { i +2; //指向下一个键值,继续判断 } ;. //返回键定义值 } 5、PWM驱动模块子函数(包括PWM.h和PWM.c) 入口参数: 出口参数: 调用函数:PWMInit、PWMSetting 功 能:定时产生固定10ms的脉冲 调试时间:2012-6-7 作 者: (1)PWM.h源程序 //[PWM.h]脉宽调制头文件----------------------------------------------------- //脉宽调制相关函数声明 //PWM初始化函数声明 void Pwm_Init( ) ; (2)PWM.c源程序 //[PWM.c]脉宽调制 ------------------------------------------------------- // 本文件包含 : // (1)PWMInit:PWM初始化 // (2)PWMSetting:设置PWM周期和占 空比设置 //------------------------------------------------------ #include #include \ void Pwm_Init(void) { PWME_PWME3 = 0; PWMPRCLK_PCKB= 2; // clockA=总线时钟/4 PWMCLK_PCLK3 = 0; //通道3选用clockB为时钟源 PWMPOL_PPOL3 = 1; //通道3首先输出高电平 PWMCAE = 0x00; //输出 .. 左对齐 //TimerInit:定时器初始化函数 ----------------------------------------------- PWMCTL = 0x00; //非级 联模式 //功 能:定时器初始化,中断一次时间为 PWMDTY3 = 255; 1/38秒 PWMPER3 = 255; //通道3//参 数:无 的周期寄存器 //返 回:无 PWME_PWME3 = 1; } 6、定时器中断子程序(包括Timer.h和 Timer.c) 入口参数: 出口参数: 调用函数:TimerInit、TimerUpDate、 TimInterCount; 功 能:设计定时器中断的时间 调试时间: 作 者: (1)Timer.h源程序 //[Timer.h]定时器头文件----------------------------------------------------- //定时器相关函数声明 void TimerInit(void); //定时器初 始化函数声明 void TimerUpDate(void); //定时器 更新函数声明 //外部变量声明 extern INT8U time[3]; //存放时,分,秒 extern INT8U TimInterCount; //中断次数 (2)Timer.c源程序 //[Timer.c]定时器-------------------------------------------------------- //本文件包含: // (1)TimerInit:定时器初始化 // (2)TimerUpDate:定时器更新 //------------------------------------------------------ #include #include \ //定时器头文件 ;. //------------------------------------------------------------------------- void TimerInit(void) {//禁止定时器溢出中断,分频因子p=8 //中断一次时间计算:t=n/(fbus/p)=1/38秒,其中n=65535,fbus=19.6608MHZ TSCR2 = 0x03; TSCR1 = 0x80; //允许主定时器开始计数 } //TimerUpDate:定时器更新函数 ----------------------------------------------- //功 能:更新显示的时间 //参 数:无 //返 回:无 //------------------------------------------------------------------------- void TimerUpDate(void) { time[2]++; //秒数加1 if (time[2] != 60) goto isrTIMER1_exit; //秒数未增加到60,转 time[2] = 0; time[1]++; //秒数增加到60,清0,分钟数加1 if (time[1] != 60) goto isrTIMER1_exit; //分钟数未增到60,转 time[1] = 0; time[0]++; //分钟数增加到60,清0,小时数加1 if (time[0] != 24) goto isrTIMER1_exit; // 小时数未增到 24, 转 time[0] = 0; // 时数增加 到24,清0 isrTIMER1_exit: TimInterCount = 0; //中断次数清零 }