嵌入式系统设计性实验报告

..

//-------------------------------------------------------------------------

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 //头文件

#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 /* common defines and macros */ #include /* derivative information */

#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 #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; //中断次数清零

}

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4