ARM6818开发板输入设备(触摸屏)操作(开发五子棋游戏)

简介: ARM6818开发板输入设备(触摸屏)操作(开发五子棋游戏)

目录


6818输入设备

输入设备

输入设备在头文件中定义的结构体

练习:获取手指触摸的指标,并且触摸后切换图片

操作一个触摸屏

五子棋游戏开发

实现功能

实现代码

main.c

pm.h

pm.c

ev.h

ev.c


正文


6818输入设备


输入设备


输入设备在头文件中定义的结构体


键盘、鼠标、触摸屏、麦克风.....

       Linux下面这些输入设备也是一个文件,都包含一个头文件 #include <linux/input.h>

       在头文件中定义了一个结构体

       struct input_event

       {

           struct timeval time;//输入时间产生的时间

           __u16 type;//输入事件的类型

                           #define EV_SYN 0x00 同步事件,用来同步数据

                           #define EV_KEY 0x01 按键事件,如键盘,触摸屏的接触与离开

                           #define EV_REL 0x02 相对事件,如鼠标的移动

                           #define EV_ABS 0x03 绝对事件,如触摸屏的坐标

           __u16 code;//编码,为了区分同一事件类型下,不同的输入事件

                           #define BTN_TOUCH 0x14a(330) 接触触摸屏或者离开触摸屏

                           #define ABS_X       0x00          触摸屏坐标的X轴

                           #define ABS_Y       0x01       触摸屏的Y轴

                           #define    ABS_PRESSURE 0x18    触摸屏的压力值事件

           __s32 value;//值,根据type,code的不同,有不同的含义

                           如:type = 按键类型

                               code = BTN_TOUCH

                               value = 按键的状态

                             

                               type = EV_ABS

                               code = ABS_X

                               value = x坐标

                             

       }


练习:获取手指触摸的指标,并且触摸后切换图片


/*
    获取触摸点的位置
    判断触摸动作(点击,右滑等)
*/
int Get_ev(int *x,int *y)
{
  int fd = open("/dev/input/event0",O_RDONLY);
  if(-1 == fd)
  {
    perror("open error");
    return -1;
  }
  struct input_event ev;
  int x1,y1;
  while(1)
  {
    read(fd,&ev,sizeof(ev));
    printf("ev_type = %d code = %d value = %d\n",ev.type,ev.code,ev.value); 
    if(ev.type == EV_ABS)      //输入事件的类型为绝对事件,如触摸屏的坐标
    {
      if(ev.code == 0)       //触摸屏坐标的X轴
      {
        x1  = ev.value;//6818开发板如果是黑底,x1  = ev.value * 800 / 1024。我这里是蓝底的
      }
      else                   //触摸屏坐标的X轴
      {
        y1 = ev.value ;//6818开发板如果是黑底y1 = ev.value * 480 / 600
      }
    }
    if(ev.type == EV_KEY && ev.code == 330 && ev.value == 1)//保存初始坐标
    {
      *x = x1;
      *y = y1;
    }
    if(ev.type == EV_KEY && ev.code == 330 && ev.value == 0)
    {
      if(*x == x1 && *y == y1)     //点击
      {
        printf("dianji\n");
      }
      if(x1 >= *x)                 //右滑
      {
        printf("zouhua\n");
      }
      break;
    }
  }
}
//写入BMP格式的图片
int Dis_pic(char *pic)
{
  int fd = open(pic,O_RDONLY);
  if(-1 == fd)
  {
    perror("open error");
    return -1;
  }
  int width,heigh;
  short depth;
  lseek(fd,0x12,SEEK_SET);
  read(fd,&width,4);
  read(fd,&heigh,4);
  lseek(fd,0x1c,SEEK_SET);
  read(fd,&depth,2);
  printf(" %d  %d  %d\n",width,heigh,depth);
  int laizi =(4 - (width * depth / 8) % 4) % 4;//要加的点
  unsigned char color_buf[heigh * (width * depth / 8 + laizi)];//32 24 
  char color_a = 0,color_r,color_g,color_b; //颜色分量
  unsigned int color;//像素点的颜色
  unsigned char *p = color_buf;
  lseek(fd,0x36,SEEK_SET);
  for(int i = heigh - 1;i >= 0;i--)
  {
    for(int j = 0;j < width;j++)
    {
      color_b = *p++;//b颜色
      color_g = *p++;
      color_r = *p++;
      if(32 == depth)
      {
        color_a = *p++;
      }
      //      0000 0000 0000 0000 0000 0000 1111 1111
      //    0000 0000 0000 0000 1111 1111 0000 0000
      //color 1111 1111 1111 1111 1111 1111 1111 1111
      color = color_a << 24 | color_r << 16 | color_g << 8 | color_b;//屏幕需要的颜色a r g b
      Display(color, j, i);
    }
    p += laizi;
  }
}


