NXP MCU 技术论坛
直播中

moonyuan

12年用户 157经验值
擅长:可编程逻辑 嵌入式技术 接口/总线/驱动 控制/MCU
私信 关注
[资料]

【AWorks试用体验】Qt 扫描5位物理按键

``简介


在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





IMG_20150909_194947_678.jpg   
连接好的效果




QT 制作界面


   在QT上画上5个按钮。


QQ截图20150909202409.png



程序思路:


   1)检测按键状态, 需要把对应的端口初始化为GPIO, 输入模式。

  1. int GPIO_Init( char port, char pin, char direc )
  2. {
  3.     char buf[100];
  4.     int fd;
  5.     DIR * dir;

  6.     fd = open( "/sys/class/gpio/export", O_WRONLY );

  7.     snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d", port * 32 + pin );

  8.     if( ( dir = opendir( buf ) ) == NULL )
  9.     {
  10.         snprintf( buf, sizeof( buf ), "%d", port * 32 + pin );
  11.         write( fd, buf, strlen( buf ) );
  12.     }
  13.     closedir( dir );
  14.     close( fd );

  15.     snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d/direction", port * 32 + pin );
  16.     if( fd = open( buf, O_WRONLY ) )
  17.     {
  18.         if( direc == 0 )
  19.         {
  20.             write( fd, "out", strlen("out") );
  21.             printf( "GPIO %d.%d Output
  22. ", port, pin );
  23.         }
  24.         else
  25.         {
  26.             write( fd, "in", strlen("in") );
  27.             printf( "GPIO %d.%d Input
  28. ", port, pin );
  29.         }
  30.     }
  31.     close( fd );
  32.     printf( "GPIO %d.%d Init Success..
  33. ", port, pin  );
  34.     return 0;

  35. }

2) 要知道按键 按下 还是松开,需要读取端口值得函数


  1. int readKeyValue( char port, char pin )
  2. {
  3.     unsigned char keyValue;
  4.     char buf[100];
  5.     int fd;

  6.     snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d/value", port * 32 + pin );

  7.     fd = open( buf, O_RDONLY );
  8.     if( read( fd, &keyValue, 1) == -1 )
  9.     {
  10.         printf( "PIN%d.%d read error
  11. ", port, pin );
  12.     }

  13.     close(fd);

  14.     return keyValue;

  15. }

3) 定时查询一下按键的状态, 把状态显示在屏幕上。
    QT 有个 QTimer 类, 可以方便得实现定时功能。
    然后通过timeout 信号(SIGNAL)触发调用 槽(SLOT) 去执行指定的函数。


  1. MainWindow::MainWindow(QWidget *parent) :
  2.     QMainWindow(parent),
  3.     ui(new Ui::MainWindow)
  4. {
  5.     ui->setupUi(this);
  6.     GPIO_Init( 3, 23, 1 );
  7.     GPIO_Init( 3, 22, 1 );
  8.     GPIO_Init( 2, 6, 1 );
  9.     GPIO_Init( 2, 5, 1 );
  10.     GPIO_Init( 2, 4, 1 );

  11.     QTimer *timer = new QTimer(this);
  12.     connect( timer, SIGNAL( timeout() ), this, SLOT( timerTimeOut() ) );
  13.     timer -> start( 500 );
  14. }


4) 定时器超时后执行的动作, 查看端口值是否变化, 并在屏幕上刷新状态

  1. void MainWindow::timerTimeOut()
  2. {

  3.         i++;
  4.             ui->label->setText(QString::number(i));

  5.     if( readKeyValue( 3, 23 ) == '0' )
  6.         ui -> UP -> setText("UP_PRESS");
  7.      else
  8.         ui -> UP -> setText("UP");

  9.     if( readKeyValue( 2,4 ) == '0' )
  10.         ui -> DOWN -> setText("DOWN_PRESS");
  11.      else
  12.         ui -> DOWN -> setText("DOWN");

  13.     if( readKeyValue( 2, 5 ) == '0' )

  14.         ui -> LEFT -> setText("LEFT_PRESS");
  15.      else
  16.         ui -> LEFT -> setText("LEFT");

  17.     if( readKeyValue( 3,22 ) == '0' )
  18.         ui -> RIGHT -> setText("RIGHT_PRESS");
  19.      else
  20.         ui -> RIGHT-> setText("RIGHT");

  21.     if( readKeyValue( 2,6 ) == '0' )
  22.         ui -> OK -> setText("OK_PRESS");
  23.      else
  24.         ui -> OK -> setText("OK");
  25. }



key.rar (24.14 KB)
(下载次数: 21, 2015-9-9 20:41 上传)


`` IMG_20150909_195604_380.jpg IMG_20150909_202020_221.jpg

回帖(1)

zxl_zxl

2016-3-19 16:01:39
飞思卡尔的283板子,QT程序启动有点儿慢,可能跟内存采用16位地址总线的缘故吧
举报

更多回帖

发帖
×
20
完善资料,
赚取积分