arduino 小项目 贪吃蛇(详细)


全部代码放在全文最后可直接复制

硬件介绍

  1. arduino mega2560 不多介绍了
  2. 3.5寸的tft屏(适配arduino)
    请添加图片描述
  3. 自己焊的四个按钮的洞洞板(很丑勿喷)
    请添加图片描述

游戏说明

本游戏写了两种模式
生存模式 :再触到屏幕边缘时和蛇自身时死亡
无敌模式 :不会死亡,同时按住四个键可以退出

  1. 开始键为左键
  2. 上下键可以选择模式
  3. 上下左右键我自己焊接了四个按键分别对应

成品效果

请添加图片描述

arduino tft库

和电脑直接用easyx写贪吃蛇不同arduino的库要找,并且我找了个于类似于easyx的库因为我以前用这个写过贪吃蛇。
还有其他很多库可以选 库的下载包我会放在 我的资源 里 直接下载就行

代码讲解

蛇和食物

用两个结构体

#define SNAKE_NUM 500//定义蛇的最大长度为500
struct Snake//定义🐍蛇的结构体
{
  int s_size; //蛇的节数
  int s_move = 100;//此数值用于定时器的定时
  int dir;  //蛇的方向,在枚举中列举了
  int s_speed;  //移动速度
  int thickness;//蛇的粗细,即半径
  int s_coor[SNAKE_NUM][2];
  int grade;  //得分
  bool islive;//是否活着,,布尔值判断
}snake;
struct Food
{
  int x;  //食物的横坐标
  int y;  //食物的纵坐标
  int r;    //食物大小,(即圆的半径)
  bool flag;  //食物是否被吃、、布尔值判断
}food;

显示蛇和食物

myGLCD.fillCircle 用于绘制一个圆
myGLCD.setColor 设置颜色

void GameDraw() {//画蛇,食物
 // myGLCD.clrScr();
  //绘制蛇
  myGLCD.setColor(0,255,0);   //蓝色
  myGLCD.fillCircle(snake.s_coor[0][0],snake.s_coor[0][1], 5);//绘制一个半径为5的圆
  myGLCD.setColor(0,255,0);
  for (int i = 1; i < snake.s_size; i++)//蛇的每一节都画一个圆
  {//
    myGLCD.fillCircle(snake.s_coor[i][0], snake.s_coor[i][1], snake.thickness);//画圆,半径为5
  }
  //绘制食物
  if (food.flag)///如果food.flag=true=1时执行下面括号内语句
  {
    myGLCD.setColor(random(1000) % 256, random(1000) % 256,random(1000) % 256);
    myGLCD.fillCircle(food.x, food.y, food.r);//(food.x, food.y, food.r)
  }
  myGLCD.setColor(255,255,0);
  myGLCD.setTextSize(2);
  myGLCD.print("grade", 0, 0);
  myGLCD.printNumI(snake.grade,80 ,0);//显示得分
}

上下左右实现

对按键进行判断
digitalRead();
在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。
参数: 参数pin为指定读取状态的引脚编号。
返回值: 返回值为获取到的信号状态,1为高电平,0为低电平。

   void keyControl()//
{
  //判断有无按键
 
    int num=0;
    if(digitalRead(47)==0&&digitalRead(49)==1&&digitalRead(51)==1&&digitalRead(53)==1){
      num=1;
    }   
    if(digitalRead(47)&&!digitalRead(49)&&digitalRead(51)&&digitalRead(53)){
      num=2;
    }
    if(digitalRead(47)&&digitalRead(49)&&!digitalRead(51)&&digitalRead(53)){
      num=3;
    }
    if(digitalRead(47)&&digitalRead(49)&&digitalRead(51)&&!digitalRead(53)){
      num=4;
    }
    switch (num)//
    {
    case 1://
      if (snake.dir != sDOWN)//
        snake.dir = sUP;//
      break;//
    case 2://
      if (snake.dir != sUP)//
        snake.dir = sDOWN;//
      break;//
    case 3://
      if (snake.dir != sRIGHT)//
        snake.dir = sLEFT;//
      break;//
    case 4://
      if (snake.dir != sLEFT)//
        snake.dir = sRIGHT;//
      break;///
    }
  
}

移动蛇

蛇头所在点的位置向上或向下或向左右移动10个像素的位置。
蛇身体的每一节移到前一节的位置
最后一节颜色变成背景颜色

  • 在无敌模式 时当蛇头移到上边界时显示到下边界
  • 在生存模式 里当蛇头移到边界时蛇死亡
