NXP MCU 技术论坛
登录
直播中
moonyuan
12年用户
157经验值
擅长:可编程逻辑 嵌入式技术 接口/总线/驱动 控制/MCU
私信
关注
[资料]
【AWorks试用体验】Qt 扫描5位物理按键
AWorks
开发板
``
简介
在AP-283Demo 板上有 上.下.左.右.中. 五个按键, 但按键按下去的时候在屏幕上显示哪一个按键按下去了。
视频效果:
[media]http://player.youku.com/player.php/sid/XMTMzMDg2NzE5Mg==/v.swf[/media]
跳线接法
因为有些端口 被屏幕占用了。 所以需要 杜邦线 飞线接到一些没有被占用的端口。
UP KEY: P3.23 -> JBA.Pin5
DOWN KEY: P2.4 -> JBA.Pin9
LEFT KEY: P2.5 -> JBA.Pin8
RIGHT KEY: P3.22 -> JBA.Pin6
OK KEY: P2.6 -> JBA.Pin7
连接好的效果
QT 制作界面
在QT上画上5个按钮。
程序思路:
1)检测按键状态, 需要把对应的端口初始化为GPIO, 输入模式。
int GPIO_Init( char port, char pin, char direc )
{
char buf[100];
int fd;
DIR * dir;
fd = open( "/sys/class/gpio/export", O_WRONLY );
snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d", port * 32 + pin );
if( ( dir = opendir( buf ) ) == NULL )
{
snprintf( buf, sizeof( buf ), "%d", port * 32 + pin );
write( fd, buf, strlen( buf ) );
}
closedir( dir );
close( fd );
snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d/direc
ti
on", port * 32 + pin );
if( fd = open( buf, O_WRONLY ) )
{
if( direc == 0 )
{
write( fd, "out", strlen("out") );
printf( "GPIO %d.%d Output
", port, pin );
}
else
{
write( fd, "in", strlen("in") );
printf( "GPIO %d.%d Input
", port, pin );
}
}
close( fd );
printf( "GPIO %d.%d Init Success..
", port, pin );
return 0;
}
2) 要知道按键 按下 还是松开,需要读取端口值得函数
int readKeyValue( char port, char pin )
{
unsigned char keyValue;
char buf[100];
int fd;
snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d/value", port * 32 + pin );
fd = open( buf, O_RDONLY );
if( read( fd, &keyValue, 1) == -1 )
{
printf( "PIN%d.%d read error
", port, pin );
}
close(fd);
return keyValue;
}
3) 定时查询一下按键的状态, 把状态显示在屏幕上。
QT 有个 QTimer 类, 可以方便得实现定时功能。
然后通过timeout 信号(SIGNAL)触发调用 槽(SLOT) 去执行指定的函数。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
GPIO_Init( 3, 23, 1 );
GPIO_Init( 3, 22, 1 );
GPIO_Init( 2, 6, 1 );
GPIO_Init( 2, 5, 1 );
GPIO_Init( 2, 4, 1 );
QTimer *timer = new QTimer(this);
connect( timer, SIGNAL( timeout() ), this, SLOT( timerTimeOut() ) );
timer -> start( 500 );
}
4) 定时器超时后执行的动作, 查看端口值是否变化, 并在屏幕上刷新状态
void MainWindow::timerTimeOut()
{
i++;
ui->label->setText(QString::number(i));
if( readKeyValue( 3, 23 ) == '0' )
ui -> UP -> setText("UP_PRESS");
else
ui -> UP -> setText("UP");
if( readKeyValue( 2,4 ) == '0' )
ui -> DOWN -> setText("DOWN_PRESS");
else
ui -> DOWN -> setText("DOWN");
if( readKeyValue( 2, 5 ) == '0' )
ui -> LEFT -> setText("LEFT_PRESS");
else
ui -> LEFT -> setText("LEFT");
if( readKeyValue( 3,22 ) == '0' )
ui -> RIGHT -> setText("RIGHT_PRESS");
else
ui -> RIGHT-> setText("RIGHT");
if( readKeyValue( 2,6 ) == '0' )
ui -> OK -> setText("OK_PRESS");
else
ui -> OK -> setText("OK");
}
key.rar
(24.14 KB)
(下载次数: 21, 2015-9-9 20:41 上传)
``
回帖
(1)
zxl_zxl
2016-3-19 16:01:39
飞思卡尔的283板子,QT程序启动有点儿慢,可能跟内存采用16位地址总线的缘故吧
飞思卡尔的283板子,QT程序启动有点儿慢,可能跟内存采用16位地址总线的缘故吧
举报
更多回帖
rotate(-90deg);
回复
相关帖子
AWorks
开发板
矩阵
按键
的
扫描
原理是什么
2022-03-01
599
矩阵
按键
的
扫描
原理简析
2022-01-24
598
【
AWorks
280
试用
】 结项喽
2015-12-12
2684
【
Aworks
280
试用
体验】点亮第一个led
2015-12-12
3408
【
Aworks
280
试用
体验】
试用
进程大汇总(2015.12.27已更新)
2015-11-05
4926
【
Aworks
280
试用
体验】
试用
进程大汇总(2015.11.04已更新)
2015-11-04
2804
【
Aworks
280
试用
体验】
试用
进程大汇总(2015.11.03已更新)
2015-11-03
3012
【
AWorks
试用
体验】+
AWorks
跑试验车监控系统
2015-08-24
10110
【
AWorks
开发板】
试用
进程大汇总(2015.09.30已更新)
2015-08-11
3429
【
AWorks
试用
体验】学习笔记(0)简介
2015-08-01
5668
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分