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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4951|回復: 6
打印 上一主題 下一主題
收起左側

單片機Keil C程序修改傳入子函數的參數形式出現致命錯誤,請大佬解釋

[復制鏈接]
跳轉到指定樓層
樓主
今天寫程序時遇到一個不能理解的語法錯誤,
編譯時顯示致命錯誤,
請問各位大神是什么原因呢


報錯如下:
compiling mian.c...
C51 FATAL-ERROR -
  ACTION:     GOBAL OPTIMIZATION
  FUNCTION:   _year_split
  ERROR:      CANNOT OPTIMIZE FUNCTION
COMPILATION TERMINATED.
use the following work-around:
  #pragma OPTIMIZE (7)
           /* your original function        */
    _year_split ()  {
       ....
    }
           /* end of your original function */
  #pragma OPTIMIZE (8)



實驗顯示我不給定義的變量賦初值,或者傳到子程序的參數為修改為uchar類型之后就可以了,但是uint類型卻不行,不知道為什么

全部程序如下:(問題語句為void year_split(int value)這個子函數鐘
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned  int
  4. #define Date P0
  5. sbit RS=P1^0;
  6. sbit RW=P1^1;
  7. sbit EN=P2^5;
  8. sbit FM=P2^3;
  9. sbit SW1=P3^5;
  10. sbit SW2=P3^6;
  11. sbit SW3=P3^7;
  12. int second = 0, minute = 0, hour = 0;
  13. int nian = 1988,yue = 0,ri = 0;
  14. uint count = 0;
  15. uint num = 0;

  16. void delay(uint xms)
  17. {
  18. uint i,j;
  19. for(i=xms;i>0;i--)
  20. for(j=112;j>0;j--);
  21. }
  22. void ring()
  23. {
  24. FM=0;
  25. delay(100);
  26. FM=1;
  27. }
  28. void com(uchar command)
  29. {
  30. RS=0;
  31. RW=0;
  32. Date=command;
  33. delay(5);
  34. EN=1;
  35. delay(5);
  36. EN=0;
  37. }
  38. void dat(uchar date)
  39. {
  40. RS=1;
  41. RW=0;
  42. Date=date;
  43. delay(5);
  44. EN=1;
  45. delay(5);
  46. EN=0;
  47. }
  48. void year_split(int value)
  49. {
  50. int qian=0,bai=0,shi=0,ge=0;
  51. qian = value / 1000;
  52. bai = (value / 100) % 10;
  53. shi = (value / 10) % 10;
  54. ge = value % 10;
  55. com(0x80);
  56. dat(qian + 0x30);
  57. dat(bai + 0x30);
  58. dat(shi + 0x30);
  59. dat(ge + 0x30);
  60. }
  61. void date_split(uchar add,uchar value)
  62. {
  63. int shi,ge;
  64. shi = value / 10;
  65. ge = value % 10;
  66. com(0x80+add);
  67. dat(shi + 0x30);
  68. dat(ge + 0x30);
  69. }
  70. void time_split(uchar add,uchar value)
  71. {
  72. int shi,ge;
  73. shi = value / 10;
  74. ge = value % 10;
  75. com(0xc0+add);
  76. dat(shi + 0x30);
  77. dat(ge + 0x30);
  78. }
  79. void LCD_Init()
  80. {
  81. com(0x38); //LCD設置
  82. delay(5);
  83. com(0x01); //清屏
  84. com(0x06); //寫入新數據后光標后移一位,整屏不移動
  85. com(0x0c); //顯示光標,光標不顯示
  86. }
  87. void Time_Init()
  88. {
  89. com(0x80+4);
  90. dat('-');
  91. com(0x80+7);
  92. dat('-');
  93. com(0xc0+6);
  94. dat(':');
  95. com(0xc0+9);
  96. dat(':');

  97. year_split(nian);
  98. date_split(5,yue);
  99. date_split(8,ri);

  100. time_split(4,hour);
  101. time_split(7,minute);
  102. time_split(10,second);

  103. TMOD = 0x01;
  104. TH0 = (65536-46083)/256;
  105. TL0 = (65536-46083)%256;
  106. EA = 1;
  107. ET0 = 1;
  108. TR0 = 1;
  109. }
  110. void Set_key()
  111. {
  112. if(SW1 == 0)
  113. {
  114.   delay(5);
  115.   if(SW1 == 0)
  116.   {
  117.    while(SW1 == 0);
  118.    num++;
  119.    ring();
  120.   }
  121. }
  122. switch(num)
  123. {
  124.   case 1:
  125.    TR0 = 0;    //定時器關
  126.    com(0xc0+10);
  127.    com(0x0f);   //顯示開,光標閃爍
  128.    if(SW2 == 0)
  129.    {
  130.     delay(5);
  131.     if(SW2 == 0)
  132.     {
  133.      while(SW2 == 0);
  134.      second++;
  135.      ring();
  136.      if(second >= 60)
  137.      {
  138.       second = 0;
  139.      }
  140.      time_split(10,second);
  141.     }
  142.    }
  143.    
  144.    if(SW3 == 0)
  145.    {
  146.     delay(5);
  147.     if(SW3 == 0)
  148.     {
  149.      while(SW3 == 0);
  150.      second--;
  151.      ring();
  152.      if(second <= -1)
  153.      {
  154.       second = 59;
  155.      }
  156.      time_split(10,second);
  157.     }
  158.    }
  159.    break;

  160.    case 2:
  161.    com(0xc0+8);
  162.    if(SW2 == 0)
  163.    {
  164.     delay(5);
  165.     if(SW2 == 0)
  166.     {
  167.      while(SW2 == 0);
  168.      minute++;
  169.      ring();
  170.      if(minute >= 60)
  171.      {
  172.       minute = 0;
  173.      }
  174.      time_split(7,minute);
  175.     }
  176.    }
  177.    
  178.    if(SW3 == 0)
  179.    {
  180.     delay(5);
  181.     if(SW3 == 0)
  182.     {
  183.      while(SW3 == 0);
  184.      minute--;
  185.      ring();
  186.      if(minute <= -1)
  187.      {
  188.       minute = 59;
  189.      }
  190.      time_split(7,minute);
  191.     }
  192.    }
  193.    break;
  194.    
  195.    case 3:
  196.    com(0xc0+4);
  197.    if(SW2 == 0)
  198.    {
  199.     delay(5);
  200.     if(SW2 == 0)
  201.     {
  202.      while(SW2 == 0);
  203.      hour++;
  204.      ring();
  205.      if(hour >= 24)
  206.      {
  207.       hour = 0;
  208.      }
  209.      time_split(4,hour);
  210.     }
  211.    }   
  212.    
  213.    if(SW3 == 0)
  214.    {
  215.     delay(5);
  216.     if(SW3 == 0)
  217.     {
  218.      while(SW3 == 0);
  219.      hour--;
  220.      ring();
  221.      if(hour <= -1)
  222.      {
  223.       hour = 23;
  224.      }
  225.      time_split(4,hour);
  226.     }
  227.    }
  228.    
  229.    break;
  230.    
  231.    case 4:
  232.     num = 0;
  233.     TR0 = 1;   //定時器開
  234.     com(0x0c);  //顯示關,光標不閃爍
  235.     break;
  236.   }
  237. }

  238. void Set_display()
  239. {
  240. if(count == 20)
  241. {
  242.   count = 0;
  243.   second++;
  244.   time_split(10,second);
  245.   if(second >= 60)
  246.   {
  247.    second = 0;
  248.    minute++;
  249.    time_split(10,second);
  250.    time_split(7,minute);
  251.    if(minute >= 60)
  252.    {
  253.     minute = 0;
  254.     hour++;
  255.     time_split(7,minute);
  256.     time_split(4,hour);
  257.     if(hour >= 24)
  258.     {
  259.      hour = 0;
  260.      time_split(4,hour);
  261.     }
  262.    }
  263.   }
  264. }
  265. }
  266. void main()
  267. {
  268. LCD_Init();
  269. Time_Init();
  270. while(1)
  271. {
  272.   Set_key();
  273.   Set_display();
  274. }
  275. }
  276. void time()interrupt 1
  277. {
  278. count++;
  279. TH0 = (65536-46083)/256; //50ms=(12/11059200)*1000*(65536-初值)
  280. TL0 = (65536-46083)%256;
  281. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:387733 發表于 2018-10-1 20:29 | 只看該作者
把優化級別降到6級及6級以下就能通過了
回復

使用道具 舉報

板凳
ID:387733 發表于 2018-10-2 16:21 | 只看該作者
經過實驗,只要把 delay 函數的變量改成 uchar 也是可以通過的
void delay(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
回復

使用道具 舉報

地板
ID:405708 發表于 2018-10-5 23:00 | 只看該作者
你的dat形參是8位的,而你定義這幾個變量都是int的,而且還加了個0x30很容易溢出,最后發現在屏蔽ge那行或把ge等于0去掉會編譯通過,具體原因未知,但要把你的程序整理一下,你的程序風格不好,很不嚴謹,不方便維護。
回復

使用道具 舉報

5#
ID:294657 發表于 2018-10-6 18:31 | 只看該作者
psuxaog 發表于 2018-10-5 23:00
你的dat形參是8位的,而你定義這幾個變量都是int的,而且還加了個0x30很容易溢出,最后發現在屏蔽ge那行或 ...

好的,謝謝您的提醒,確實存在容易溢出的問題,我以后會汲取這樣的教訓的的
回復

使用道具 舉報

6#
ID:294657 發表于 2018-10-6 18:40 | 只看該作者
sxhwdz 發表于 2018-10-2 16:21
經過實驗,只要把 delay 函數的變量改成 uchar 也是可以通過的
void delay(uchar xms)
{

定義的時候定義成無符號字符型也可以賦值,并通過了
回復

使用道具 舉報

7#
ID:406159 發表于 2018-10-7 16:08 | 只看該作者
很不錯我的也有這個問題看了之后解決了有用
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产精品一区 | 精品久久久久久久 | 99久久精品国产毛片 | 丝袜 亚洲 另类 欧美 综合 | 久久精品色欧美aⅴ一区二区 | 国产婷婷在线视频 | 亚洲国产精品99久久久久久久久 | 精品久久一区二区三区 | 久久久精品一区二区三区 | 国产精品久久久久久婷婷天堂 | 成人综合一区二区 | 老司机午夜性大片 | 国产一区二区三区免费 | www.三级| 黄色片a级| 亚洲欧美在线一区 | 亚洲一区视频在线 | 欧美日韩中文在线观看 | 99热这里都是精品 | 国产99久久久国产精品 | 国产精品久久久久久妇女6080 | 男人的天堂久久 | 日韩欧美字幕 | 免费av在线 | 午夜电影福利 | h片免费看| 成人在线一区二区三区 | 91av在线影院 | 久久极品 | 国产精品99久久久久 | 日本黄色大片免费 | 韩日精品一区 | 一区二区三区在线 | 国产精品久久久99 | 精品国产乱码久久久久久闺蜜 | 国产美女黄色片 | 中文字幕亚洲视频 | 亚洲精品一区在线 | 一区二区三区中文字幕 | 亚洲精品99| 成人精品国产免费网站 |