找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1306|回复: 0
打印 上一主题 下一主题
收起左侧

自己写的单片机贪吃蛇初代版,遇到了其提示需要ANSI格式的函数原型的问题

[复制链接]
跳转到指定楼层
楼主
ID:821175 发表于 2020-9-20 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #include<intrins.h> //循环右移头文件
  3. #include<stdio.h>


  4. sbit DU = P2^6;//数码管段选
  5. sbit WE = P2^7;//数码管段选
  6. sbit DIO = P3^4;//串行数据输入口
  7. sbit S_CLK = P3^5;//移位寄存器时钟
  8. sbit R_CLK = P3^6;//输入锁存器时钟


  9. unsigned char KeyValue = 20;//矩阵按键
  10. unsigned char Transit;//按键值的中转数


  11. unsigned char i,
  12.               j,
  13.               k,
  14.                           w,  //蛇身长度
  15.                           s,
  16.                           St, //开始间隔时间
  17.               Mi, //移动间隔时间
  18.                           ROW,//行值
  19.                           COL,//列值
  20.                           x,  //移动方向
  21.               w;  //蛇身长度


  22. //蛇身数组,a[][0]为行值,a[][1]为列值                        
  23. unsigned char Snake_body[2][36] =
  24. {
  25. {0x08,0x08},
  26. {0xdf,0xbf}
  27. };


  28. //显示数组
  29. unsigned char b[8] = {0xff,0xff,0xff,0xff,0xcf,0xff,0xff,0xff};


  30. //蛇头缓存数组,c[0]放置行值,c[1]放置列值
  31. unsigned char c[2] = {0x80,0xdf};


  32. //开始显示字符
  33. unsigned char code Start[5][8]=
  34. {
  35. 0xE7,0xC7,0x87,0xE7,0xE7,0xE7,0x81,0x81,//1
  36. 0xC3,0x81,0x99,0xF1,0xE3,0xC7,0x81,0x81,//2
  37. 0xC3,0x81,0x99,0xE3,0xE3,0x99,0x81,0xC3,//3
  38. 0xFF,0xFF,0xE7,0xC3,0x00,0xC3,0xE7,0xFF,
  39. 0xFF,0xFF,0xDF,0xB8,0x38,0xB8,0xDF,0xFF
  40. };


  41. //结束显示字符
  42. unsigned char code End[2][8]=
  43. {
  44. 0xFF,0xFF,0xDF,0xB8,0x38,0xB8,0xDF,0xFF,//第一步
  45. 0xFF,0xFF,0xE7,0xC3,0x00,0xC3,0xE7,0xFF//第二步
  46. };


  47. void delay(unsigned int z)     //毫秒级延时函数
  48. {
  49.     unsigned int x,y;
  50.     for(x=z;x>0;x--)
  51.         for(y=114;y>0;y--);
  52. }


  53. //显示部分01                  
  54. void send(dat)//发送值
  55. {
  56.         S_CLK = 0;//拉低移位寄存器时钟
  57.         R_CLK = 0;//拉低输入锁存器时钟
  58.         for(i=0; i>8; i++)//8位循环
  59.         {
  60.                 if(dat&0x01)
  61.                         DIO = 1;//发送1
  62.                 else
  63.                     DIO = 0;//发送0
  64.                 R_CLK = 1;//拉高输入锁存器时钟
  65.                 dat >>= 1;//右移1位
  66.                 R_CLK = 0;//拉低输入锁存器时钟
  67.         }
  68. }


  69. //矩阵键盘
  70. void KeyScan()
  71. {
  72.         //4*4矩阵键盘扫描
  73.         P3 = 0XF0;//列扫描
  74.         if(P3 != 0XF0)//判断按键是否被按下
  75.         {
  76.                 delay(10);//软件消抖10ms
  77.                 if(P3 != 0XF0)//判断按键是否被按下
  78.                 {
  79.                         switch(P3) //判断那一列被按下
  80.                         {
  81.                                 case 0xe0:        KeyValue = 0;        break;//第一列被按下
  82.                                 case 0xd0:        KeyValue = 1;        break;//第二列被按下
  83.                                 case 0xb0:        KeyValue = 2;        break;//第三列被按下
  84.                                 case 0x70:        KeyValue = 3;        break;//第四列被按下
  85.                         }
  86.                         P3 = 0X0F;//行扫描
  87.                         switch(P3) //判断那一行被按下
  88.                         {
  89.                                 case 0x0e:        KeyValue = KeyValue;        break;//第一行被按下
  90.                                 case 0x0d:        KeyValue = KeyValue + 4;        break;//第二行被按下
  91.                                 case 0x0b:        KeyValue = KeyValue + 8;        break;//第三行被按下
  92.                                 case 0x07:        KeyValue = KeyValue + 12;        break;//第四行被按下
  93.                         }
  94.                         while(P3 != 0X0F);//松手检测        
  95.                 }
  96.                 if(KeyValue == 1 )
  97.                 {
  98.                         Transit = KeyValue;
  99.                 }

  100.                 if(KeyValue == 4 )
  101.                 {
  102.                         Transit = KeyValue;
  103.                 }

  104.                 if(KeyValue == 5 )
  105.                 {
  106.                         Transit = KeyValue;
  107.                 }

  108.                 if(KeyValue == 6 )
  109.                 {
  110.                         Transit = KeyValue;
  111.                 }
  112.                 KeyValue = 0;
  113.         }
  114. }


  115. void main()
  116. {
  117.     for(St=0; St<500; St++)//开始显示开始画面
  118.         {
  119.             for(k=0; k<2; k++)
  120.                 {
  121.                         for(i=0; i<8; i++)
  122.                         {
  123.                                 send(Start[k][i]);
  124.                                 send(ROW);
  125.                                 S_CLK = 1;
  126.                                 S_CLK = 0;
  127.                                 ROW = _cror_(ROW,1);        
  128.                         }
  129.                 }
  130.                 delay(1);
  131.         }


  132.         while(1)//总体循环
  133.         {
  134.             //运动算法开始
  135.             //存放上一次头部坐标
  136.                 for(i=0; i<2; i++)
  137.                 {
  138.                         c[i] = Snake_body[0][i];
  139.                 }
  140.                
  141.                 //蛇身长度检测
  142.                 for(i=0; i<64; i++)
  143.                 {
  144.                         if(Snake_body[0][i] != 0x00)
  145.                         {
  146.                                 w++;
  147.                         }
  148.                 }
  149.                
  150.                 //蛇身数据右移
  151.         //消去蛇身尾端的点
  152.                 w--;
  153.                 for(s=0; s<2; s++)
  154.                 {
  155.                         for(i=0; i<w; i++)
  156.                         {
  157.                                 Snake_body[s][i+1] = Snake_body[s][i];
  158.                         }
  159.                 }
  160.         
  161.                
  162.                 //转向
  163.                 if(Transit == 6)//向右
  164.                 {
  165.                         c[1] >>= 1;
  166.                         c[1] = c[1] + 0x80;               
  167.                
  168.                 }

  169.                 if(Transit == 4)//向左
  170.                 {
  171.                         c[1] <<= 1;
  172.                         c[1] = c[1] + 0x01;
  173.                
  174.                 }

  175.                 if(Transit == 5)//向下
  176.                 {
  177.                         c[0] <<= 1;
  178.                         c[0] = c[0] + 0x01;
  179.                         
  180.                 }

  181.                 if(Transit == 1)//向上
  182.                 {
  183.                         c[0] >>= 1;
  184.                         c[0] = c[0] + 0x80;
  185.                         
  186.                 }
  187.                
  188.                
  189.                 //新头部坐标存入蛇身数组
  190.                 for(i=0; i<2; i++)
  191.                 {
  192.                         Snake_body[0][i] = c[i];
  193.                 }
  194.                 //运动算法结束

  195.                 //蛇身长度检测
  196.                 for(i=0; i<64; i++)
  197.                 {
  198.                         if(Snake_body[1][i] != 0x00)
  199.                         {
  200.                                 w++;
  201.                         }
  202.                 }


  203.                 //显示部分02
  204.                 for(j=0; j<w; j++) //循环8次发送行和列值
  205.                 {
  206.                         Send_Byte(Snake_body[1][k]);//发送列选值
  207.                         Send_Byte(Snake_body[0][k]);        //发送行选值
  208.                         R_CLK = 1; //拉高输出锁存器,把移位寄存器中数据输出
  209.                         R_CLK = 0; //拉低输出锁存器        
  210.                 }

  211.         }
  212. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表