操作一个触摸屏


打开触摸屏文件(/dev/input/event0)

   创建一个结构体,保存数据

   循环读取触摸屏的数据

   关闭文件

   

运行上述代码后,点击屏幕会返回以下运行日志

ev_type = 3 code = 0 value = 561
ev_type = 3 code = 1 value = 333
(561,333)//最开始坐标
ev_type = 1 code = 330 value = 1//第一次接触触摸屏
ev_type = 0 code = 0 value = 0
ev_type = 1 code = 330 value = 0//离开触摸屏
ev_type = 0 code = 0 value = 0


五子棋游戏开发


实现功能


有游戏开始界面,点击后进入游戏界面,判断五子连珠后弹出游戏结束界面(有部分冗余代码是做其他测试用的)


mian.c          //主函数,初始化输入设备,运行 游戏函数


pm.c            //画棋盘以及白字黑字的落子,还有图片写入等屏幕写入函数


ev.c             //落子的具体坐标,判断五子连珠


实现代码


main.c


#include "pm.h"
#include "ev.h"
#include <stdio.h>
int main()
{
  int x,y;
  Lcd_Init();
  Dis_pic("kaishi.bmp");  //写入游戏开始界面
  Get_ev(&x,&y);
  return 0;
}


pm.h


#ifndef __LCD_H__
#define __LCD_H__
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <math.h>
void se();
int Lcd_Init();
void Dis_wh();
void Display( int color,int x,int y);
int Dis_pic(char *pic);
void Dis_pan();
void Dis_xian();
void Dis_baizi(int x,int y);
void Dis_heizi(int x,int y);
#endif


pm.c

