博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树莓派c++实验三:按键监测和中断控制实验
阅读量:172 次
发布时间:2019-02-28

本文共 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++开发树莓派

四、实验步骤

  1. 连接:用杜邦线,将树莓派、电源模块、1个LED模块、按键模块的相应引脚连起来;
  2. 编制LED模块显示程序,能显示给定数字;
  3. 用按键对全局变量分别进行加、减、清零操作,并在LED 中显示;
  4. 编制QT的窗口界面,在显示器上显示全局变量的值、显示各个按键输出的值(0还是 1?)。5. 实验完成后,反向上述步骤断电、拆线并整理收拾好

五、实验过程原始记录(计算机源代码)

#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/

你可能感兴趣的文章