void snakeMove_wd()//在无敌模式中蛇的移动
{
  int a[1][2];
  a[0][0] = snake.s_coor[0][0];
  a[0][1] = snake.s_coor[0][1];
    switch (snake.dir)//
  {
  case sUP:
    snake.s_coor[0][1] -= 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][1] <= 0)//超出了上边界
    {
      snake.s_coor[0][1] = HEIGHT;//
    }
    break;//
  case sDOWN://
    snake.s_coor[0][1] += 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][1] >= HEIGHT)//超出了下边界
    {
      snake.s_coor[0][1] = 0;//
    }
    break;//
  case sLEFT://
    snake.s_coor[0][0] -= 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][0] <= 0)//超出了左边界
    {
      snake.s_coor[0][0] = WIDTH;
    }
    break;//
  case sRIGHT://
    snake.s_coor[0][0] += 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][0] >= WIDTH)//超出了右边界
    {
      snake.s_coor[0][0] = 0;
    }
    break;
  }
  myGLCD.setColor(15, 206, 235);
 myGLCD.fillCircle(snake.s_coor[snake.s_size-1][0], snake.s_coor[snake.s_size-1][1], snake.thickness);//画圆,半径为5
  if (snake.islive)//
  {
    for (int i = snake.s_size - 1; i > 1; i--)
    {//让蛇身跟着蛇头移动
      snake.s_coor[i][0] = snake.s_coor[i - 1][0];
      snake.s_coor[i][1] = snake.s_coor[i - 1][1];
    }
    snake.s_coor[1][1] = a[0][1];
    snake.s_coor[1][0] = a[0][0];
  }
}

最终代码

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>              // class methods are in here
UTFTGLUE myGLCD(0x9486,A3,A2,A1,A0,A4);

// Declare which fonts we will be using
#if !defined(SmallFont)
extern uint8_t SmallFont[];    //.kbv GLUE defines as GFXFont ref
#endif
#define HEIGHT 320
#define WIDTH 480
#define SNAKE_NUM 500//定义蛇的最大长度为500
#define INTERVAL 60//定义一个间隔的长度为60在图形化界面里
enum DIR { sUP, sDOWN, sLEFT, sRIGHT, sUPRIGHT };//用枚举列举出蛇的方向
struct Snake//定义🐍蛇的结构体
{
  int s_size; //蛇的节数
  int s_move = 100;//此数值用于定时器的定时
  int dir;  //蛇的方向,在枚举中列举了
  int s_speed;  //移动速度
  int thickness;//蛇的粗细,即半径
  int s_coor[SNAKE_NUM][2];
  int grade;  //得分
  bool islive;//是否活着,,布尔值判断
}snake;
struct Food
{
  int x;  //食物的横坐标
  int y;  //食物的纵坐标
  int r;    //食物大小,(即圆的半径)
  bool flag;  //食物是否被吃、、布尔值判断
}food;

