本文共 4988 字,大约阅读时间需要 16 分钟。
一、实验目的
1、 了解树莓派处理中断的方式 2、 了解树莓派是如何通过事件来代替传统中断的 3、 掌握利用C++语言,通过树莓派的 GPIO 口读取3按钮模块的按下状态 4、 利用QT编写一个窗口界面,在界面中显示按钮被按下的状态二、实验原理
本实验以树莓派作为控制器,以 C++ 作为开发工具,利用树莓派的 GPIO,读取一 个 3 按钮模块的状态,使用一个全局变量 X,当按下绿色按钮,X 加 1;当按下黄色按钮, X 清零;当按下红色按钮,X 减 1。并在 LED 模块中显示 X;利用 QT 编写一个窗口界面, 将X的数据实时显示出来,并显示按钮状态三、使用仪器、材料
1.树莓派的GPIO模块 (General Purpose Input/Output通用型输入输出) 2.4位LED显示模块 3.按钮模块 4.直流电源 5.电源模块 6.开发工具:基于QT上的C++开发树莓派四、实验步骤
五、实验过程原始记录(计算机源代码)
#ifndef THREAD1_H#define THREAD1_H#include "wiringPi.h"//#include//class Thread1 : public QThread//{ Q_OBJECTpublic: Thread1();//protected: void run();//signals:// 用于发送的信号函数 void send(int a, int b, int c, int d);};#endif#ifndef THREAD2_H#define THREAD2_H#include "wiringPi.h"//#include //static unsigned char LED_f[] ={ // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x8c, 0xbf, 0xc6, 0xa1, 0x8e, 0xbf, 0xff, 0x7f, 0xbf};class Thread2 : public QThread//{ Q_OBJECTpublic: Thread2();// int SCLK = 0, RCLK = 2, DIO = 3;//LED的SCLK(串行时钟),RCLK(接收时钟),DIO(数据),分别连接GPIO的三个数字引脚 void LED_init(){ // wiringPiSetup(); pinMode(SCLK, OUTPUT); pinMode(RCLK, OUTPUT); pinMode(DIO, OUTPUT); } //在SCLK上输出脉冲信号 void LED_out(char data){ for (int i = 8; i >= 1; i--) // 循环8次为1字节 { if (data & 0x80) digitalWrite(DIO, HIGH); else digitalWrite(DIO, LOW); delayMicroseconds(1); data <<= 1; digitalWrite(SCLK, LOW); delayMicroseconds(1); digitalWrite(SCLK, HIGH); delayMicroseconds(1); } } // 在RCLK上输出脉冲信号 void LED_display(unsigned char p, int v){ unsigned char* led_table; unsigned char i; led_table = LED_f + v;// i = *led_table; LED_out(i); LED_out(p); digitalWrite(RCLK, LOW);// delayMicroseconds(1); digitalWrite(RCLK, HIGH); delayMicroseconds(1); } //在4位的LED上显示一个4位数据 void LED_loop(int data) { LED_display(0x08, data / 1000 % 10); delayMicroseconds(10); LED_display(0x04, data / 100 % 10); delayMicroseconds(10); LED_display(0x02, data / 10 % 10); delayMicroseconds(10); LED_display(0x01, data % 10); delayMicroseconds(10); }protected:// void run();};#endif#ifndef MAINWINDOW_H#define MAINWINDOW_H#include "thread1.h"#include "thread2.h"//#include //namespace Ui { class MainWindow;}class MainWindow : public QMainWindow{ // Q_OBJECTpublic: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); Thread1 *th_1; Thread2 *th_2;private:// Ui::MainWindow *ui;public slots:// 用于接收的槽函数 void receive(int a, int b, int c, int d);};#endif#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); th_1 = new Thread1();// 创建线程和开启线程 th_2 = new Thread2(); th_1 -> start();// th_2 -> start(); connect(th_1,SIGNAL(send(int, int, int, int)),this,SLOT(receive(int, int, int, int))); // 连接信号与槽}MainWindow::~MainWindow(){ delete ui;}void MainWindow::receive(int a, int b, int c, int d){ // 将数据显示到Qt界面 ui -> label_5 -> setText(QString::fromStdString(std::to_string(a))); ui -> label_6 -> setText(QString::fromStdString(std::to_string(b))); ui -> label_7 -> setText(QString::fromStdString(std::to_string(c))); ui -> label_8 -> setText(QString::fromStdString(std::to_string(d)));}#include "thread1.h"#include "thread2.h"//#include "wiringPi.h"//static int data1 = 0,data2 = 0,data3 = 0;//static int value = 10;static int nums[3] = { 12,13,14};//定义数组,代表按键模块k1\k2\k3连接的GPIO数字引脚编号void key_interrupt_service_1() // 中断函数{ delay(20); // 按键消抖 if (digitalRead(12) == 0){ data1 = 1; data2 = 0; data3 = 0; value++; } if (digitalRead(14) == 0){ data1 = 0; data2 = 1; data3 = 0; if(value > 0){ value--; } } if (digitalRead(13) == 0){ data1 = 0; data2 = 0; data3 = 1; value=0; }}void key_init() { // wiringPiSetup();// 初始化wiringPi for(int i = 0;i<3;i++){ pinMode(nums[i], INPUT); pullUpDnControl(nums[i], PUD_UP); // 设置上拉电阻 wiringPiISR(nums[i], INT_EDGE_FALLING, &key_interrupt_service_1); // 注册中断程序 }}Thread1::Thread1(){ }void Thread1::run(){ // key_init(); // 初始化按键 while (1){ delay(10); emit send(value, data1, data2, data3); delay(1000); }}Thread2::Thread2(){ }void Thread2::run(){ // LED_init(); // 初始化LED while(1){ LED_loop(value); // }}
实验结果
转载地址:http://uyed.baihongyu.com/