|
楼主 |
发表于 2008-1-29 16:56:54
|
显示全部楼层
使用说明:
1、该头文件还处在更新中,已经可以从PS2键盘中提取所需的键盘扫描码,并能单独存储最后一次的通码和断码。
2、该头文件提供一个Scan_Key_Board_PS2()函数,该函数将PS2键盘的输出模拟成普通的 n*m 键盘扫描的输出模式,即当有键按下时,通过该函数将获得对应的键盘扫描码,当没有键按下时,将获得一个KEY_NULL的返回。
3、该头文件需要的硬件支持为:
一个下降沿触发的外中断,并将.h中的宏KEY_BOARD_PS2_INSERT_INT_ISR_CODE粘贴到中断处理程序中。该外中断接PS2的CLK线。
一个普通端口,接PS2的Data线。
4、将PROC_Key_Board_PS2_Scan()放到定时器的毫秒中断处理程序中,或者放到主程序的超级循环中(但必须保证该程序在超级循环中具有一定的实时性)。
所有针对该头文件的配置都必须放在一个名叫LIB_Config.h的头文件中,一个典型的配置如下:
硬件ATMega16
//PS/2键盘模块
# define KEY_BOARD_PS2_DATA PIN_PD2
# include "RD_TPL_QUEUE.h"
# include "RD_KeyBoard_PS2.h"
大家注意到,宏KEY_BOARD_PS2_DATA实际上被绑定在了PIN_PD2上。
下面的代码你可以看作是伪代码,他实际上描述了该头文件的一个典型使用方法。
void main(void)
{
System_INIT(); //代码初始化
//DISP_BOARD_SET_FLASH_POS(BIT(1));
//DISP_BOARD_SET_ICON(0x0F);
CLS
//Locate(1,1);
//PrintD(123);
//Locate(1,1);
//PrintN(0x1234,4);
while(TRUE) //超级循环
{
UINT8 chLastBreakKey = KEY_NULL;
UINT8 chLastMakeKey = KEY_NULL;
Locate(1,1);
PrintN(Scan_Key_Board_PS2(),2);
chLastBreakKey = PS2_GET_LAST_BREAK_KEY;
if (chLastBreakKey != KEY_NULL)
{
LOCATE(5,1);
PrintN(chLastBreakKey,2);
}
chLastMakeKey = PS2_GET_LAST_MAKE_KEY;
if (chLastMakeKey != KEY_NULL)
{
LOCATE(3,1);
PrintN(chLastMakeKey,2);
}
PROC_Key_Board_PS2_Scan();
}
}
实例工程:点击此处下载ourdev_208916.rar(文件大小:195K)
如果你想直接使用该示例工程,需要在ICCV7的环境下进行工程编译。
硬件上,关于显示,需要两个端口来实现一个8位的排显示。相关的头文件是RD_UseDISPBoard.h。对应的配置也在LIB_Config.h中。例如:
//显示模块
# define DISP_BOARD_START_POS 2
# define _USE_DISP_BOARD_FOR_SPECIAL_POS
# define DISP_BOARD_POSITION PORTA
# define DISP_BOARD_DATA PORTB
# define SYS_TIMER_MS_ADD_UNTILL_OVF g_wSystemTimer
# include "RD_UseDISPBoard.h"
因为我使用的实际上6位排显,所以调整了显示的起始位置:# define DISP_BOARD_START_POS 2
对于扫描位选,硬件决定了,给高电平,对应数码管被选中,这和头文件的默认模式是不同的,所以我要通过宏来设定:# define _USE_DISP_BOARD_FOR_SPECIAL_POS
# define DISP_BOARD_POSITION PORTA 定义了位选端口
# define DISP_BOARD_DATA PORTB 定义了断码端口
# define SYS_TIMER_MS_ADD_UNTILL_OVF g_wSystemTimer 定义了一个用于特效显示用的计数器,该计数器以毫秒为单位单向增加 |
|