|
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语言程序代码
- /*****************************头文件区*****************************************************/
- #include<reg52.h>
- //#include"STC15F2K60S2.h"
- #include"task_key.h"
- #include"task_activation.h"
- #include"12864b.h"
- #include"TaskBlock.h"
- #include"Block.h"
- /*****************************宏定义区*****************************************************/
- //需要判断是否刷新的任务总数
- //1KeyLeft,2KeyTurn,3KeyRight,4KeyDown,5TaskGoingDown,6KeyPause
- #define NUM_TASK_FLAG 7
- //需要定时刷新的任务总数
- //1TaskGoingDown,2KeyService
- #define NUM_TASK_REFRESH 3
- //刷新频率
- #define TIME_PER_SEC 200 //每次进入中断的频率,200Hz
- #define TIME_CLOCK 11059200 //晶振频率
- #define TIME_KEY_SERVICE_50HZ TIME_PER_SEC/50 //按键服务频率,0.02s
- #define TIME_TASKGOINGDOWN_2HZ TIME_PER_SEC/2 //下落频率,0.5s
- /******************************子函数声明区***********************************************/
- void initial_myself(void);
- void initial_peripheral(void);
- void delay100ms(void);
- /******************************全局变量定义区***********************************************/
- unsigned char uc_state=1;//状态标示:1欢迎界面,2等待开始界面,3下落界面,4死亡界面,5暂停界面
- 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;//方块编号
- unsigned char ucBlockNow=0;//当前方块
- unsigned char ucBlockNext=0;//下一个方块
- unsigned char ucFlagScreenChange=1;//界面变更标志,界面更改时置1,激活task_activation
- unsigned char ucCoordinate[2];//方块的旋转点坐标,横H,竖S
- unsigned char xdata ucxMap[10][20];//整张屏幕的标记地图,用来记录未消除方块位置,有方块则为1
- unsigned char ucxBlockPosition[4][2];//方块的4个小方块坐标,[0][0],[0][1]为旋转点坐标H,S
- unsigned int uc_delay_task_cnt[NUM_TASK_REFRESH];//任务刷新延迟
- unsigned char uc_flag_taskrefresh[NUM_TASK_FLAG];//任务刷新标志
- unsigned long int ucScore=0;//得分
- /******************************主函数开始***********************************************/
- void main(void)
- {
- unsigned char i=0;
- initial_myself();
- delay100ms();
- initial_peripheral();
- while(1)
- {
- if(ucFlagScreenChange==1)//界面变更标志为1时,进行任务激活,防止一直刷新界面
- {
- task_activation(uc_state);
- ucFlagScreenChange=0;
- }
- if(uc_delay_task_cnt[2]==0)//20HZ频率刷新key_service
- {
- task_key_service();
- ET0=0;//在中断中也有可能变化的变量在更改前时先关闭中断
- uc_delay_task_cnt[2]=TIME_KEY_SERVICE_50HZ;//延迟重置
- ET0=1;
- }
- if(uc_flag_taskrefresh[5]&&uc_delay_task_cnt[1]==0)//需要时,2HZ频率刷新TaskGoingDown
- {
- if(!TaskGoingDown())//下落失败
- {
- //将当前方块位置写入Map
- for(i=0;i<4;i++)
- {
- ucxMap[ ucxBlockPosition[i][0] ][ ucxBlockPosition[i][1] ]=1;
- }
- //调用消除方块函数
- TaskClear();
- }
- ET0=0;//在中断中也有可能变化的变量在更改前时先关闭中断
- uc_delay_task_cnt[1]=TIME_TASKGOINGDOWN_2HZ;//延迟重置
- ET0=1;
- }
- }
- }
- //中断函数
- void timer0(void) interrupt 1
- {
- unsigned char i;
- TR0=0;
- TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
- TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
- //task_delay[]减到0时,相应的函数准备就绪
- for(i=0;i<NUM_TASK_REFRESH;i++)
- {
- if(uc_delay_task_cnt[i]!=0)//延迟不为0时才减
- {uc_delay_task_cnt[i]--;};
- }
- task_key_scan();//按键扫描函数,放在中断中,保证准时扫描
- TR0=1;
- }
- //初始化区
- void initial_myself(void)//第一区 初始化单片机
- {
- unsigned char i;
- for(i=0;i<NUM_TASK_REFRESH;i++)uc_delay_task_cnt[i]=0;//初始化让所有任务就绪
- TMOD=0X21; //定时器0为16位不自动重装,用来定时;定时器1为8位自动重装,用来产生随机数
- TH0=255-TIME_CLOCK/TIME_PER_SEC/12/256;
- TL0=255-TIME_CLOCK/TIME_PER_SEC/12%256;
- TH1=0;
- TL1=0;
- }
- void initial_peripheral(void) //第二区 初始化外围
- {
- Lcd_Init();//初始化12864
- EA=1; //开总中断
- ET0=1; //允许定时器0中断,定时器1无需开启中断
- TR0=1; //启动定时器0
- TR1=1; //启动定时器1
- }
- void delay100ms(void) //@11.0592MHz
- {
- unsigned char i, j, k;
- ;
- ;
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
复制代码 |
最佳答案
查看完整内容
1、打开头文件,参照其它句子改动。
2、未定义的就自己定义。
从楼主的提问中,看得出:楼主对单片机的内部构成、结构还了解得不够充分。
C的编译器,对单片机的结构很明确,但就是不知道其数量及地址分布,遇到了就报错。需要程序员用头文件的方式或者自定义的方式将用到的变量告诉它:变量的地址是如何分配的。
例如:你用到P0,如果没有定义P0的地址,就报错。通常文件中会定义P0对应80H单元。
再例如:你用到TL2,这个在8 ...
|