龙芯技术社区
直播中

马博

13年用户 71经验值
擅长:操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟
私信 关注
[2K系列]

【龙芯2K0300蜂鸟板试用】第六篇 龙芯2K0300蜂鸟板--用QT点灯

今天将前几天的工作做了一个汇总,学了几天QT应用,然后尝试用QT来点亮龙芯2k0300蜂鸟板板载的LED灯,以及同步显示该引脚的数字电压值(为将来显示温度/湿度值做准备)。

一. 准备工作

1.我这种操作的前提是修改了对应内核的设备树中关于LED的代码。

2.对LED灯的操作,可以参考我前面的帖子[https://bbs.elecfans.com/jishu_2447791_1_1.html]([2K系列] # 【龙芯2K0300蜂鸟板试用】第四篇 龙芯2K0300蜂鸟板--继续点灯)

二. QT工程

对QT的学习,我个人的理解就是一个界面的美观设计和理解槽/信号的概念。

具体工程由以下3个文件组成。

1.mainwindows.h 主要是LED对应引脚、2个控件(button和lable)、3个内部函数的声明。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QFile>
#include <QLabel>

**#define LED_GPIO_INDEX 	"85"**

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:**    QPushButton *pushButton;
    QLabel      *label;

    int led_init(void);
    void setLedState();**

private slots:
**    void pushButtonClicked();**
};
#endif // MAINWINDOW_H
  1. main.cpp 主要是界面的显示实现
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
  1. mainwindow.cpp 这个文件是工程的核心部分,功能就是每次点击一下button,便会点亮/关闭板载的LED灯,同时在另一边会显示LED灯引脚的数字电压值。这里我的界面布置有问题,懒得调整了。
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>
#include <QMessageBox>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    int ret;

    QList <QScreen *> list_screen =  QGuiApplication::screens();

    this->resize(800, 480);

    pushButton = new QPushButton(this);
    label= new QLabel(this);

    pushButton->setMinimumSize(200, 50);
    pushButton->setGeometry((this->width() - pushButton->width()) /3 ,
                            (this->height() - pushButton->height()) /3,
                            pushButton->width(),
                            pushButton->height()
                            );

    label->setMinimumSize(200, 50);
    label->setGeometry((this->width() - pushButton->width()) *2/3 ,
                       (this->height() - pushButton->height()) *2/3,
                       pushButton->width(),
                       pushButton->height()
                       );

    ret = led_init();

    if (ret == 1 || ret == 2)
       pushButton->setText("未获取到LED设备!");

    connect(pushButton, SIGNAL(clicked()),
            this, SLOT(pushButtonClicked()));
}

MainWindow::~MainWindow()
{
    int fd;
    fd = open("/sys/class/gpio/unexport", O_WRONLY);
    if(fd < 0)
        pushButton->setText("关闭LED设备失败!");

    write(fd, LED_GPIO_INDEX, strlen(LED_GPIO_INDEX));
    ::close(fd);
    pushButton->setText("LED设备关闭成功。");
}

int  MainWindow::led_init()
{
    int fd;
    fd = open("/sys/class/gpio/export", O_WRONLY);
    if(fd < 0)
       return 1 ;

    write(fd, LED_GPIO_INDEX, strlen(LED_GPIO_INDEX));    

    fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/direction", O_WRONLY);
    write(fd, "out", strlen("out"));

    fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/value", O_WRONLY);
    write(fd, "1", 1);

    ::close(fd);
}
void MainWindow::setLedState()
{
    int fd, ret;
    static int value = 0;

    fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/direction", O_WRONLY);
    write(fd, "in", strlen("in"));

    fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/value", O_WRONLY);
    ret = read(fd, &value, sizeof(value));

    label->setText(QString::number(value));

    fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/direction", O_WRONLY);
    write(fd, "out", strlen("out"));

    fd = open("/sys/class/gpio/gpio" LED_GPIO_INDEX "/value", O_WRONLY);
    
    if (!value)
    {
        write(fd, "0", 1);
        pushButton->setText("LED点亮");
        value = 1;
    }
    else
    {
        write(fd, "1", 1);
        pushButton->setText("LED熄灭");
        value = 0;
    }
    
    ::close(fd);
}

void MainWindow::pushButtonClicked()
{
    setLedState();
}
  1. 厂商已经提前在虚拟机中将QT的龙芯交叉编译环境配置好了,所以直接部署工程就行了,操作如图1所示。
    1.png

    图1 部署工程

三. 执行QT工程

将生成的QT文件拷入龙芯2k0300蜂鸟板中,执行操作如图2所示,执行效果如下视频所示。
3.png

图2 操作命令

QT点灯

更多回帖

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