久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4407|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区三上悠亚 | 成人av在线网站 | 污污的网站在线观看 | 成人国产在线视频 | 麻豆视频在线免费看 | 久久久久久中文字幕 | 国产区高清 | 成人精品视频在线观看 | 欧美日韩高清免费 | 成人亚洲一区 | 亚洲精品一区在线观看 | 国产精品日韩在线 | 成人在线精品 | 天堂影院av | 久久久久久免费观看 | 亚洲欧美精品国产一级在线 | 日韩视频免费 | 伊人久久综合 | 欧美一级大片 | 午夜一级黄色片 | 欧美美女一区二区 | 日本三级电影免费 | 国产在线视频在线观看 | 午夜激情影院 | 国产高清美女一级a毛片久久w | 欧美精品综合在线 | 久久九| 午夜男人视频 | 福利一区在线观看 | 国产一区二区在线视频 | 成人av片在线观看 | 国产视频福利 | 日韩一区二区在线视频 | 97免费在线观看视频 | 视频二区| 淫片一级国产 | 国产精品日韩欧美一区二区三区 | 人人干人人超 | 2018国产大陆天天弄 | 99精品欧美一区二区三区综合在线 | 激情av |