微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ARM7 TDMI-S CPU的LPC2103的多功能电子钟

基于ARM7 TDMI-S CPU的LPC2103的多功能电子钟

时间:11-18 来源:互联网 点击:

干扰,输出为“0”(1/0),下一状态返回到“状态0”。这样,利用状态1,实现了按键的消抖处理。“状态2”为等待按键释放状态,因为只有等按键释放后,一次完整的按键操作过程才算完成。从对上图的分析中可以知道,在一次按键操作的整个过程,按键的状态是从“状态0”->“状态1”->“状态2”,最后返回到“状态0”的。并且在整个过程中,按键的输出信号仅在“状态1”时给出了唯一的一次确认按键闭合的信号“1”(其它状态均输出“0”)。所以上面状态机所表示的按键系统,不仅克服了按键抖动的问题,同时也确保在一次按键整个的过程中,系统只输出一次按键闭合信号(“1”)。换句话讲,不管按键被按下的时间保持多长,在这个按键的整个过程中都只给出了一次确认的输出,因此在这个设计中,按键没有“连发”功能,它是一个最简单和基本的按键。一旦有了正确的状态转换图,就可以根据状态转换图编写软件了。在软件中实现状态机的方法和程序结构通常使用多分支结构(IF-ELSEIF-ELSE、CASE等)实现。下面是根据上图、基于状态机方式编写的简单按键接口函数GetKey()。

该简单按键接口函数GetKey()在整个系统程序中应每隔10ms调用执行一次,每次执行时进入用switch结构构成的状态机。switch结构中的case语句分别实现了3个不同状态的处理判别过程,在每个状态中将根据状态的不同,以及key4的值(状态机的输入)确定输出值(keyreturn),和确定下一次按键的状态值(keystate)。函数GetKey()的返回参数提供上层程序使用。返回值为0时,表示按键无动作;而返回1表示有一次按键闭合动作,需要进入按键处理程序做相应的键处理。在函数GetKey()中定义了2个局部变量,其中keyreturn为一般普通的局部变量,每次函数执行时,keyreturn为函数的返回值,总是先初始化为0,只有在状态1中重新置1,作为表示按键确认的标志返回。变量keystate非常重要,它保存着按键的状态值,该变量的值在函数调用结束后不能消失,必须保留原值,因此在程序中定义为“局部静态变量”。通过对按键的扫描程序后,就知道了哪一个独立键盘的按键被按下了,通过void keysure()函数来定义每一个按键的功能。

中断优先级的定义:

LPC2103的向量中断控制器VIC(Vectored Interrupt Controller)具有32个中断请求输入。可将这些中断编程分为3类:FIQ、向量IRQ、非向量IRQ。其中快速中断请求FIQ(Fast Interrupt reQuest)具有最高的优先级。向量IRQ(Vectored IRQ)具有中等优先级。该级别可分配32个中断请求中的16个。32个请求中的任意一个都可分配到16个向量IRQ slot中的任意一个,其中slot0具有最高优先级,而slot15则为最低优先级。非向量IRQ(Non-vectored IRQ)的优先级最低。

在这个多功能时钟的程序设计中,使用了两个中断都是分配为向量IPQ。定时器1作为时钟的基准计数时钟,有最高的优先级;定时器2分配为下一个优先级。相关的语句设置如下:

VICVectCntl0 = 0x20 | 5; /* 定时器1分配为向量IRQ通道0 */

VICVectAddr0 = (UINT32) Timer1ISR; /* 分配中断服务程序地址0 */

VICVectCntl1 = 0x20 | 26; /* 定时器2分配为向量IRQ通道1 */

VICVectAddr1 = (UINT32) Timer2ISR; /* 分配中断服务程序地址1 */

VICIntEnable = 1 < 26; /* 定时器2中断使能 */

VICIntEnable = 1 < 5; /* 定时器1中断使能 */

四、调试过程

由于这次的设计使用的是LPC2103的开发板,所以在硬件上不需要太多的去调试。在利用开发板硬件资源的基础上,由于这次的多功能闹钟设计使用的模块较多,基本上各个模块的调试是分开进行的。主要包括初始化的程序调试、按键子程序调试、LED显示调试这几部分子程序的调试。将这三部分调试成功,那么整个设计的软件部分也就基本完成了。在该课程设计中,采用的集成开发环境是uVision,在软件设计过程中,有时候不小心插入了一个中文的符号(如分号),就会使软件编译不通过,开始在这个错误上浪费不少时间,但后来注意到了这个情况,避免了类似的错误的发生。

我首先进行的是键盘扫描模块的程序设计及调试。该模块主要由按键的状态确认函数(UINT8 GetKey())和按键确认函数(void keysure())共同完成。按键的状态函数主要是由一个返回值来确认按键的状态,开始的时候,由于缺少一个语句:keyreturn=0;即每次进入函数的时候要将按键的状态清零,导致按键在一次按

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top