社区
嵌入开发(WinCE)
帖子详情
怎么做用户按键啊?想实现(上、下、左、右、确定、返回)功能,MINI2440本身正好有6个键。
weishuai2512
2011-01-14 09:57:51
我用的是WINCE 6.0操作系统,在VS2008下开发程序,现在要做6个按键,怎么实现啊?提供个思路也行啊,最好能给点代码啊
...全文
222
16
打赏
收藏
怎么做用户按键啊?想实现(上、下、左、右、确定、返回)功能,MINI2440本身正好有6个键。
我用的是WINCE 6.0操作系统,在VS2008下开发程序,现在要做6个按键,怎么实现啊?提供个思路也行啊,最好能给点代码啊
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tony0121
2011-03-08
打赏
举报
回复
用驱动的方法比较麻烦,我用的是监听按键的方法类似于消息钩子,把wince传上的key值与我预先设置的key值做匹配
zwl2012
2011-01-26
打赏
举报
回复
createfile打开按键驱动,readfile读取按键值,在自己的应用程序里面判断是否按下或者松手,进而调用这个函数key event发送up或者down或者tab等等消息就可以了。
韩明君
2011-01-24
打赏
举报
回复
[Quote=引用 4 楼 joyanhui 的回复:]
应该是修改 按键驱动的 中断部分
[/Quote]
个人认为建议比较好
qianjun1978
2011-01-19
打赏
举报
回复
正如6楼给你的代码一样,在驱动中再自行添加增加的键的IO设定。
并在新增加的键中增加打印信息->编译生成NK文件->下载到目标板中->测试按键,如果增加的按键驱动成功,就可以在串口中发现你所设定的打印信息。
这是一半的工作量,然后需要在应用程序中设定键盘消息的映射,捕捉它。
嵌入式的半瓶水
2011-01-18
打赏
举报
回复
你贴的是驱动,你修改下按键驱动生成的事件返回值,应用程序捕捉一下按键事件就可以了。
copyman39339005
2011-01-17
打赏
举报
回复
是的 驱动里面硬件中断对应上系统按键信息就行
weishuai2512
2011-01-17
打赏
举报
回复
[Quote=引用 6 楼 ele01 的回复:]
//EINT8 - K1
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
InterruptDone(g_KeySysIntr[0]);
}
//EINT11 - K2
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<11))
{
InterruptDone(g_KeySysIntr[1]);
……
[/Quote] 是不是这样啊,修改好驱动后,需要重新生成内核,然后重新装系统就行了,是这样吧???
UN_ChairMan
2011-01-15
打赏
举报
回复
你按键驱动要发送键盘码吧
xilidecai
2011-01-15
打赏
举报
回复
VS2008是只能做应用开发而不能开发驱动的吧?开发应用程序你先看驱动提供的接口撒,我这里有按键测试的源码,需要联系我:caichang714@126.com
ele01
2011-01-15
打赏
举报
回复
//EINT8 - K1
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
InterruptDone(g_KeySysIntr[0]);
}
//EINT11 - K2
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<11))
{
InterruptDone(g_KeySysIntr[1]);
}
//EINT13 - K3
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<13))
{
InterruptDone(g_KeySysIntr[2]);
}
//EINT14 - K4
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<14))
{
InterruptDone(g_KeySysIntr[3]);
}
//EINT15 - K5
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<15))
{
InterruptDone(g_KeySysIntr[4]);
}
//EINT19 - K6
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<19))
{
InterruptDone(g_KeySysIntr[5]);
}
这里面加入 keybd_event函数 想要什么键就设置什么键 比如
keybd_event(VK_UP,0,0,0);
keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);
就是“上”
91program
2011-01-14
打赏
举报
回复
Keyboard HOOK
lan120576664
2011-01-14
打赏
举报
回复
操作系统有个keybd_event 的API
参考代码
#include <windows.h>
void SetNumLock( BOOL bState )
{
BYTE keyState[256];
GetKeyboardState((LPBYTE)&keyState);
if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
(!bState && (keyState[VK_NUMLOCK] & 1)) )
{
// Simulate a key press
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );
// Simulate a key release
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
}
void main()
{
SetNumLock( TRUE );
}
lan120576664
2011-01-14
打赏
举报
回复
ce6.0要做流驱动
因为不能够直接访问底层
joyanhui
2011-01-14
打赏
举报
回复
应该是修改 按键驱动的 中断部分
weishuai2512
2011-01-14
打赏
举报
回复
以上两位,能不能具体点啊。是不是要修改驱动啊?一下是MINI2440板子上按键的源码
#include <windows.h>
//#include <ceddk.h>
#include <nkintr.h>
//#include <oalintr.h>
#include <pm.h>
#include "pmplatform.h"
#include "Pkfuncs.h"
#include "s2440.h"
volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
volatile INTreg *s2440INT = (INTreg *)INT_BASE;
UINT32 g_KeySysIntr[6];
HANDLE KeyThread;
HANDLE KeyEvent;
HANDLE APIEvent;
BYTE KeyValues[6] = { 0, 0, 0, 0, 0, 0};
void Virtual_Alloc(); // Virtual allocation
DWORD UserKeyProcessThread(void);
const TCHAR szevtUserInput[] = L"FriendlyARM/ButtonEvent";
DWORD UserKeyProcessThread(void)
{
UINT32 IRQ;
HANDLE UserInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
IRQ = 36; //IRQ_EINT8;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[0], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 39; //IRQ_EINT11;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[1], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 41; //IRQ_EINT13;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[2], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 42; //IRQ_EINT14;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[3], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 43; //IRQ_EINT15;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[4], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 47; //IRQ_EINT19;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[5], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[0], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[1], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[2], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[3], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[4], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[5], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
while(1)
{
WaitForSingleObject(KeyEvent, INFINITE);
SetEvent(UserInputEvent);
SetEvent(APIEvent);
RETAILMSG(0,(L"EINTMASK=%X, rGPGCON=%X rGPGDAT=%X\r\n", s2440IOP->rEINTMASK, s2440IOP->rGPGCON, s2440IOP->rGPGDAT));
const char Index[] = { 0, 3, 5, 6, 7, 11, };
for (int i = 0; i < 6; i++) {
int bit_index = Index[i];
bool down = !(s2440IOP->rGPGDAT & (1 << bit_index));
KeyValues[i] = down;
RETAILMSG(0, (L"%s", down ? L"1" : L"0"));
}
RETAILMSG(0, (L"\r\n"));
//EINT8 - K1
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
InterruptDone(g_KeySysIntr[0]);
}
//EINT11 - K2
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<11))
{
InterruptDone(g_KeySysIntr[1]);
}
//EINT13 - K3
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<13))
{
InterruptDone(g_KeySysIntr[2]);
}
//EINT14 - K4
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<14))
{
InterruptDone(g_KeySysIntr[3]);
}
//EINT15 - K5
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<15))
{
InterruptDone(g_KeySysIntr[4]);
}
//EINT19 - K6
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<19))
{
InterruptDone(g_KeySysIntr[5]);
}
}
}
void Virtual_Alloc()
{
// GPIO Virtual alloc
s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440IOP == NULL) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy failed!\r\n")));
}
}
// Interrupt Virtual alloc
s2440INT = (volatile INTreg *) VirtualAlloc(0,sizeof(INTreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440INT == NULL) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440INT,(PVOID)(INT_BASE),sizeof(INTreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualCopy failed!\r\n")));
}
}
}
BOOL WINAPI
DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID Reserved/* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}
BOOL KEY_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;
RETAILMSG(1,(TEXT("USERKEY: KEY_Deinit\r\n")));
for (int i=0; i<6; i++)
InterruptDisable(g_KeySysIntr[i]);
CloseHandle(KeyThread);
CloseHandle(KeyEvent);
CloseHandle(APIEvent);
VirtualFree((void*)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
VirtualFree((void*)s2440INT, sizeof(INTreg), MEM_RELEASE);
return TRUE;
}
BOOL KeyGpioInit()
{
RETAILMSG(1,(TEXT("Key_Gpio_Setting----\r\n")));
//s2440IOP->rGPGUP = 0xffff;
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPG0 == EINT8
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 0)) | (0x6 << 0);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 6)) | (0x2 << 6); // GPG3 == EINT11
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x6 << 12);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10); // GPG5 == EINT13
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 20)) | (0x6 << 20);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 12)) | (0x2 << 12); // GPG6 == EINT14
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 24)) | (0x6 << 24);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 14)) | (0x2 << 14); // GPG7 == EINT15
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1
wxPython 把窗口部件放入框架中
把窗口部件放入框架中 在你的wxPython中,所有的
用户
交互行为都发生在一个窗口部件容器中,它通常被称作窗口,在wxPython 中被称为框架。在这一章中,我们将讨论wxPython中的几个不同样式的框架。这个主要的wx.Frame有几个不同的框架样式,这些样式可以改变wx.Frame的外观。另外,wxPython提供了小型框架和
实现
多文档界面的框架。框架可以使用分隔条来划分为不同的部
基于STM32F103的液晶显示电子钟
摘要: 随着自动化和物联网行业的不断发展,数字信息时代已经到来。在这个以时间为主要提醒的代名词的时候,再加上在这个以数字为主流方向的时刻,数字时钟在生活和工作中显得尤为重要,需求也是不断的增强,对人们生活质量的提高也是尤为重要。 本设计系统就是以液晶进行显示数字时钟的一个微系统设计,本设计三大部分:分别包括信息处理部分、信息采集部分和信息显示部分。其中,信息处理部分是以单片机为核心,外加一些辅助电...
音诺ai翻译机控制NXP i.MX8M
Min
i与DRM权限保护数字内容
音诺AI翻译机基于NXP i.MX8M
Min
i平台,融合DRM与TEE技术,
实现
语音识别、实时翻译及AI模型的安全保护,支持一机一密、加密传输与可信执行环境下的动态解密,兼顾性能与安全。
树莓派 2 Linux 和 Windows10 学习手册(二)
当计算机在磁盘上存储数据时,它可以以两种格式之一存储数据。它可以将数据存储为文本文件,也可以存储为二进制文件。很自然地,当计算机把一切都存储为二进制数据(那些好的旧的 1 和 0)时,究竟是什么使文本文件不同于二进制文件呢?毕竟,文本文件肯定也必须以二进制格式存储。如果你沿着这些思路思考,那么你是非常正确的。与其说是数据本身如何存储,不如说是数据如何读取。欣赏这种差异的最好方法是
想
想
你现在正在读的这一页。你能理解我写的原因是因为我们已经默认使用英语交流。这一页的内容有我们都理解的结构。
linux内核调试指南
前两天,完成了ucos在2440上的移植,以及boot的修改。今天突然
想
到,我在linux下,该如何来编写,调试比较复杂的驱动。我
想
这个问题应该从如何调试内核入手,先转载两个文字,待西西看来。系统搭建过程中,对于系统平台搭建工程师在完成Bootloader 的调试之后就进入Kernel 裁减移植的阶段,其中最重要的一步是Kernel启动的调试,在调试Kernel 过程中通常遇到最常见的问题是启动异常:
Uncompressing Linux.......................
嵌入开发(WinCE)
19,524
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章