int grade[100];//游戏中存档可存档100个数据
int cnt = 0;//未存档时值为0;
char str[1000];
void GameInt();
void GameDraw();
bool IsInSnake(int x, int y);
void keyControl();
void snakeMove_wd();
void snakeMove_sc();
void EatFood();
void MenuInterface();
void Menu();
//*********************************************************************************************
void GameInt()//游戏的初始化,
{
    //初始化蛇 一开始有三节
  snake.s_size = 4;//定义蛇的节数开始为3节
  snake.s_speed = 1;//速度为1
  snake.dir = rand() % 4;//rand()重新生成随机数,取余后为随机小于4的数,用来随即蛇的初始方向
  snake.grade = 0;//定义蛇的初始分数为0
  snake.thickness = 5;//蛇的半径为5,即蛇的粗细为10;
  snake.islive = true;//布尔值定义为1(true=1);即蛇存在

  //随机初始化蛇头
  snake.s_coor[0][0] = random(2000) % (WIDTH - 2 * snake.thickness) + snake.thickness;
  snake.s_coor[0][1] = random(2000) % (HEIGHT - 2 * snake.thickness) + snake.thickness;
  //初始化食物
  do {//
    food.x = random(2000) % (WIDTH - 2*food.r) + food.r;
    food.y = random(2000) % (HEIGHT - 2*food.r) + food.r;
  } while (IsInSnake(food.x, food.y));//
   //rand()重新生成随机数,取余后为随机小于256的数,颜色RGB(x,y,z)函数,x<=255,y<255,z<255,每一个数对应一个颜色
  food.r = 5;//定义食物的大小
  food.flag = true;//布尔值定义为1(true=1);即食物存在
}
//***********************************************************************************************
void GameDraw() {//画蛇,食物
 // myGLCD.clrScr();
  //绘制蛇
  myGLCD.setColor(0,255,0);
  myGLCD.fillCircle(snake.s_coor[0][0],snake.s_coor[0][1], 5);//绘制一个半径为5的圆
  myGLCD.setColor(0,255,0);
  for (int i = 1; i < snake.s_size; i++)//蛇的每一节都画一个圆
  {//
    myGLCD.fillCircle(snake.s_coor[i][0], snake.s_coor[i][1], snake.thickness);//画圆,半径为5
  }

  //绘制食物
  if (food.flag)///如果food.flag=true=1时执行下面括号内语句
  {
    myGLCD.setColor(random(1000) % 256, random(1000) % 256,random(1000) % 256);
    myGLCD.fillCircle(food.x, food.y, food.r);//(food.x, food.y, food.r)
  }
  myGLCD.setColor(255,255,0);
  myGLCD.setTextSize(2);
  myGLCD.print("grade", 0, 0);
  myGLCD.printNumI(snake.grade,80 ,0);
}
//***********************************************************************************************
bool IsInSnake(int x, int y)//
{
  for (int i = 0; i < snake.s_size; i++)//
  {
    if (x >= snake.s_coor[i][0] - snake.thickness && x <= snake.s_coor[i][0] + snake.thickness &&//蛇头的坐标在蛇的身体
      y >= snake.s_coor[i][1] - snake.thickness && y <= snake.s_coor[i][1] + snake.thickness)//蛇头能否到蛇身体上任意一节圆的上下左右,
      return true;//返回true
  }
  return false;//如果不满足返回false
}
//***********************************************************************************************
void snakeMove_wd()//在无敌模式中蛇的移动
{
  int a[1][2];
  a[0][0] = snake.s_coor[0][0];
  a[0][1] = snake.s_coor[0][1];
    switch (snake.dir)//
  {
  case sUP:
    snake.s_coor[0][1] -= 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][1] <= 0)//超出了上边界
    {
      snake.s_coor[0][1] = HEIGHT;//
    }
    break;//
  case sDOWN://
    snake.s_coor[0][1] += 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][1] >= HEIGHT)//超出了下边界
    {
      snake.s_coor[0][1] = 0;//
    }
    break;//
  case sLEFT://
    snake.s_coor[0][0] -= 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][0] <= 0)//超出了左边界
    {
      snake.s_coor[0][0] = WIDTH;//
    }
    break;//
  case sRIGHT://
    snake.s_coor[0][0] += 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][0] >= WIDTH)//超出了右边界
    {
      snake.s_coor[0][0] = 0;//
    }
    break;//

  }
 myGLCD.setColor(15, 206, 235);
 myGLCD.fillCircle(snake.s_coor[snake.s_size-1][0], snake.s_coor[snake.s_size-1][1], snake.thickness);//画圆,半径为5
  if (snake.islive)//
  {
    for (int i = snake.s_size - 1; i > 1; i--)//
    {//让蛇身跟着蛇头移动
      snake.s_coor[i][0] = snake.s_coor[i - 1][0];//
      snake.s_coor[i][1] = snake.s_coor[i - 1][1];
    }
    snake.s_coor[1][1] = a[0][1];//
    snake.s_coor[1][0] = a[0][0];//
  }
}
//***********************************************************************************************
void snakeMove_sc()//在无敌模式中蛇的移动
{
  int a[1][2];
  a[0][0] = snake.s_coor[0][0];
  a[0][1] = snake.s_coor[0][1];
    switch (snake.dir)//
  {
  case sUP:
     if (IsInSnake(snake.s_coor[0][0], snake.s_coor[0][1] - 2 * snake.s_speed * snake.thickness)) {//
     snake.islive = false;//
     break;//
    }
    snake.s_coor[0][1] -= 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][1] <= 0)//超出了上边界
    {
      snake.islive = false;//蛇死亡
    }
    break;//
  case sDOWN://
  if (IsInSnake(snake.s_coor[0][0], snake.s_coor[0][1] + 2 * snake.s_speed * snake.thickness))//
    {
      snake.islive = false;//
      break;//
    }
    snake.s_coor[0][1] += 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][1] >= HEIGHT)//超出了下边界
    {
     snake.islive = false;//
    }
    break;//
  case sLEFT://

    if (IsInSnake(snake.s_coor[0][0] - 2 * snake.s_speed * snake.thickness, snake.s_coor[0][1]))//
    {
      snake.islive = false;//
      break;//
    }
    snake.s_coor[0][0] -= 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][0] <= 0)//超出了左边界
    {
      snake.islive = false;//
    }
    break;//
  case sRIGHT://
    if (IsInSnake(snake.s_coor[0][0] +2 * snake.s_speed * snake.thickness, snake.s_coor[0][1]))//
    {
      snake.islive = false;//
      break;//
    }
    snake.s_coor[0][0] += 2 * snake.s_speed * snake.thickness;//
    if (snake.s_coor[0][0] >= WIDTH)//超出了右边界
    {
      snake.islive = false;//
    }
    break;//
  }
  myGLCD.setColor(15, 206, 235);
 myGLCD.fillCircle(snake.s_coor[snake.s_size-1][0], snake.s_coor[snake.s_size-1][1], snake.thickness);//画圆,半径为5
  if (snake.islive)//
  {
    for (int i = snake.s_size - 1; i > 1; i--)//
    {//让蛇身跟着蛇头移动
      snake.s_coor[i][0] = snake.s_coor[i - 1][0];//
      snake.s_coor[i][1] = snake.s_coor[i - 1][1];
    }
    snake.s_coor[1][1] = a[0][1];//
    snake.s_coor[1][0] = a[0][0];//
  }
}
//***********************************************************************************************
//通过按键改变蛇的方向
void keyControl()//
{
  //判断有无按键
 
    int num=0;
    if(digitalRead(47)==0&&digitalRead(49)==1&&digitalRead(51)==1&&digitalRead(53)==1){
      num=1;
    }   
    if(digitalRead(47)&&!digitalRead(49)&&digitalRead(51)&&digitalRead(53)){
      num=2;
    }
    if(digitalRead(47)&&digitalRead(49)&&!digitalRead(51)&&digitalRead(53)){
      num=3;
    }
    if(digitalRead(47)&&digitalRead(49)&&digitalRead(51)&&!digitalRead(53)){
      num=4;
    }
    switch (num)//
    {
    case 1://
      if (snake.dir != sDOWN)//
        snake.dir = sUP;//
      break;//
    case 2://
      if (snake.dir != sUP)//
        snake.dir = sDOWN;//
      break;//
    case 3://
      if (snake.dir != sRIGHT)//
        snake.dir = sLEFT;//
      break;//
    case 4://
      if (snake.dir != sLEFT)//
        snake.dir = sRIGHT;//
      break;///
    }
  
}
//***********************************************************************************************
void EatFood()//判断蛇吃食物
{
  if (food.flag && snake.s_coor[0][0] + snake.thickness >= food.x - food.r && snake.s_coor[0][0] - snake.thickness <= food.x + food.r &&
    snake.s_coor[0][1] + snake.thickness >= food.y - food.r && snake.s_coor[0][1] - snake.thickness <= food.y + food.r)//
  {
    food.flag = false;//
    myGLCD.setColor(15, 206, 235);
    myGLCD.fillCircle(food.x, food.y, food.r);//(food.x, food.y, food.r)
    snake.s_size++;//
    snake.grade += 1;//
  }

  if (!food.flag)//
  {//刷新食物
    
    do {//
      food.x = random(2000) % (WIDTH - 2 * food.r) + food.r;//
      food.y = random(2000) % (HEIGHT - 2 * food.r) + food.r;//
    } while (IsInSnake(food.x, food.y));//
    myGLCD.setColor(rand() % 255, rand() % 255, rand() % 255);//
    food.r = 5;//
    food.flag = true;//
  }
}
//***********************************************************************************************

