欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)俄羅斯方塊問題 io設(shè)定在頭文件里不知道怎么改
[打印本頁(yè)]
作者:
1197338529
時(shí)間:
2017-5-16 17:31
標(biāo)題:
單片機(jī)俄羅斯方塊問題 io設(shè)定在頭文件里不知道怎么改
新人小白,在論壇看到一個(gè)大神的51單片機(jī)俄羅斯方塊程序,可是在開發(fā)板上運(yùn)行,io設(shè)定在頭文件里不知道怎么改?有時(shí)候用源代碼還有未定義錯(cuò)誤,希望大家給點(diǎn)具體 詳細(xì) 建議。
* IO口設(shè)定:按鍵
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;
數(shù)碼管鎖存器
sbit dula=P2^6;
sbit wela=P2^7;
*******************************************************/以下為c語言程序代碼
/*****************************頭文件區(qū)*****************************************************/
#include<reg52.h>
//#include"STC15F2K60S2.h"
#include"task_key.h"
#include"task_activation.h"
#include"12864b.h"
#include"TaskBlock.h"
#include"Block.h"
/*****************************宏定義區(qū)*****************************************************/
//需要判斷是否刷新的任務(wù)總數(shù)
//1KeyLeft,2KeyTurn,3KeyRight,4KeyDown,5TaskGoingDown,6KeyPause
#define NUM_TASK_FLAG 7
//需要定時(shí)刷新的任務(wù)總數(shù)
//1TaskGoingDown,2KeyService
#define NUM_TASK_REFRESH 3
//刷新頻率
#define TIME_PER_SEC 200 //每次進(jìn)入中斷的頻率,200Hz
#define TIME_CLOCK 11059200 //晶振頻率
#define TIME_KEY_SERVICE_50HZ TIME_PER_SEC/50 //按鍵服務(wù)頻率,0.02s
#define TIME_TASKGOINGDOWN_2HZ TIME_PER_SEC/2 //下落頻率,0.5s
/******************************子函數(shù)聲明區(qū)***********************************************/
void initial_myself(void);
void initial_peripheral(void);
void delay100ms(void);
/******************************全局變量定義區(qū)***********************************************/
unsigned char uc_state=1;//狀態(tài)標(biāo)示: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;//方塊編號(hào)
unsigned char ucBlockNow=0;//當(dāng)前方塊
unsigned char ucBlockNext=0;//下一個(gè)方塊
unsigned char ucFlagScreenChange=1;//界面變更標(biāo)志,界面更改時(shí)置1,激活task_activation
unsigned char ucCoordinate[2];//方塊的旋轉(zhuǎn)點(diǎn)坐標(biāo),橫H,豎S
unsigned char xdata ucxMap[10][20];//整張屏幕的標(biāo)記地圖,用來記錄未消除方塊位置,有方塊則為1
unsigned char ucxBlockPosition[4][2];//方塊的4個(gè)小方塊坐標(biāo),[0][0],[0][1]為旋轉(zhuǎn)點(diǎn)坐標(biāo)H,S
unsigned int uc_delay_task_cnt[NUM_TASK_REFRESH];//任務(wù)刷新延遲
unsigned char uc_flag_taskrefresh[NUM_TASK_FLAG];//任務(wù)刷新標(biāo)志
unsigned long int ucScore=0;//得分
/******************************主函數(shù)開始***********************************************/
void main(void)
{
unsigned char i=0;
initial_myself();
delay100ms();
initial_peripheral();
while(1)
{
if(ucFlagScreenChange==1)//界面變更標(biāo)志為1時(shí),進(jìn)行任務(wù)激活,防止一直刷新界面
{
task_activation(uc_state);
ucFlagScreenChange=0;
}
if(uc_delay_task_cnt[2]==0)//20HZ頻率刷新key_service
{
task_key_service();
ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
uc_delay_task_cnt[2]=TIME_KEY_SERVICE_50HZ;//延遲重置
ET0=1;
}
if(uc_flag_taskrefresh[5]&&uc_delay_task_cnt[1]==0)//需要時(shí),2HZ頻率刷新TaskGoingDown
{
if(!TaskGoingDown())//下落失敗
{
//將當(dāng)前方塊位置寫入Map
for(i=0;i<4;i++)
{
ucxMap[ ucxBlockPosition[i][0] ][ ucxBlockPosition[i][1] ]=1;
}
//調(diào)用消除方塊函數(shù)
TaskClear();
}
ET0=0;//在中斷中也有可能變化的變量在更改前時(shí)先關(guān)閉中斷
uc_delay_task_cnt[1]=TIME_TASKGOINGDOWN_2HZ;//延遲重置
ET0=1;
}
}
}
//中斷函數(shù)
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時(shí),相應(yīng)的函數(shù)準(zhǔn)備就緒
for(i=0;i<NUM_TASK_REFRESH;i++)
{
if(uc_delay_task_cnt[i]!=0)//延遲不為0時(shí)才減
{uc_delay_task_cnt[i]--;};
}
task_key_scan();//按鍵掃描函數(shù),放在中斷中,保證準(zhǔn)時(shí)掃描
TR0=1;
}
//初始化區(qū)
void initial_myself(void)//第一區(qū) 初始化單片機(jī)
{
unsigned char i;
for(i=0;i<NUM_TASK_REFRESH;i++)uc_delay_task_cnt[i]=0;//初始化讓所有任務(wù)就緒
TMOD=0X21; //定時(shí)器0為16位不自動(dòng)重裝,用來定時(shí);定時(shí)器1為8位自動(dòng)重裝,用來產(chǎn)生隨機(jī)數(shù)
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) //第二區(qū) 初始化外圍
{
Lcd_Init();//初始化12864
EA=1; //開總中斷
ET0=1; //允許定時(shí)器0中斷,定時(shí)器1無需開啟中斷
TR0=1; //啟動(dòng)定時(shí)器0
TR1=1; //啟動(dòng)定時(shí)器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);
}
復(fù)制代碼
51黑論壇_俄羅斯方塊全部源碼.zip
2017-5-16 17:31 上傳
點(diǎn)擊文件名下載附件
147.88 KB, 下載次數(shù): 4
作者:
yzwzfyz
時(shí)間:
2017-5-16 17:31
1、打開頭文件,參照其它句子改動(dòng)。
2、未定義的就自己定義。
從樓主的提問中,看得出:樓主對(duì)單片機(jī)的內(nèi)部構(gòu)成、結(jié)構(gòu)還了解得不夠充分。
C的編譯器,對(duì)單片機(jī)的結(jié)構(gòu)很明確,但就是不知道其數(shù)量及地址分布,遇到了就報(bào)錯(cuò)。需要程序員用頭文件的方式或者自定義的方式將用到的變量告訴它:變量的地址是如何分配的。
例如:你用到P0,如果沒有定義P0的地址,就報(bào)錯(cuò)。通常文件中會(huì)定義P0對(duì)應(yīng)80H單元。
再例如:你用到TL2,這個(gè)在8051頭文件中是沒有定義的,而在8052頭文件中才有定義。如果這時(shí)你引用51頭文件編譯就會(huì)報(bào)錯(cuò),如果你自己再定義TL2對(duì)應(yīng)地址為CCH,編譯就通過了。當(dāng)然引用52的頭文件,也會(huì)通過。
有意思的是你定義TL2對(duì)應(yīng)地址其它地址,編譯也會(huì)通過,但是這是個(gè)定義不符合芯片實(shí)際的定義,將產(chǎn)生不可預(yù)期的結(jié)果。這就里要盡可能引用頭文件的原因。自定義可能定義錯(cuò)了,但自定義靈活!頭文件是前人的積累,幾乎不會(huì)錯(cuò)。
作者:
ddffbb
時(shí)間:
2017-5-16 18:37
直接在頭文件里面改不就行了。用到哪個(gè)改哪個(gè)
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1