#include <stdio.h>
#include "pm.h"
unsigned int *plcd =NULL;
void Display( int color,int x,int y)
{
  if(x >= 0 && x <=800 && y >= 0 && y <= 480){
    *(plcd + y * 800 + x) = color;
  }
}
void se()
{
  int fd = open("/dev/fb0",O_RDWR);
  if(fd == -1)
  {
    perror("open error");
  }
  int color[10] = {0x10900,0xff00ff,0xf0394f,0xf009ba9f,0xf066f3,0x856fa,0x9392c83b};
  int j=0;
  while(1){
    for(int i=0;i<384000;i++){
      int w = write(fd,&color[j],4);
      if(-1 == w)
      {
        perror("write error");
      }
    }
    sleep(2);
    j++;
    if(j==7) j=0;
    lseek(fd,0,SEEK_SET);//定位光标在文件头
  }
}
int Lcd_Init()
{
  int fd = open("/dev/fb0",O_RDWR);
  if(fd == -1){
    perror("open error");
    return -2;
  }
  plcd = mmap(NULL,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
}
void Dis_wh()
{
  //int color[10] = {0x190f0,0xff00ff,0xff,0xff0000ff,0xf0f083,0x8596fa,0x298c83b};
  //int q=0;
  //while(1){
    for (int i = 0;i <= 880;i++){
      for(int j = 0;j < 480;j++){
        //int p = 
        if(((i-400)*(i-400) + (j-240)*(j-240) - 1)*((i-400)*(i-400) + (j-240)*(j-240) - 1)*((i-400)*(i-400) + (j-240)*(j-240) - 1)< (i-400)*(i-400) - (j-240)*(j-240)){
          Display(0xf0f083, i, j);
        }
      }
    //}
    //sleep(2);
    //q++;
    //if(q==7) q=0;
  }
}
//画图片
int Dis_pic(char *pic)
{
  int fd = open(pic,O_RDONLY);
  if(-1 == fd)
  {
    perror("open error");
    return -1;
  }
  int width,heigh;
  short depth;
  lseek(fd,0x12,SEEK_SET);
  read(fd,&width,4);
  read(fd,&heigh,4);
  lseek(fd,0x1c,SEEK_SET);
  read(fd,&depth,2);
  printf(" %d  %d  %d\n",width,heigh,depth);
  int laizi;
  unsigned char color_buf[width * heigh * depth / 8];//32 24 
  char color_a = 0,color_r,color_g,color_b; //颜色分量
  unsigned int color;//像素点的颜色
  char *p = color_buf;
  lseek(fd,0x36,SEEK_SET);
  read(fd,color_buf,width * heigh * depth / 8);
  for(int i = heigh - 1;i >= 0;i--)
  {
    for(int j = 0;j < width;j++)
    {
      color_b = *p++;//b颜色
      color_g = *p++;
      color_r = *p++;
      if(32 == depth)
      {
        color_a = *p++;
      }
      color = color_a << 24 | color_r << 16 | color_g << 8 | color_b;//屏幕需要的颜色a r g b
      Display(color, j, i);
    }
  }
}
void Dis_pan()
{
  for(int i = 0;i < 800;i++){
    for(int j = 0;j < 480;j++){
      Display(0xf0f00f, i, j);
    }
  }
}
void Dis_xian()
{
  for(int i = 50;i <= 650;i+=50){
    for(int j = 20;j < 460;j++){
      Display(0x0, i, j);
    }
  }
  for(int i = 20;i <= 460;i+=40){
    for(int j = 50;j < 650;j++){
      Display(0x0, j, i);
    }
  }
}
void Dis_baizi(int x,int y)
{
  for(int i = 0;i < 480;i++){
    for(int j = 0;j < 800;j++){
      if((i-x)*(i-x) + (j-y)*(j-y)<170)
      {
        Display(0xffffff, j, i);
      }
    }
  }
}
void Dis_heizi(int x,int y)
{
  for(int i = 0;i < 480;i++){
    for(int j = 0;j < 800;j++){
      if((i-x)*(i-x) + (j-y)*(j-y)<170)
      {
        Display(0x0, j, i);
      }
    }
  }
}

ev.h


#ifndef __EV_H__
#define __EV_H__
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <math.h>
#include <linux/input.h>
int Get_ev(int *x,int *y);
int jud(int a,int b,int c);
#endif

ev.c


#include "ev.h"
#include "pm.h"
int state[12][13]={0};
int jud(int a,int b,int c)
{
  int num=0;
  if(state[a][b]==c)
  {
    for(int i=0;i <= 12;i++)        //判断横
    {
      if(state[a][i]==c)
      {
        num++;
        if(num == 5)
        {
          Dis_pic("t5.bmp");
          return 2;
          break;
        }
      }
      else num=0;
    }
    for(int i=0;i <= a+4;i++)        //判断竖
    {
      if(state[i][b]==c)
      {
        num++;
        if(num == 5)
        {
          Dis_pic("t5.bmp");
          return 2;
          break;
        }
      }
      else num=0;
    }
    if(a<=b)                        //判断左上到右下
    {
      for(int i=0,j=b-a;i<12 && j<13;i++,j++)
      {
        if(state[i][j]==c)
        {
          num++;
          if(num == 5)
          {
            Dis_pic("t5.bmp");
            return 2;
            break;
          }
        }
        else num=0;
      }
    }
    else if(a>b)                     //判断左上到右下
    {   
      for(int j=0,i=a-b;i<12 && j<13;i++,j++)
      {
        if(state[i][j]==c)
        {
          num++;
          if(num == 5)
          {
            Dis_pic("t5.bmp");
            return 2;
            break;
          }
        }
        else num=0;
      }
    }
    if(a>=b)     //判断右上到左下
    {
      for(int i=a+b,j=0;i>=0;i--,j++)
      {
        if(state[i][j]==c)
        {
          num++;
          if(num == 5)
          {
            Dis_pic("t5.bmp");
            return 2;
            break;
          }
        }
        else num=0;
      }
    }
    if(b>a)     //判断右上到左下
    {
      for(int i=11,j=b+a-11;j<=12;i--,j++)
      {
        if(state[i][j]==c)
        {
          num++;
          if(num == 5)
          {
            Dis_pic("t5.bmp");
            return 2;
            break;
          }
        }
        else num=0;
      }
    }
  }
}
int Get_ev(int *x,int *y)
{
  int fd = open("/dev/input/event0",O_RDONLY);
  if(-1 == fd)
  {
    perror("open error");
    return -1;
  }
  struct input_event ev;
  int x1,y1,q=0,w;
  while(1)
  {
    read(fd,&ev,sizeof(ev));
    printf("ev_type = %d code = %d value = %d\n",ev.type,ev.code,ev.value); 
    if(ev.type == EV_ABS)
    {
      if(ev.code == 0)//x
      {
        x1 = ev.value;
      }
      else
      {
        y1 = ev.value;
      }
    }
    if(ev.type == EV_KEY && ev.code == 330 && ev.value == 1)//保存初始坐标
    {
      *x = x1;
      *y = y1;
    }
    //点击
    if(ev.type == EV_KEY && ev.code == 330 && ev.value == 0)
    {
      if(*x == x1 && *y == y1)//点击
      {
        printf("dianji\n");
        Dis_pan();
        Dis_xian();
        break;
      }
    }
  }
  while(1)
  {
    read(fd,&ev,sizeof(ev));
    printf("ev_type = %d code = %d value = %d\n",ev.type,ev.code,ev.value); 
    if(ev.type == EV_ABS)
    {
      if(ev.code == 0)//x
      {
        x1 = ev.value;// 1024
      }
      else
      {
        y1 = ev.value;
      }
    }
    if(ev.type == EV_KEY && ev.code == 330 && ev.value == 1)//保存初始坐标
    {
      *x = x1;
      *y = y1;
    }
    //点击
    if(ev.type == EV_KEY && ev.code == 330 && ev.value == 0)
    {
      if(*x == x1 && *y == y1)//点击
      {
        printf("dianji\n");
        for(int i = 20;i <= 460;i+=40)
        {
          for(int j = 50;j <= 650;j+=50)
          {
            int a,b;
            a=(i-20)/40;
            b=(j-50)/50;
            if(q == 0 && (*x - j)*(*x - j) + (*y - i)*(*y - i) < 400 && state[a][b] == 0)
            {
              Dis_heizi(i, j);
              state[a][b]=1;
              printf("%d--%d--%d",a,b,state[a][b]);
              w = jud(a,b,1);
              q++;
              break;
            }
            else if(q == 1 && (*x - j)*(*x - j) + (*y - i)*(*y - i) < 400 && state[a][b] == 0)
            {
              Dis_baizi(i, j);
              state[a][b]=2;
              w = jud(a,b,2);
              q--;
              break;
            }
          }
          if(w == 2) break;
        }
      }
    }
  }
}
相关文章
|
6月前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
124 0
|
6月前
|
传感器 物联网 网络架构
ENS、IoT设备、X86、ARM
ENS(Enterprise Name Service)是企业名称服务,是一种为物联网设备提供命名和寻址服务的技术。ENS通过为物联网设备分配唯一的名称和地址,使得物联网设备可以被网络中的其他设备和服务所识别和访问。 IoT设备(Internet of Things device)是连接到互联网的物理设备,可以收集和共享数据,用于监测、控制和优化各种业务流程和操作。IoT设备包括各种传感器、执行器、网关和路由器等。
88 2
|
3月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
109 3
|
6月前
|
Linux
【ARM】迅为rk3568开发板buildroot添加桌面应用
【ARM】迅为rk3568开发板buildroot添加桌面应用
184 0
|
6月前
|
Linux 开发工具 芯片
玩转 PI 系列 - 如何在 Rockchip Arm 开发板上安装 Docker Tailscale K3s Cilium?
玩转 PI 系列 - 如何在 Rockchip Arm 开发板上安装 Docker Tailscale K3s Cilium?
|
6月前
|
存储 Ubuntu Linux
ARM-Linux开发与MCU开发的不同之处分析
ARM-Linux开发与MCU开发的不同之处分析
67 0
ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
542 0
|
测试技术 异构计算
Xines广州星嵌全新FPGA开发板—OMAPL138/C6748 DSP+ARM+FPGA
基于广州星嵌TI OMAP-L138(浮点DSP C6748+ARM9) +Xilinx Spartan-6 FPGA工业核心板
|
Linux C++
基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号
127 0
|
芯片
基于友善之臂ARM-ContexA9-ADC驱动开发
基于友善之臂ARM-ContexA9-ADC驱动开发
93 0