void MenuInterface(){
  myGLCD.setColor(255, 52, 2);
  myGLCD.setTextSize(6);
  myGLCD.print("snake", 150, 20);
  myGLCD.setTextSize(4);
  myGLCD.print("mode live", 100, 120);
  myGLCD.print("mode unlive", 100, 180);

}

//***********************************************************************************************
void Menu()//
{//用户界面菜单
  myGLCD.setColor(15, 206, 235);
  myGLCD.fillRect(0, 0, 480, 320);
  int num=0;
  int ans=1;
  while (1)
  {
    MenuInterface();//
    myGLCD.setColor(0, 0, 0);

    if(digitalRead(47)==0&&digitalRead(49)==1&&digitalRead(51)==1&&digitalRead(53)==1){
        if(ans==2){
          ans--;
        }
    }   
    if(digitalRead(47)&&!digitalRead(49)&&digitalRead(51)&&digitalRead(53)){
        if(ans==1){
          ans++;
        }
    }
    if(ans==1)
    myGLCD.drawRoundRect(100, 120,315,150);
    if(ans==2)
    myGLCD.drawRoundRect(100, 180,360,210);
    if(digitalRead(47)&&digitalRead(49)&&!digitalRead(51)&&digitalRead(53)){
         if(ans==1)
         num=1;
         if(ans==2)
         num=2;
      }

    switch (num)//
    {
    case 1://新游戏
      myGLCD.setColor(15, 206, 235);
      myGLCD.fillRect(0, 0, 480, 320);
      GameInt();//
      while(1){
        if (snake.islive)//
        {
          GameDraw();//
          snakeMove_sc();//
          keyControl();//多次检测键盘输入,提高灵敏度
          keyControl();//
          keyControl();//
          keyControl();//
          EatFood();//
          delay(snake.s_move);//延迟20毫秒
        }
        else//
        {
          
           myGLCD.setColor(255, 52, 2);
          myGLCD.setTextSize(6);
          myGLCD.print("gameover", 100, 20);
          myGLCD.setTextSize(2);
          myGLCD.print("grade", 100, 80);
          myGLCD.printNumI(snake.grade,180 ,80);
          delay(2000);
          myGLCD.setColor(15, 206, 235);
          myGLCD.setTextSize(6);
          myGLCD.print("gameover", 100, 20);
          myGLCD.setTextSize(2);
          myGLCD.print("grade", 100, 80);
          myGLCD.printNumI(snake.grade,180 ,80);
//          myGLCD.clrScr();
//          myGLCD.setColor(15, 206, 235);
//          myGLCD.fillRect(0, 0, 480, 320);
          num=0;
          break;//
        }
    }
      break;//
    case 2://新游戏
      myGLCD.setColor(15, 206, 235);
      myGLCD.fillRect(0, 0, 480, 320);
      GameInt();//
      while(1){
      GameDraw();//
        snakeMove_wd();//
        keyControl();//多次检测键盘输入,提高灵敏度
        keyControl();//
        keyControl();//
        keyControl();//
        EatFood();//
        delay(snake.s_move);//延迟20毫秒
         if(!digitalRead(47)&&!digitalRead(49)&&!digitalRead(51)&&!digitalRead(53)){
          myGLCD.setColor(255, 52, 2);
          myGLCD.setTextSize(6);
          myGLCD.print("gameover", 100, 20);
          myGLCD.setTextSize(2);
          myGLCD.print("grade", 100, 80);
          myGLCD.printNumI(snake.grade,180 ,80);
          delay(2000);
//          myGLCD.setColor(15, 206, 235);
//          myGLCD.setTextSize(6);
//          myGLCD.print("gameover", 100, 20);
//          myGLCD.setTextSize(2);
//          myGLCD.print("grade", 100, 80);
//          myGLCD.printNumI(snake.grade,180 ,80);
          myGLCD.clrScr();
          myGLCD.setColor(15, 206, 235);
          myGLCD.fillRect(0, 0, 480, 320);
          num=0;
          break;//
          }
    }
      break;//
    }
  }
}
//***********************************************************************************************
void setup()
{
  Serial.begin(9600);
  pinMode(47,INPUT_PULLUP);
  pinMode(49,INPUT_PULLUP);
  pinMode(51,INPUT_PULLUP);
  pinMode(53,INPUT_PULLUP);
  Serial.println("start");
  randomSeed(analogRead(5));   //.kbv Due does not like A0
  pinMode(A0, OUTPUT);       //.kbv mcufriend have RD on A0
  digitalWrite(A0, HIGH);
  
// Setup the LCD
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
}
//***********************************************************************************************


