欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機俄羅斯方塊問題 io設定在頭文件里不知道怎么改 [打印本頁]

作者: 1197338529    時間: 2017-5-16 17:31
標題: 單片機俄羅斯方塊問題 io設定在頭文件里不知道怎么改
新人小白,在論壇看到一個大神的51單片機俄羅斯方塊程序,可是在開發(fā)板上運行,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;
                        數(shù)碼管鎖存器
                        sbit dula=P2^6;
                        sbit wela=P2^7;

*******************************************************/以下為c語言程序代碼

  1. /*****************************頭文件區(qū)*****************************************************/
  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. /*****************************宏定義區(qū)*****************************************************/

  10. //需要判斷是否刷新的任務總數(shù)
  11. //1KeyLeft,2KeyTurn,3KeyRight,4KeyDown,5TaskGoingDown,6KeyPause
  12. #define NUM_TASK_FLAG 7
  13. //需要定時刷新的任務總數(shù)
  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. /******************************子函數(shù)聲明區(qū)***********************************************/

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

  25. /******************************全局變量定義區(qū)***********************************************/
  26. unsigned char uc_state=1;//狀態(tài)標示: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];//方塊的旋轉(zhuǎn)點坐標,橫H,豎S
  32. unsigned char xdata ucxMap[10][20];//整張屏幕的標記地圖,用來記錄未消除方塊位置,有方塊則為1
  33. unsigned char ucxBlockPosition[4][2];//方塊的4個小方塊坐標,[0][0],[0][1]為旋轉(zhuǎn)點坐標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. /******************************主函數(shù)開始***********************************************/
  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.                                 //調(diào)用消除方塊函數(shù)
  68.                                 TaskClear();
  69.                         }
  70.                         ET0=0;//在中斷中也有可能變化的變量在更改前時先關閉中斷
  71.                         uc_delay_task_cnt[1]=TIME_TASKGOINGDOWN_2HZ;//延遲重置
  72.                         ET0=1;
  73.                 }

  74.         }
  75. }

  76. //中斷函數(shù)
  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時,相應的函數(shù)準備就緒
  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();//按鍵掃描函數(shù),放在中斷中,保證準時掃描
  90.         TR0=1;
  91. }

  92. //初始化區(qū)
  93. void initial_myself(void)//第一區(qū) 初始化單片機
  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位自動重裝,用來產(chǎn)生隨機數(shù)
  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) //第二區(qū) 初始化外圍
  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, 下載次數(shù): 4


作者: yzwzfyz    時間: 2017-5-16 17:31
1、打開頭文件,參照其它句子改動。
2、未定義的就自己定義。
從樓主的提問中,看得出:樓主對單片機的內(nèi)部構成、結(jié)構還了解得不夠充分。
C的編譯器,對單片機的結(jié)構很明確,但就是不知道其數(shù)量及地址分布,遇到了就報錯。需要程序員用頭文件的方式或者自定義的方式將用到的變量告訴它:變量的地址是如何分配的。
例如:你用到P0,如果沒有定義P0的地址,就報錯。通常文件中會定義P0對應80H單元。
再例如:你用到TL2,這個在8051頭文件中是沒有定義的,而在8052頭文件中才有定義。如果這時你引用51頭文件編譯就會報錯,如果你自己再定義TL2對應地址為CCH,編譯就通過了。當然引用52的頭文件,也會通過。
有意思的是你定義TL2對應地址其它地址,編譯也會通過,但是這是個定義不符合芯片實際的定義,將產(chǎn)生不可預期的結(jié)果。這就里要盡可能引用頭文件的原因。自定義可能定義錯了,但自定義靈活!頭文件是前人的積累,幾乎不會錯。
作者: ddffbb    時間: 2017-5-16 18:37
直接在頭文件里面改不就行了。用到哪個改哪個




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1