找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机俄罗斯方块问题 io设定在头文件里不知道怎么改

[复制链接]
跳转到指定楼层
楼主
ID:199694 发表于 2017-5-16 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
新人小白,在论坛看到一个大神的51单片机俄罗斯方块程序,可是在开发板上运行,io设定在头文件里不知道怎么改?有时候用源代码还有未定义错误,希望大家给点具体    详细  建议。
* IO口设定:按键
                        sbit key_sr_left=P3^7;
                        sbit key_sr_turn=P3^6;
                        sbit key_sr_right=P3^5;
                        sbit key_sr_down=P3^4;
                        LCD12864
                        sbit RS_Port=P1^0;
                        sbit RW_Port=P1^1;
                        sbit E_Port=P2^5;
                        sbit PSB_Port=P1^2;
                        sbit RST_Port=P1^4;
                        数码管锁存器
                        sbit dula=P2^6;
                        sbit wela=P2^7;

*******************************************************/以下为c语言程序代码

  1. /*****************************头文件区*****************************************************/
  2. #include<reg52.h>
  3. //#include"STC15F2K60S2.h"
  4. #include"task_key.h"
  5. #include"task_activation.h"
  6. #include"12864b.h"
  7. #include"TaskBlock.h"
  8. #include"Block.h"
  9. /*****************************宏定义区*****************************************************/

  10. //需要判断是否刷新的任务总数
  11. //1KeyLeft,2KeyTurn,3KeyRight,4KeyDown,5TaskGoingDown,6KeyPause
  12. #define NUM_TASK_FLAG 7
  13. //需要定时刷新的任务总数
  14. //1TaskGoingDown,2KeyService
  15. #define NUM_TASK_REFRESH 3
  16. //刷新频率
  17. #define TIME_PER_SEC 200                                                        //每次进入中断的频率,200Hz
  18. #define TIME_CLOCK 11059200                                                        //晶振频率
  19. #define TIME_KEY_SERVICE_50HZ  TIME_PER_SEC/50          //按键服务频率,0.02s
  20. #define TIME_TASKGOINGDOWN_2HZ  TIME_PER_SEC/2          //下落频率,0.5s

  21. /******************************子函数声明区***********************************************/

  22. void initial_myself(void);   
  23. void initial_peripheral(void);
  24. void delay100ms(void);        

  25. /******************************全局变量定义区***********************************************/
  26. unsigned char uc_state=1;//状态标示:1欢迎界面,2等待开始界面,3下落界面,4死亡界面,5暂停界面
  27. enum Block{S1,S2,Z1,Z2,L1,L2,L3,L4,J1,J2,J3,J4,I1,I2,O1,T_1,T_2,T_3,T_4}enumBlock;//方块编号
  28. unsigned char ucBlockNow=0;//当前方块
  29. unsigned char ucBlockNext=0;//下一个方块

  30. unsigned char ucFlagScreenChange=1;//界面变更标志,界面更改时置1,激活task_activation

  31. unsigned char ucCoordinate[2];//方块的旋转点坐标,横H,竖S
  32. unsigned char xdata ucxMap[10][20];//整张屏幕的标记地图,用来记录未消除方块位置,有方块则为1
  33. unsigned char ucxBlockPosition[4][2];//方块的4个小方块坐标,[0][0],[0][1]为旋转点坐标H,S

  34. unsigned int uc_delay_task_cnt[NUM_TASK_REFRESH];//任务刷新延迟
  35. unsigned char uc_flag_taskrefresh[NUM_TASK_FLAG];//任务刷新标志

  36. unsigned long int ucScore=0;//得分

  37. /******************************主函数开始***********************************************/
  38. void main(void)
  39. {
  40.         unsigned char i=0;
  41.         initial_myself();
  42.         delay100ms();   
  43.     initial_peripheral();


  44.         while(1)
  45.         {
  46.                 if(ucFlagScreenChange==1)//界面变更标志为1时,进行任务激活,防止一直刷新界面
  47.                 {
  48.                         task_activation(uc_state);
  49.                         ucFlagScreenChange=0;
  50.                 }
  51.                 if(uc_delay_task_cnt[2]==0)//20HZ频率刷新key_service
  52.                 {
  53.                         task_key_service();
  54.                         ET0=0;//在中断中也有可能变化的变量在更改前时先关闭中断
  55.                         uc_delay_task_cnt[2]=TIME_KEY_SERVICE_50HZ;//延迟重置
  56.                         ET0=1;
  57.                 }
  58.                 if(uc_flag_taskrefresh[5]&&uc_delay_task_cnt[1]==0)//需要时,2HZ频率刷新TaskGoingDown
  59.                 {
  60.                         if(!TaskGoingDown())//下落失败
  61.                         {
  62.                                 //将当前方块位置写入Map
  63.                                 for(i=0;i<4;i++)
  64.                                 {
  65.                                         ucxMap[ ucxBlockPosition[i][0] ][ ucxBlockPosition[i][1] ]=1;
  66.                                 }
  67.                                 //调用消除方块函数
  68.                                 TaskClear();
  69.                         }
  70.                         ET0=0;//在中断中也有可能变化的变量在更改前时先关闭中断
  71.                         uc_delay_task_cnt[1]=TIME_TASKGOINGDOWN_2HZ;//延迟重置
  72.                         ET0=1;
  73.                 }

  74.         }
  75. }

  76. //中断函数
  77. void timer0(void) interrupt 1
  78. {
  79.         unsigned char i;
  80.         TR0=0;
  81.         TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
  82.         TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
  83.         //task_delay[]减到0时,相应的函数准备就绪
  84.         for(i=0;i<NUM_TASK_REFRESH;i++)
  85.         {
  86.                 if(uc_delay_task_cnt[i]!=0)//延迟不为0时才减
  87.                         {uc_delay_task_cnt[i]--;};
  88.         }
  89.         task_key_scan();//按键扫描函数,放在中断中,保证准时扫描
  90.         TR0=1;
  91. }

  92. //初始化区
  93. void initial_myself(void)//第一区 初始化单片机
  94. {
  95.         unsigned char i;
  96.         for(i=0;i<NUM_TASK_REFRESH;i++)uc_delay_task_cnt[i]=0;//初始化让所有任务就绪
  97.         TMOD=0X21; //定时器0为16位不自动重装,用来定时;定时器1为8位自动重装,用来产生随机数
  98.         TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
  99.         TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
  100.         TH1=0;
  101.         TL1=0;
  102. }

  103. void initial_peripheral(void) //第二区 初始化外围
  104. {
  105.         Lcd_Init();//初始化12864
  106.         EA=1;     //开总中断
  107.         ET0=1;    //允许定时器0中断,定时器1无需开启中断
  108.     TR0=1;    //启动定时器0
  109.     TR1=1;         //启动定时器1
  110. }

  111. void delay100ms(void)                //@11.0592MHz
  112. {
  113.         unsigned char i, j, k;

  114.         ;
  115.         ;
  116.         i = 5;
  117.         j = 52;
  118.         k = 195;
  119.         do
  120.         {
  121.                 do
  122.                 {
  123.                         while (--k);
  124.                 } while (--j);
  125.         } while (--i);
  126. }