void loop()
{
myGLCD.setBackColor(15, 206, 235);
Menu();
}

制作不易给个赞吧

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2.4 贪吃蛇实验/*---------------------------------------------------------------- 320x240彩屏液晶驱动程序 ----------------------------------------------------------------*/ #include"9325tp.h" #include"reg52.h" /*---------------------------------------------------------------- 全局变量 ----------------------------------------------------------------*/ #define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set #define WINDOW_XADDR_END 0x0051 // Horizontal End Address Set #define WINDOW_YADDR_START 0x0052 // Vertical Start Address Set #define WINDOW_YADDR_END 0x0053 // Vertical End Address Set #define GRAM_XADDR 0x0020 // GRAM Horizontal Address Set #define GRAM_YADDR 0x0021 // GRAM Vertical Address Set #define GRAMWR 0x0022 // memory write #define DataPort P0 //数据口使用DataPort /*---------------------------------------------------------------- 定义硬件端口 ----------------------------------------------------------------*/ sbit CS=P2^2; //片选 sbit RES=P2^1; //复位 sbit RS=P2^4; //数据/命令选择 sbit RW=P2^5; /*---------------------------------------------------------------- 清屏函数 输入参数:bColor 清屏所使用的背景色 ----------------------------------------------------------------*/ void CLR_Screen(unsigned int bColor) { unsigned int i,j; LCD_SetPos(0,240,0,320);//320x240 for (i=0;i<320;i++) { for (j=0;j<240;j++) Write_Data_U16(bColor); } } /*---------------------------------------------------------------- 显示英文字符 输入参数:x 横坐标 y 纵坐标 c 需要显示的字符 fColor 字符颜色 bColor 字符背景颜色 ----------------------------------------------------------------*/ #include "8X16.h" void LCD_PutChar8x16(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor) { unsigned int i,j; LCD_SetPos(x,x+8-1,y,y+16-1); for(i=0; i<16;i++) { unsigned char m=Font8x16[c*16+i]; for(j=0;j<8;j++) { if((m&0x80)==0x80) { Write_Data_U16(fColor); } else { Write_Data_U16(bColor); } m<<=1; } } } /*---------------------------------------------------------------- 显示英文字符 输入参数:x 横坐标 y 纵坐标 c 需要显示的字符 fColor 字符颜色 bColor 字符背景颜色 ----------------------------------------------------------------*/ void LCD_PutChar(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor) { LCD_PutChar8x16( x, y, c, fColor, bColor ); } /*---------------------------------------------------------------- 显示汉字 输入参数:x 横坐标 y 纵坐标 c 需要显示的汉字码 fColor 字符颜色 bColor 字符背景颜色 ----------------------------------------------------------------*/ #include "GB1616.h" //16*16汉字字模 void PutGB1616(unsigned short x, unsigned short y, unsigned char c[2], unsigned int fColor,unsigned int bColor){ unsigned int i,j,k; LCD_SetPos(x, x+16-1,y, y+16-1); for (k=0;k<64;k++) { //64标示自建汉字库中的个数,循环查询内码 if ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1])){ for(i=0;i<32;i++) { unsigned short m=codeGB_16[k].Msk[i]; for(j=0;j<8;j++) { if((m&0x80)==0x80) { Write_Data_U16(fColor); } else { Write_Data_U16(bColor); } m<<=1; } } } } } /*---------------------------------------------------------------- 显示字符串 可以中英文同时显示 输入参数:x 横坐标 y 纵坐标 *s 需要显示的字符串 fColor 字符颜色 bColor 字符背景颜色 ----------------------------------------------------------------*/ void LCD_PutString(unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor) { unsigned char l=0; while(*s) { if( *s < 0x80) { LCD_PutChar(x+l*8,y,*s,fColor,bColor); s++;l++; } else { PutGB1616(x+l*8,y,(unsigned char*)s,fColor,bColor); s+=2;l+=2; } } } /*---------------------------------------------------------------- 显示RGB颜色 输入参数:x0,y0 起始坐标 x1,y1 结束坐标 Color 背景颜色 ----------------------------------------------------------------*/ /*void Show_RGB (unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1,unsigned int Color) { unsigned int i,j; LCD_SetPos(x0,x1,y0,y1); for (i=y0;i<=y1;i++) { for (j=x0;j<=x1;j++) Write_Data_U16(Color); } } */ /*---------------------------------------------------------------- 显示图片 图片必须是320x240,否则不能正确识别 ----------------------------------------------------------------*/ /*void show_photo(void) { unsigned char j; unsigned int i; unsigned long s=0; LCD_SetPos(0,240,0,320);//320x240 for (i=0;i<75;i++) { for (j=0;j<240;j++) Write_Data(0xff,0xff); } for (i=0;i<170;i++) { for (j=0;j<55;j++) Write_Data(0xff,0xff); for (j=0;j<130;j++) Write_Data(pic[s++],pic[s++]); for (j=0;j<55;j++) Write_Data(0xff,0xff); } for (i=0;i<75;i++) { for (j=0;j<240;j++) Write_Data(0xff,0xff); } } */ /*---------------------------------------------------------------- 写命令、写数据 输入参数:x 需要输入的命令 16位 y 需要输入的数据 16位 ----------------------------------------------------------------*/ void Write_Cmd_Data (unsigned char x,unsigned int y) { unsigned char m,n; m=y>>8; n=y; Write_Cmd(0x00,x); Write_Data(m,n); } /*---------------------------------------------------------------- 写16位数据 ----------------------------------------------------------------*/ void Write_Data_U16(unsigned int y) { unsigned char m,n; m=y>>8; n=y; Write_Data(m,n); } /*---------------------------------------------------------------- 写命令 ----------------------------------------------------------------*/ void Write_Cmd(unsigned char DH,unsigned char DL) { CS=0; RS=0; DataPort=DH; RW=0; RW=1; DataPort=DL; RW=0; RW=1; CS=1; } /*---------------------------------------------------------------- 写数据 双8位 ----------------------------------------------------------------*/ void Write_Data(unsigned char DH,unsigned char DL) { CS=0; RS=1; DataPort=DH; RW=0; RW=1; DataPort=DL; RW=0; RW=1; CS=1; } /*---------------------------------------------------------------- 延时函数 ----------------------------------------------------------------*/ void delayms(unsigned int count) { int i,j; for(i=0;i<count;i++) { for(j=0;j<260;j++); } } /*---------------------------------------------------------------- 液晶初始化 ----------------------------------------------------------------*/ void ILI9325_Initial(void) { CS=1; delayms(5); RES=0; delayms(5); RES=1; delayms(50); Write_Cmd_Data(0x0001,0x0100); Write_Cmd_Data(0x0002,0x0700); Write_Cmd_Data(0x0003,0x1030); Write_Cmd_Data(0x0004,0x0000); Write_Cmd_Data(0x0008,0x0207); Write_Cmd_Data(0x0009,0x0000); Write_Cmd_Data(0x000A,0x0000); Write_Cmd_Data(0x000C,0x0000); Write_Cmd_Data(0x000D,0x0000); Write_Cmd_Data(0x000F,0x0000); //power on sequence VGHVGL Write_Cmd_Data(0x0010,0x0000); Write_Cmd_Data(0x0011,0x0007); Write_Cmd_Data(0x0012,0x0000); Write_Cmd_Data(0x0013,0x0000); //vgh Write_Cmd_Data(0x0010,0x1290); Write_Cmd_Data(0x0011,0x0227); //delayms(100); //vregiout Write_Cmd_Data(0x0012,0x001d); //0x001b //delayms(100); //vom amplitude Write_Cmd_Data(0x0013,0x1500); //delayms(100); //vom H Write_Cmd_Data(0x0029,0x0018); Write_Cmd_Data(0x002B,0x000D); //gamma Write_Cmd_Data(0x0030,0x0004); Write_Cmd_Data(0x0031,0x0307); Write_Cmd_Data(0x0032,0x0002);// 0006 Write_Cmd_Data(0x0035,0x0206); Write_Cmd_Data(0x0036,0x0408); Write_Cmd_Data(0x0037,0x0507); Write_Cmd_Data(0x0038,0x0204);//0200 Write_Cmd_Data(0x0039,0x0707); Write_Cmd_Data(0x003C,0x0405);// 0504 Write_Cmd_Data(0x003D,0x0F02); //ram Write_Cmd_Data(0x0050,0x0000); Write_Cmd_Data(0x0051,0x00EF); Write_Cmd_Data(0x0052,0x0000); Write_Cmd_Data(0x0053,0x013F); Write_Cmd_Data(0x0060,0xA700); Write_Cmd_Data(0x0061,0x0001); Write_Cmd_Data(0x006A,0x0000); // Write_Cmd_Data(0x0080,0x0000); Write_Cmd_Data(0x0081,0x0000); Write_Cmd_Data(0x0082,0x0000); Write_Cmd_Data(0x0083,0x0000); Write_Cmd_Data(0x0084,0x0000); Write_Cmd_Data(0x0085,0x0000); // Write_Cmd_Data(0x0090,0x0010); Write_Cmd_Data(0x0092,0x0600); Write_Cmd_Data(0x0093,0x0003); Write_Cmd_Data(0x0095,0x0110); Write_Cmd_Data(0x0097,0x0000); Write_Cmd_Data(0x0098,0x0000); Write_Cmd_Data(0x0007,0x0133); // Write_Cmd_Data(0x0022);// } /*---------------------------------------------------------------- 画点 输入参数:x,y 需要画点坐标 color 点的颜色 ----------------------------------------------------------------*/ void Put_pixel(uchar x,uchar y,unsigned int color) { LCD_SetPos(x,x,y,y); Write_Data_U16(color); } /*---------------------------------------------------------------- 设置坐标 ----------------------------------------------------------------*/ static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1) { Write_Cmd_Data(WINDOW_XADDR_START,x0); Write_Cmd_Data(WINDOW_XADDR_END,x1); Write_Cmd_Data(WINDOW_YADDR_START,y0); Write_Cmd_Data(WINDOW_YADDR_END,y1); Write_Cmd_Data(GRAM_XADDR,x0); Write_Cmd_Data(GRAM_YADDR,y0); Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR); } /*---------------------------------------------------------------- 在屏幕上画线 输入参数: 起始坐标X0,Y0,终止坐标X1,Y1 color 线颜色 ----------------------------------------------------------------*/ void Line( uchar X0, uchar Y0, uchar X1, uchar Y1, unsigned int color) { int dx = X1 - X0; int dy = Y1 - Y0; int P = 2 * dy - dx; int dobDy = 2 * dy; int dobD = 2 * (dy - dx); int PointX = 0,PointY = 0; int incx = 0,incy = 0; int distance = 0,xerr = 0,yerr = 0; unsigned int i = 0; if(dx == 0) //k=1斜率为1 { PointX = X0; if(Y0 < Y1) { PointY = Y0; } else { PointY = Y1; } for(i = 0;i <= ((Y0<Y1) ? (Y1-Y0) : (Y0-Y1));i++) { Put_pixel(PointX,PointY,color); PointY++; } return; } if(dy == 0) //k=0斜率为0 { PointY = Y0; if(X0 < X1) { PointX = X0; } else { PointX = X1; } for(i = 0;i <= ((X0<X1) ? (X1-X0) : (X0-X1));i++) { Put_pixel(PointX,PointY,color); PointX++; } return; } if(dx > 0) incx = 1; else if(dx == 0) incx = 0; else incx = -1; if(dy > 0) incy = 1; else if(dy == 0) incy = 0; else incy = -1; dx = ((X0>X1) ? (X0-X1) : (X1-X0)); dy = ((Y0>Y1) ? (Y0-Y1) : (Y1-Y0)); if(dx>dy) distance=dx; else distance=dy; PointX = X0; PointY = Y0; for(i=0;i<=distance+1;i++) { Put_pixel(PointX,PointY,color); xerr+=dx; yerr+=dy; if(xerr>distance) { xerr-=distance; PointX+=incx; } if(yerr>distance) { yerr-=distance; PointY+=incy; } } } /*--------------------------------------------------------------------------- 绘制矩形框 输入参数:矩形的起始位置left,top 矩形的结束位置right,bottom 矩形框的颜色color -----------------------------------------------------------------------------*/ void Rectangle( uchar left, uchar top, uchar right, uchar bottom, unsigned int color) { Line(left,top,right,top,color); Line(left,top,left,bottom,color); Line(right,top,right,bottom,color); Line(left,bottom,right,bottom,color); } /*--------------------------------------------------------------------------- 绘制平面矩形 输入参数:矩形的起始位置left,top 矩形的结束位置right,bottom 矩形框的颜色color -----------------------------------------------------------------------------*/ void Bar( uchar left, uchar top, uchar right, uchar bottom, unsigned int color) { uchar i = 0,k = 0; for(k = top;k < bottom;k++) { for(i = left+1;i <= right;i++) { LCD_SetPos(i,i,k,k); Write_Data_U16(color); } } } /*--------------------------------------------------------------------------- 向LCD发送一个0--255的数值 -----------------------------------------------------------------------------*/ void LCDShow_uCharNumber( uchar x, uchar y, uchar uCharNumber, unsigned int forecolor, unsigned int bkcolor) { LCD_PutChar(x,y,uCharNumber/100+'0',forecolor,bkcolor); LCD_PutChar(x+8,y,uCharNumber/10+'0',forecolor,bkcolor); LCD_PutChar(x+16,y,uCharNumber+'0',forecolor,bkcolor); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值