复制代码

51黑论坛_俄罗斯方块全部源码.zip

147.88 KB, 下载次数: 4

最佳答案

查看完整内容

1、打开头文件,参照其它句子改动。 2、未定义的就自己定义。 从楼主的提问中,看得出:楼主对单片机的内部构成、结构还了解得不够充分。 C的编译器,对单片机的结构很明确,但就是不知道其数量及地址分布,遇到了就报错。需要程序员用头文件的方式或者自定义的方式将用到的变量告诉它:变量的地址是如何分配的。 例如:你用到P0,如果没有定义P0的地址,就报错。通常文件中会定义P0对应80H单元。 再例如:你用到TL2,这个在8 ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2017-5-16 17:31 | 只看该作者
1、打开头文件,参照其它句子改动。
2、未定义的就自己定义。
从楼主的提问中,看得出:楼主对单片机的内部构成、结构还了解得不够充分。
C的编译器,对单片机的结构很明确,但就是不知道其数量及地址分布,遇到了就报错。需要程序员用头文件的方式或者自定义的方式将用到的变量告诉它:变量的地址是如何分配的。
例如:你用到P0,如果没有定义P0的地址,就报错。通常文件中会定义P0对应80H单元。
再例如:你用到TL2,这个在8051头文件中是没有定义的,而在8052头文件中才有定义。如果这时你引用51头文件编译就会报错,如果你自己再定义TL2对应地址为CCH,编译就通过了。当然引用52的头文件,也会通过。
有意思的是你定义TL2对应地址其它地址,编译也会通过,但是这是个定义不符合芯片实际的定义,将产生不可预期的结果。这就里要尽可能引用头文件的原因。自定义可能定义错了,但自定义灵活!头文件是前人的积累,几乎不会错。
回复

使用道具 举报

板凳
ID:201483 发表于 2017-5-16 18:37 | 只看该作者
直接在头文件里面改不就行了。用到哪个改哪个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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