亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC單片機自動冷啟動下載器

[復制鏈接]
跳轉到指定樓層
樓主
自己制作的STC的自動冷啟動下載器,雖然是51單片機這種老掉牙的東西,業余的電子愛好,折騰一下,以前買的那種模塊,識別率不高,經常識別不到。面板用OLED作顯示,8838鋁合金殼體(T12電烙鐵套裝殼子),TYPEC接口,手機數據線即可。


主要電路原理:CH340G負責USB轉串口,TLP109光耦把串口數據隔離,并把數據分為2路,一路給下載芯片,另一路給主控芯片,4個繼電器負責輸出供電切換和冷啟動斷電,目標下載板只有小電流時可以直接借用USB5V,如果有大電容可以切換到外置DC口供電,這樣不影響USB。主控芯片使用12C5A60S2,對串口數據進行解析,面板顯示和開關以及繼電器這些。板上有主控芯片的冷啟動開關,不需要借助其它的下載模塊,直接本機就能自己給自己刷程序,只是需要手動冷啟動。OLED顯示板使用1.3寸SSD1306芯片,查手冊時才發現這屏雖然可以接受5V的TTL電平,但是會影響壽命,所以增加了TXS0102電平轉換芯片。程序的核心原理是ISP軟件下載時會主動打開串口,主控芯片只需要在串口打開時掃描是否有0X7F下載數據流,識別到連續的一定數量的7F就進行冷啟動斷電1次,重新上電以后不再進行7F掃描,直到程序下載完成串口斷開連接才會回到初始狀態,串口波特率支持2400-4800-9600,ISP下載軟件默認最低是2400,掃描7F時進行波特率切換,幾個波特率輪番查詢都沒有7F,那就識別為單純的串口連接,不進行冷啟動斷電,不能一直查詢,避免串口調試中的7F觸發冷啟動,更高的波特率感覺不太必要,程序中也沒寫更多




hex文件.rar (5.31 KB, 下載次數: 0) 原理圖 PCB.rar (6.51 MB, 下載次數: 0)

  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit SDA=P1^5;
  6. sbit SCL=P1^4;
  7. sbit k3=P2^7;
  8. sbit J1=P2^5;
  9. sbit J2=P2^4;
  10. sbit J3=P2^6;
  11. sbit J4=P2^3;
  12. sbit led=P0^3;
  13. sbit k1=P0^6;
  14. sbit RTS=P3^5;
  15. sbit k2=P0^7;
  16. uchar t,t1;                  //定時器計數
  17. bit bt;                                           //波特率修改標志
  18. uchar code STC[3][60]={
  19.                                                           {0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xF8,0x78,0x18,0x1C,0x0C,0x0C,0x18,0x38,0x70,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x9C,0xFC,0xFC,0x7C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0x78,0x38,0x1C,0x0C,0x0C,0x1C,0x38,0x70,0x60,0x00},
  20.                                                         {0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x3E,0x78,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFE,0xFF,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFC,0xFF,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  21.                                                         {0x00,0x0F,0x1E,0x3C,0x78,0x70,0x70,0x30,0x38,0x1E,0x0F,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7C,0x7F,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x1F,0x3E,0x38,0x70,0x60,0x60,0x70,0x38,0x1C,0x0C,0x00,0x00,0x00,0x00},
  22.                                            }; //STC
  23. uchar code leng2424[3][24]={
  24.                                                      {0x00,0x00,0x30,0x70,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0xC0,0xF0,0xFC,0x3C,0x3C,0xF4,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00},
  25.                                                         {0x00,0x00,0x00,0x80,0xE0,0xF9,0x79,0x1C,0x6C,0x6E,0x67,0x63,0x61,0x62,0x67,0x7F,0x7C,0xE9,0xE3,0xE7,0x67,0x2E,0x0E,0x04},
  26.                                                         {0x00,0x0C,0x1E,0x1F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x06,0x0E,0x1C,0x3C,0x3C,0x7F,0x67,0x43,0x01,0x00,0x00,0x00,0x00},
  27.                                                  };//冷
  28. uchar code qi2424[3][24]={
  29.                                                         {0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x30,0x30,0x30,0x30,0x34,0x3E,0x3E,0x3C,0x30,0x30,0x30,0xF0,0xF0,0xF0,0x00,0x00,0x00},
  30.                                                         {0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC7,0xC7,0xC7,0xC0,0x00,0x00},
  31.                                                         {0x00,0x20,0x70,0x7E,0x3F,0x0F,0x01,0x7F,0x7F,0x7F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7F,0x7F,0x7F,0x00,0x00},
  32.                                                    };//啟
  33. uchar code dong2424[3][24]={
  34.                                                         {0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x80,0x80,0x80,0x80,0xFC,0xFC,0x84,0x80,0x80,0x80,0x80,0x80},
  35.                                                         {0x00,0x04,0x04,0x04,0xE4,0xFC,0x7C,0x1C,0x44,0xE4,0xE4,0x84,0x05,0x01,0x01,0xFD,0xFF,0xFF,0x01,0x01,0xE1,0xFF,0xFF,0x00},
  36.                                                         {0x00,0x00,0x0E,0x0F,0x0F,0x05,0x04,0x06,0x06,0x07,0x07,0x6F,0x7E,0x78,0x3E,0x0F,0x07,0x60,0x60,0x60,0x7F,0x7F,0x3F,0x00},
  37.                                                    };//動
  38. uchar code xia2424[3][24]={
  39.                                                         {0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0xF8,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00},
  40.                                                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x08,0x1C,0x3C,0x78,0xF0,0xE0,0xC0,0x80,0x00,0x00},
  41.                                                         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00},
  42.                                                    }; //下
  43. uchar code zai2424[3][24]={
  44.                                                         {0x00,0x80,0x90,0x90,0x90,0x90,0xFE,0xFE,0xFE,0x90,0x90,0x90,0x90,0x80,0xFE,0xFE,0x82,0x80,0x8C,0x9C,0x98,0x90,0x80,0x80},
  45.                                                         {0x00,0x00,0xC8,0xE8,0xF8,0xBC,0x9F,0xEF,0xEA,0xE8,0x88,0x88,0x88,0x08,0x1F,0xFF,0xFF,0x80,0xF0,0xFC,0x3C,0x0C,0x00,0x00},
  46.                                                         {0x00,0x08,0x18,0x18,0x18,0x08,0x08,0x7F,0x7F,0x7F,0x0C,0x4C,0x64,0x70,0x38,0x3D,0x1F,0x1F,0x3F,0x78,0x60,0x78,0x78,0x18},
  47.                                                   }; //載
  48. uchar code cun2424[3][24]={
  49.                                                         {0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0xE0,0xF8,0xFE,0x3E,0x24,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},
  50.                                                         {0x00,0x40,0xC0,0xE0,0x70,0xFE,0xFE,0xFF,0x87,0x81,0x86,0x86,0x86,0x86,0x86,0xE6,0xF6,0xFE,0x9E,0x9E,0x8E,0x86,0x80,0x80},
  51.                                                         {0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x20,0x60,0x60,0x7F,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00},
  52.                                                   }; //存
  53. uchar code chu2424[3][24]={
  54.                                                         {0x00,0x00,0x00,0xC0,0xF8,0x3C,0x04,0x00,0x10,0xF8,0x60,0x00,0x00,0x30,0x30,0xFC,0xFC,0x30,0x30,0xC0,0x70,0x30,0x00,0x00},
  55.                                                         {0x00,0x0C,0x0F,0x03,0xFF,0x00,0x06,0x06,0xFE,0xFE,0x00,0x80,0xC6,0xC6,0xE6,0x37,0x3F,0x2E,0x27,0x27,0xE6,0x06,0x06,0x00},
  56.                                                         {0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x1F,0x1F,0x0C,0x06,0x01,0x00,0x7F,0x13,0x13,0x13,0x13,0x13,0x7F,0x00,0x00,0x00},
  57.                                                   }; //儲
  58. uchar code cuo2424[3][24]={
  59.                                                         {0x00,0x00,0xC0,0xE0,0xF8,0x7C,0x7C,0x64,0x60,0x60,0x60,0x60,0x60,0xFC,0xFC,0x60,0x60,0x60,0xFC,0xFC,0x60,0x60,0x60,0x00},
  60.                                                         {0x00,0x01,0x61,0x67,0xFE,0xFE,0xFE,0x66,0x66,0x60,0x04,0xE4,0xE4,0xE7,0x67,0x64,0x64,0x64,0x67,0xE7,0xE4,0xE4,0x04,0x04},
  61.                                                         {0x00,0x00,0x00,0x00,0x3F,0x3F,0x3F,0x1C,0x0E,0x06,0x00,0x7F,0x7F,0x7F,0x32,0x32,0x32,0x32,0x32,0x7F,0x7F,0x7F,0x00,0x00},
  62.                                                   };//錯
  63. uchar code wu2424[3][24]={
  64.                                                         {0x00,0x00,0x00,0x0C,0x1C,0x3C,0x38,0x30,0x00,0xF8,0xF8,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0xF8,0x00,0x00,0x00},
  65.                                                         {0x00,0x03,0x03,0x02,0xFE,0xFE,0xFE,0x00,0x88,0x89,0x89,0x89,0x89,0x89,0xF9,0xF9,0x99,0x89,0x89,0x89,0x89,0x88,0x88,0x80},
  66.                                                         {0x00,0x00,0x00,0x10,0x3F,0x3F,0x1F,0x4E,0x66,0x60,0x70,0x38,0x1E,0x1F,0x07,0x07,0x0F,0x1E,0x38,0x30,0x70,0x60,0x60,0x20},
  67.                                                  };//誤
  68. uchar code ce2424[3][24]={
  69.                                                         {0x00,0x00,0x08,0x1C,0x18,0x10,0x00,0xF8,0xF8,0x18,0x98,0x98,0x18,0xF8,0xF8,0x00,0x00,0xE0,0x20,0x00,0xFC,0xFC,0x00,0x00},
  70.                                                         {0x00,0x00,0x03,0x06,0xCC,0xC4,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00},
  71.                                                         {0x00,0x30,0x3C,0x1E,0x03,0x00,0x00,0x60,0x38,0x1E,0x07,0x04,0x0E,0x1C,0x78,0x20,0x00,0x03,0x63,0x60,0x7F,0x3F,0x00,0x00},
  72.                                                  };// 測
  73. uchar code shi2424[3][24]={
  74.                                                         {0x00,0x00,0x08,0x1C,0x38,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFC,0xFC,0x80,0x84,0x9C,0xB8,0x90,0x00,0x00},
  75.                                                         {0x00,0x06,0x06,0x06,0xFE,0xFE,0x00,0x00,0x18,0x18,0xF8,0xF8,0x18,0x18,0x00,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},
  76.                                                         {0x00,0x00,0x00,0x10,0x3F,0x1F,0x0C,0x06,0x32,0x10,0x1F,0x1F,0x08,0x0C,0x0C,0x00,0x03,0x0F,0x3C,0x70,0x60,0x7C,0x18,0x00},
  77.                                                  };// 試
  78. uchar code shu2424[3][24]={
  79.                                                         {0x00,0x00,0xC8,0xDC,0xF8,0xC0,0xC0,0xFC,0xC0,0xC0,0xF8,0xD8,0xC0,0x00,0xF0,0xFC,0x8C,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
  80.                                                         {0x00,0x00,0x4C,0x4C,0x46,0xE3,0x71,0x5F,0x40,0x43,0xCE,0xD4,0x3C,0x0F,0x7F,0xF0,0x80,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00},
  81.                                                         {0x00,0x00,0x40,0x60,0x63,0x27,0x34,0x1C,0x0C,0x0F,0x0B,0x58,0x68,0x60,0x30,0x19,0x0F,0x0F,0x1B,0x30,0x60,0x60,0x00,0x00},
  82.                                                  };// 數
  83. uchar code ju2424[3][24]={
  84.                                                         {0x00,0x80,0x80,0x80,0x80,0xFC,0x84,0x80,0x80,0x00,0xF8,0xF8,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0xF8,0x08,0x00,0x00},
  85.                                                         {0x00,0x40,0xC0,0x60,0x20,0xFF,0x10,0x18,0x08,0x00,0xFF,0x3F,0x11,0x11,0x11,0x11,0xFF,0xFF,0x11,0x11,0x11,0x11,0x10,0x00},
  86.                                                         {0x00,0x00,0x20,0x60,0x60,0x7F,0x00,0x00,0x30,0x3E,0x07,0x00,0x7F,0x7F,0x31,0x31,0x31,0x31,0x31,0x31,0x7F,0x7F,0x00,0x00},
  87.                                                  };// 據
  88. uchar code ou1616[2][16]={
  89.                                                         {0x00,0x00,0xFC,0xFC,0xE4,0xC4,0xF4,0xF4,0xE4,0xFE,0xDE,0xD2,0xD0,0x70,0x70,0x10},
  90.                                                         {0x00,0x00,0x3F,0x3F,0x2E,0x27,0x27,0x66,0x60,0x70,0x3F,0x0F,0x1F,0x78,0xE0,0xC0},
  91.                                                   };//歐
  92. uchar code yang1616[2][16]={        
  93.                                                         {0x00,0x00,0xFC,0xFC,0xE4,0xFC,0x9C,0x00,0xFC,0xFC,0x84,0x84,0x84,0xFC,0xFC,0xFC},
  94.                                                         {0x00,0x00,0xFF,0xFF,0x18,0x1F,0x0F,0x06,0x7F,0x7F,0x10,0x10,0x10,0x7F,0x7F,0x7F},
  95.                                                    };//陽
  96. uchar code yun1616[2][16]={
  97.                                                         {0x00,0xC0,0xC0,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC0,0xC0},
  98.                                                         {0x00,0x00,0x20,0x70,0x78,0x7C,0x2F,0x23,0x21,0x20,0x2C,0x3C,0x38,0x70,0x60,0x00},
  99.                                                   };//云
  100. uchar code tian1616[2][16]={
  101.                                                         {0x00,0xC0,0xC4,0xC4,0xC4,0xC4,0xC4,0xFC,0xFC,0xFC,0xC4,0xC4,0xC4,0xC4,0xC0,0xC0},
  102.                                                         {0x00,0x40,0x60,0x60,0x30,0x38,0x1E,0x0F,0x03,0x07,0x1E,0x18,0x30,0x60,0x60,0x40},
  103.                                                    }; //天
  104. uchar code mo1616[2][16]={
  105.                                                         {0x00,0x10,0x90,0xFE,0x90,0x10,0x04,0xE4,0xAE,0xAE,0xA4,0xAE,0xAE,0xE4,0x04,0x00},
  106.                                                     {0x00,0x06,0x03,0x7F,0x00,0x43,0x48,0x4B,0x2A,0x3A,0x0E,0x1A,0x2A,0x4B,0xC8,0x40},
  107.                                                  };        //模
  108. uchar code shi1616[2][16]={
  109.                                                         {0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3E,0xFE,0x10,0x14,0x1C,0x10,0x10,0x00},
  110.                                                         {0x00,0x20,0x61,0x21,0x3F,0x3F,0x11,0x11,0x10,0x03,0x1E,0x30,0x60,0x40,0x70,0x00},
  111.                                                   };//式
  112. uchar code zi1616[2][16]={
  113.                                                         {0x00,0x00,0x00,0xE0,0xE0,0xA0,0xB8,0xBC,0xAC,0xA0,0xA0,0xA0,0xF0,0xF0,0x00,0x00},
  114.                                                         {0x00,0x00,0x00,0x7F,0x7F,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x7F,0x7F,0x00,0x00},
  115.                                                   };//自
  116. uchar code shou1616[2][16]={        
  117.                                                         {0x00,0x20,0xA0,0xA0,0xB0,0xB0,0xB0,0xF0,0xF0,0x98,0x98,0xD8,0xD8,0x90,0x00,0x00},
  118.                                                         {0x02,0x02,0x02,0x02,0x22,0x22,0x62,0x7F,0x7F,0x02,0x02,0x02,0x03,0x03,0x03,0x02},
  119.                                                   };//手
  120. uchar code dong1616[2][16]={        
  121.                                                         {0x00,0x80,0x90,0x90,0x90,0x90,0x98,0xD8,0xD0,0xC0,0xF8,0xF8,0x40,0x60,0xE0,0xC0},
  122.                                                         {0x00,0x10,0x18,0x1E,0x17,0x17,0x5D,0x78,0x30,0x1E,0x0F,0x21,0x60,0x60,0x7F,0x3F},
  123.                                                   };//動
  124. uchar code chuan1616[2][16]={        
  125.                                                         {0x00,0x00,0x00,0x78,0x78,0x48,0x48,0xFE,0xFE,0xFE,0x48,0x48,0x78,0x78,0x00,0x00},
  126.                                                         {0x00,0x00,0x1F,0x1F,0x11,0x11,0x11,0x7F,0x7F,0x7F,0x11,0x11,0x11,0x1F,0x1F,0x00},
  127.                                                   };//串
  128. uchar code kou1616[2][16]={        
  129.                                                         {0x00,0x00,0x00,0xF8,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0xF8,0xF8,0x00},
  130.                                                         {0x00,0x00,0x00,0x7F,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x7F,0x7F,0x00},
  131.                                                   };//口
  132. uchar code kai1616[2][16]={        
  133.                                                         {0x00,0x80,0x84,0x84,0x84,0xFC,0xFC,0xFC,0x84,0x84,0xFC,0xFC,0x84,0x84,0x84,0x80},
  134.                                                         {0x00,0x41,0x41,0x61,0x71,0x3F,0x1F,0x03,0x01,0x01,0x7F,0x7F,0x01,0x01,0x01,0x01},
  135.                                                   };//開
  136. uchar code qi1616[2][16]={        
  137.                                                         {0x00,0x00,0x00,0xF8,0xF8,0xC8,0xC8,0xCA,0xCE,0xCE,0xC8,0xC8,0xF8,0xF8,0xF8,0x00},
  138.                                                         {0x00,0x60,0x78,0x3F,0x0F,0xFE,0xFE,0x22,0x22,0x22,0x22,0x22,0xFE,0xFE,0xFE,0x00},
  139.                                                   };//啟
  140. uchar code guan1616[2][16]={        
  141.                                                         {0x00,0x00,0x30,0x30,0x30,0x3E,0x3E,0xF8,0xF0,0xF8,0x3E,0x3E,0x30,0x30,0x30,0x00},
  142.                                                         {0x00,0x42,0x42,0x42,0x62,0x32,0x3A,0x1F,0x0F,0x1F,0x1A,0x32,0x72,0x62,0x62,0x02},
  143.                                                   };//關
  144. uchar code bi1616[2][16]={        
  145.                                                         {0x00,0xF0,0xF0,0xF6,0x4E,0x4C,0x40,0x44,0xC4,0xF4,0xF4,0x44,0x44,0xFC,0xFC,0xFC},
  146.                                                         {0x00,0x7F,0x7F,0x7F,0x18,0x1C,0x0E,0x67,0x63,0x3F,0x3F,0x00,0x40,0x7F,0x7F,0x3F},
  147.                                                   };//閉
  148. uchar code gong1616[2][16]={        
  149.                                                         {0x00,0x80,0xE0,0xFC,0xFE,0x26,0x20,0xFE,0xFE,0xFE,0x20,0xFE,0xFE,0x20,0x20,0x20},
  150.                                                         {0x00,0x00,0x00,0x7F,0x7F,0x46,0x66,0x7F,0x3F,0x07,0x06,0x1F,0x3F,0x76,0x66,0x46},
  151.                                                    };//供
  152. uchar code dian1616[2][16]={        
  153.                                                         {0x00,0x00,0xF0,0xF0,0x90,0x90,0x90,0xFE,0xFE,0x90,0x90,0x90,0xF0,0xF0,0x00,0x00},
  154.                                                         {0x00,0x00,0x1F,0x1F,0x0C,0x0C,0x0C,0x7F,0x7F,0x4C,0x4C,0x4C,0x4F,0x4F,0x60,0x60},
  155.                                                    };//電
  156. uchar code U0816[2][8]={
  157.                                                  {0x00,0xF8,0xF8,0x00,0x00,0x00,0xF8,0xF8},
  158.                                                 {0x00,0x1F,0x3F,0x30,0x20,0x30,0x3F,0x1F},
  159.                                            };//U
  160. uchar code S0816[2][8]={
  161.                                                 {0x00,0x70,0xF8,0xD8,0x88,0x38,0x38,0x30},
  162.                                                 {0x00,0x1C,0x3C,0x31,0x21,0x33,0x3F,0x1E},
  163.                                            };//S
  164. uchar code B0816[2][8]={
  165.                                                 {0x00,0xF8,0xF8,0x88,0x88,0x98,0xF8,0x70},
  166.                                                 {0x00,0x3F,0x3F,0x31,0x31,0x31,0x1F,0x1E},
  167.                                            };//B
  168. uchar code I0816[2][8]={
  169.                                                 {0x00,0x00,0x00,0xF8,0xF8,0xF8,0x00,0x00},
  170.                                                 {0x00,0x00,0x00,0x3F,0x3F,0x3F,0x00,0x00},
  171.                                            };//I
  172. uchar code N0816[2][8]={
  173.                                                 {0x00,0xF8,0xF8,0xF0,0xC0,0x00,0xF8,0xF8},
  174.                                                 {0x00,0x3F,0x3F,0x01,0x07,0x3F,0x3F,0x3F},
  175.                                            };//N
  176. uchar code T0816[2][8]={
  177.                                                 {0x00,0x08,0x08,0xF8,0xF8,0xF8,0x08,0x08},
  178.                                                 {0x00,0x00,0x00,0x3F,0x3F,0x3F,0x00,0x00},
  179.                                            };//T
  180. uchar code num[16][16]={
  181.                                         {0x00,0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x0F,0x1F,0x30,0x20,0x30,0x1F,0x0F},/*"0",0*/
  182.                                                 {0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x3F,0x20,0x20},/*"1",1*/
  183.                                                 {0x00,0x70,0x78,0x08,0x08,0x08,0xF8,0xF0,0x00,0x30,0x38,0x2C,0x26,0x23,0x31,0x30},/*"2",2*/
  184.                                                 {0x00,0x30,0x38,0x08,0x08,0x88,0xF8,0x70,0x00,0x18,0x38,0x21,0x21,0x23,0x3E,0x1C},/*"3",3*/
  185.                                                 {0x00,0x00,0x80,0xC0,0x70,0xF8,0xF8,0x00,0x00,0x06,0x07,0x25,0x24,0x3F,0x3F,0x24},/*"4",4*/
  186.                                                 {0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x19,0x39,0x20,0x20,0x31,0x1F,0x0E},/*"5",5*/
  187.                                                 {0x00,0xE0,0xF0,0x98,0x88,0x98,0x90,0x00,0x00,0x0F,0x1F,0x31,0x20,0x20,0x3F,0x1F},/*"6",6*/
  188.                                                 {0x00,0x18,0x18,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x3E,0x3F,0x01,0x00,0x00},/*"7",7*/
  189.                                                 {0x00,0x70,0xF8,0x88,0x08,0x88,0xF8,0x70,0x00,0x1C,0x3E,0x23,0x21,0x23,0x3E,0x1C},/*"8",8*/
  190.                                                 {0x00,0xF0,0xF8,0x08,0x08,0x18,0xF0,0xE0,0x00,0x01,0x13,0x32,0x22,0x33,0x1F,0x0F},/*"9",9*/
  191.                                                 {0x00,0x00,0xC0,0xF8,0xF8,0xE0,0x00,0x00,0x20,0x3C,0x3F,0x23,0x02,0x27,0x3F,0x38},/*"A",10*/
  192.                                                 {0x08,0xF8,0xF8,0x88,0x88,0xF8,0x70,0x00,0x20,0x3F,0x3F,0x20,0x20,0x31,0x1F,0x0E},/*"B",11*/
  193.                                                 {0xC0,0xF0,0x38,0x08,0x08,0x08,0x38,0x38,0x07,0x1F,0x38,0x20,0x20,0x30,0x18,0x08},/*"C",12*/
  194.                                                 {0x08,0xF8,0xF8,0x08,0x08,0x18,0xF0,0xE0,0x20,0x3F,0x3F,0x20,0x20,0x30,0x1F,0x0F},/*"D",13*/
  195.                                                 {0x08,0xF8,0xF8,0x88,0xE8,0xE8,0x18,0x10,0x20,0x3F,0x3F,0x20,0x23,0x23,0x38,0x18},/*"E",14*/
  196.                                                 {0x08,0xF8,0xF8,0x88,0xE8,0xE8,0x18,0x10,0x20,0x3F,0x3F,0x20,0x03,0x03,0x00,0x00},/*"F",15*/
  197.                                            };
  198. void delay(uint z)
  199.         {
  200.          uint x,y;
  201.          for(x=z;x>0;x--)
  202.          for(y=925;y>0;y--);
  203.         }
  204. void init_uart( )                //2400bps@11.0592MHz
  205.         {
  206.          PCON &= 0x7F;                //波特率不倍速
  207.          SCON = 0x50;                //8位數據,可變波特率
  208.          AUXR &= 0xFB;                //定時器時鐘12T模式
  209.          BRT = 0xF4;                        //設置定時重載值
  210.          AUXR |= 0x01;                //串口1使用獨立波特率發射器為波特率發生器
  211.          //AUXR |= 0x10;                //啟動獨立波特率發射器
  212.         }
  213. void timer0( )                     //50毫秒 16位自動重載
  214.         {
  215.          AUXR &= 0x3F;                        //定時器時鐘12T模式
  216.          TMOD = 0x11;                        //設置定時器模式
  217.          TL0 = 0x00;                        //設置定時初始值
  218.          TH0 = 0x4C;                        //設置定時初始值
  219.          TL1 = 0x00;                        //設置定時初始值
  220.          TH1 = 0x4C;                        //設置定時初始值
  221.          TF0 = 0;                                //清除TF0標志
  222.          TF1 = 0;                                //清除TF1標志
  223.          EA=1;
  224.          ET0=1;                                    //開中斷
  225.          ET1=1;
  226.         }
  227. void IAP_CLOSE()                                         //關閉IAP
  228.         {
  229.      IAP_CONTR = 0;                  //關閉IAP功能
  230.      IAP_CMD = 0;                    //清除命令寄存器
  231.      IAP_TRIG = 0;                   //清除觸發寄存器
  232.      IAP_ADDRH = 0x80;               //將地址設置到非IAP區域
  233.      IAP_ADDRL = 0;
  234.         }
  235. uchar READ_IAP(uint addr)                         //讀一個字節
  236.         {                                                             //5A60S2有1kb存儲空間,空間地址從0000H到03FFH,每512字節為一個扇區,共2個扇區
  237.      uchar dat;                      //數據緩沖區
  238.      IAP_CONTR = 0x83;               //使能IAP,1000----,設置CPU等待時間(11.0592)---- 0011
  239.      IAP_CMD =0X01;                  //設置IAP讀取命令
  240.      IAP_ADDRL = addr;               //設置IAP低地址
  241.      IAP_ADDRH = addr >> 8;          //設置IAP高地址
  242.      IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  243.      IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  244.      _nop_( );                       //等待ISP/IAP/EEPROM操作完成
  245.          _nop_( );
  246.          _nop_( );
  247.      dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數據
  248.      IAP_CLOSE( );                   //關閉IAP功能
  249.      return dat;                     //返回
  250.         }
  251. void WRITE_IAP(uint addr, uchar dat) //寫入一個字節
  252.         {
  253.      IAP_CONTR =0x83;                          //使能IAP
  254.      IAP_CMD =0X02;                           //設置IAP寫入命令
  255.      IAP_ADDRL = addr;               //設置IAP低地址
  256.      IAP_ADDRH = addr >> 8;          //設置IAP高地址
  257.      IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數據
  258.      IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  259.      IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  260.      delay(1);                      //等待ISP/IAP/EEPROM操作完成 用不了1毫秒,幾十微秒就可,有微秒函數可替換
  261.      IAP_CLOSE( );
  262.         }
  263. void DELETE_IAP(uint addr)                         //扇區擦除
  264.         {
  265.      IAP_CONTR = 0x83;               //使能IAP
  266.      IAP_CMD =0x03;                    //設置IAP命令
  267.      IAP_ADDRL = addr;               //設置IAP低地址
  268.      IAP_ADDRH = addr >> 8;          //設置IAP高地址
  269.      IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  270.      IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  271.      delay(25);                       //等待ISP/IAP/EEPROM操作完成
  272.      IAP_CLOSE( );
  273.         }
  274. void start( )
  275.         {
  276.          SCL = 1;               
  277.             SDA = 1;
  278.             SDA = 0;
  279.          _nop_( );
  280.          _nop_( );

  281.             SCL = 0;
  282.          _nop_( );
  283.          _nop_( );
  284.         }
  285. void stop( )
  286.         {
  287.          SCL=0;
  288.          SDA=0;
  289.          _nop_( );
  290.          SCL=1;
  291.          _nop_( );
  292.          SDA=1;
  293.          _nop_( );
  294.          _nop_( );
  295.          _nop_( );
  296.          _nop_( );
  297.          _nop_( );
  298.          _nop_( );
  299.          _nop_( );
  300.          _nop_( );
  301.         }
  302. void writebyte(uchar date)                //寫1個字節
  303.         {
  304.          uchar i;
  305.          for(i=8;i>0;i--)
  306.                  {
  307.                  date<<=1;
  308.                  SDA=CY;
  309.                  SCL=1;
  310.                  _nop_( );
  311.                  _nop_( );
  312.                  SCL=0;
  313.                  _nop_( );
  314.                  _nop_( );
  315.                 }
  316.            SDA=1;
  317.        SCL=1;
  318.            _nop_( );
  319.        SCL=0;
  320.         }
  321. void qingping( )
  322.         {
  323.          uchar x,y;
  324.          for(y=0;y<8;y++)
  325.                  {
  326.                  start();
  327.               writebyte(0x78);         
  328.              writebyte(0x00);                //寫指令            
  329.              writebyte(0xb0+y);            
  330.                  writebyte(0x00);          //列地址低位
  331.                  writebyte(0x10);          //列地址高位
  332.              stop();           
  333.                  start();
  334.                 writebyte(0x78);           
  335.          writebyte(0x40);      //寫數據
  336.                  for(x=0;x<128;x++)
  337.                          {
  338.                          writebyte(0x00);                           //清屏
  339.                         }
  340.                  stop();
  341.                 }
  342.         }
  343. void initoled( )                           //初始化OLED
  344.         {
  345.          start();
  346.      writebyte(0x78);         
  347.             writebyte(0x00);                //寫指令                 
  348.      writebyte(0xae);  //--關閉oled面板
  349.      writebyte(0x00);  //---設置低列地址
  350.      writebyte(0x10);  //---設置高列地址
  351.      writebyte(0x40);  //--設置起始行地址設置映射RAM顯示起始行 (0x00~0x3F)
  352.      writebyte(0x81);  //--設置對比度控制寄存器
  353.      writebyte(0xFF); // 設置SEG輸出電流亮度
  354.      writebyte(0xa1);  //--設置SEG/列映射     0xa0左右反置 0xa1正常
  355.      writebyte(0xc8);  //設置COM/行掃描方向   0xc0上下反置 0xc8正常
  356.      writebyte(0xa6);  //--設置正常顯示
  357.      writebyte(0xa8);  //--設置多路復用率(1 to 64)
  358.      writebyte(0x3f);  //--1/64 duty
  359.      writebyte(0xd3);  //-設置顯示偏移        移位映射RAM計數器 (0x00~0x3F)
  360.      writebyte(0x00);  //-不抵消
  361.      writebyte(0xd5);  //--設置顯示時鐘分頻比/振蕩器頻率
  362.      writebyte(0x80);  //--設置分頻比,將時鐘設置為100幀/秒
  363.      writebyte(0xd9);  //--設定預充電時間
  364.      writebyte(0xf1);  //將預充電設置為15個時鐘,放電設置為1個時鐘
  365.      writebyte(0xda);  //--設置com引腳硬件配置
  366.      writebyte(0x12);
  367.      writebyte(0xdb);  //--set vcomh
  368.      writebyte(0x30);  //設置VCOM取消選擇級別
  369.      writebyte(0x20);  //-設置頁面尋址模式 (0x00/0x01/0x02)
  370.      writebyte(0x02);  //
  371.      writebyte(0x8d);  //--設置電荷泵啟用/禁用
  372.      writebyte(0x14);  //--set(0x10) 使能
  373.      writebyte(0xa4);  // 在屏幕上禁用整個顯示 (0xa4/0xa5)
  374.      writebyte(0xa6);  // 禁用反轉顯示打開 (0xa6/a7)
  375.          stop( );
  376.          qingping( );
  377.          start();
  378.      writebyte(0x78);         
  379.             writebyte(0x00);                //寫指令
  380.          writebyte(0xaf);  //--打開oled面板  //先清屏再開顯示,否則容易顯示斷電前上一次的圖像
  381.          stop( );
  382.         }
  383. void display( )
  384.         {
  385.      uchar x,y,z;
  386.          z=34;                                                           //要寫入的列地址首位
  387.          for(y=0;y<3;y++)
  388.                  {
  389.                  start();
  390.               writebyte(0x78);         
  391.              writebyte(0x00);                //寫指令            
  392.              writebyte(0xb0+y);                          //b0代表第一頁,最上面一檔的8個像素,寫0-1-2共3頁
  393.                  writebyte(0x00+(z%16));          //列地址低位,占用60列,居中排列則左邊第34個列地址開始寫
  394.                  writebyte(0x10+(z/16));          //列地址高位
  395.              stop();           
  396.                  start();
  397.                 writebyte(0x78);           
  398.          writebyte(0x40);      //寫數據
  399.                  for(x=0;x<60;x++)
  400.                          {
  401.                          writebyte(STC[y][x]);
  402.                         }
  403.                  stop( );
  404.                 }
  405.          delay(200);
  406.          z=4;
  407.          for(y=0;y<3;y++)
  408.                  {
  409.                  start();
  410.               writebyte(0x78);         
  411.              writebyte(0x00);                //寫指令            
  412.              writebyte(0xb3+y);                          //b3代表第4頁,寫4-5-6共3頁
  413.                  writebyte(0x00+(z%16));          //列地址低位
  414.                  writebyte(0x10+(z/16));          //列地址高位
  415.              stop();           
  416.                  start();
  417.                 writebyte(0x78);           
  418.          writebyte(0x40);      //寫數據
  419.                  for(x=0;x<24;x++)
  420.                          {
  421.                          writebyte(leng2424[y][x]);
  422.                         }
  423.                  stop( );
  424.                 }
  425.          delay(200);
  426.          z=z+24;
  427.          for(y=0;y<3;y++)
  428.                  {
  429.                  start();
  430.               writebyte(0x78);         
  431.              writebyte(0x00);                //寫指令            
  432.              writebyte(0xb3+y);                          //b3代表第4頁,寫4-5-6共3頁
  433.                  writebyte(0x00+(z%16));          //列地址低位
  434.                  writebyte(0x10+(z/16));          //列地址高位
  435.              stop();           
  436.                  start();
  437.                 writebyte(0x78);           
  438.          writebyte(0x40);      //寫數據
  439.                  for(x=0;x<24;x++)
  440.                          {
  441.                          writebyte(qi2424[y][x]);
  442.                         }
  443.                  stop( );
  444.                 }
  445.          delay(200);
  446.          z=z+24;
  447.          for(y=0;y<3;y++)
  448.                  {
  449.                  start();
  450.               writebyte(0x78);         
  451.              writebyte(0x00);                //寫指令            
  452.              writebyte(0xb3+y);                          //b3代表第4頁,寫4-5-6共3頁
  453.                  writebyte(0x00+(z%16));          //列地址低位
  454.                  writebyte(0x10+(z/16));          //列地址高位
  455.              stop();           
  456.                  start();
  457.                 writebyte(0x78);           
  458.          writebyte(0x40);      //寫數據
  459.                  for(x=0;x<24;x++)
  460.                          {
  461.                          writebyte(dong2424[y][x]);
  462.                         }
  463.                  stop( );
  464.                 }
  465.          delay(200);
  466.          z=z+24;
  467.          for(y=0;y<3;y++)
  468.                  {
  469.                  start();
  470.               writebyte(0x78);         
  471.              writebyte(0x00);                //寫指令            
  472.              writebyte(0xb3+y);                          //b3代表第4頁,寫4-5-6共3頁
  473.                  writebyte(0x00+(z%16));          //列地址低位
  474.                  writebyte(0x10+(z/16));          //列地址高位
  475.              stop();           
  476.                  start();
  477.                 writebyte(0x78);           
  478.          writebyte(0x40);      //寫數據
  479.                  for(x=0;x<24;x++)
  480.                          {
  481.                          writebyte(xia2424[y][x]);
  482.                         }
  483.                  stop( );
  484.                 }
  485.          delay(200);
  486.          z=z+24;
  487.          for(y=0;y<3;y++)
  488.                  {
  489.                  start();
  490.               writebyte(0x78);         
  491.              writebyte(0x00);                //寫指令            
  492.              writebyte(0xb3+y);                          //b3代表第4頁,寫4-5-6共3頁
  493.                  writebyte(0x00+(z%16));          //列地址低位
  494.                  writebyte(0x10+(z/16));          //列地址高位
  495.              stop();           
  496.                  start();
  497.                 writebyte(0x78);           
  498.          writebyte(0x40);      //寫數據
  499.                  for(x=0;x<24;x++)
  500.                          {
  501.                          writebyte(zai2424[y][x]);
  502.                         }
  503.                  stop( );
  504.                 }
  505.          delay(200);
  506.          z=40;
  507.          start();
  508.             writebyte(0x78);         
  509.             writebyte(0x00);                //寫指令            
  510.             writebyte(0xb7);                          //b7代表最后一頁
  511.          writebyte(0x00+(z%16));          //列地址低位
  512.          writebyte(0x10+(z/16));          //列地址高位
  513.             stop();
  514.          start();
  515.             writebyte(0x78);           
  516.      writebyte(0x40);      //寫數據
  517.          for(x=0;x<23;x++)
  518.                  {
  519.                  writebyte(0x30);                  //_____
  520.                 }
  521.          stop( );
  522.          delay(200);
  523.          z=63;
  524.          for(y=0;y<2;y++)
  525.                  {
  526.                  start();
  527.                      writebyte(0x78);         
  528.                     writebyte(0x00);                //寫指令            
  529.                     writebyte(0xb6+y);                          //b6 b7 代表最后2頁
  530.                  writebyte(0x00+(z%16));          //列地址低位
  531.                  writebyte(0x10+(z/16));          //列地址高位
  532.                     stop();
  533.                  start();
  534.                      writebyte(0x78);           
  535.                 writebyte(0x40);      //寫數據
  536.                  for(x=0;x<16;x++)
  537.                          {
  538.                          writebyte(ou1616[y][x]);
  539.                         }
  540.                  stop( );
  541.                 }
  542.          delay(200);
  543.          z=z+16;
  544.          for(y=0;y<2;y++)
  545.                  {
  546.                  start();
  547.                      writebyte(0x78);         
  548.                     writebyte(0x00);                //寫指令            
  549.                     writebyte(0xb6+y);                          //b6 b7 代表最后2頁
  550.                  writebyte(0x00+(z%16));          //列地址低位
  551.                  writebyte(0x10+(z/16));          //列地址高位
  552.                     stop();
  553.                  start();
  554.                      writebyte(0x78);           
  555.                 writebyte(0x40);      //寫數據
  556.                  for(x=0;x<16;x++)
  557.                          {
  558.                          writebyte(yang1616[y][x]);
  559.                         }
  560.                  stop();
  561.                 }
  562.          delay(200);
  563.          z=z+16;
  564.          for(y=0;y<2;y++)
  565.                  {
  566.                  start();
  567.                      writebyte(0x78);         
  568.                     writebyte(0x00);                //寫指令            
  569.                     writebyte(0xb6+y);                          //b6 b7 代表最后2頁
  570.                  writebyte(0x00+(z%16));          //列地址低位
  571.                  writebyte(0x10+(z/16));          //列地址高位
  572.                     stop();
  573.                  start();
  574.                      writebyte(0x78);           
  575.                 writebyte(0x40);      //寫數據
  576.                  for(x=0;x<16;x++)
  577.                          {
  578.                          writebyte(yun1616[y][x]);
  579.                         }
  580.                  stop();
  581.                 }
  582.          delay(200);
  583.          z=z+16;
  584.          for(y=0;y<2;y++)
  585.                  {
  586.                  start();
  587.                      writebyte(0x78);         
  588.                     writebyte(0x00);                //寫指令            
  589.                     writebyte(0xb6+y);                          //b6 b7 代表最后2頁
  590.                  writebyte(0x00+(z%16));          //列地址低位
  591.                  writebyte(0x10+(z/16));          //列地址高位
  592.                     stop();
  593.                  start();
  594.                      writebyte(0x78);           
  595.                 writebyte(0x40);      //寫數據
  596.                  for(x=0;x<16;x++)
  597.                          {
  598.                          writebyte(tian1616[y][x]);
  599.                         }
  600.                  stop();
  601.                 }
  602.         }
  603. void displaymoshi(uchar page,uchar addr)
  604.         {
  605.          uchar x,y;
  606.          for(y=0;y<2;y++)
  607.                  {
  608.                  start();
  609.                      writebyte(0x78);         
  610.                     writebyte(0x00);                //寫指令            
  611.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  612.                  writebyte(0x00+(addr%16));          //列地址低位
  613.                  writebyte(0x10+(addr/16));          //列地址高位
  614.                     stop();
  615.                  start();
  616.                      writebyte(0x78);           
  617.                 writebyte(0x40);      //寫數據
  618.                  for(x=0;x<16;x++)
  619.                          {
  620.                          writebyte(mo1616[y][x]);      //寫數據
  621.                         }
  622.                  for(x=0;x<16;x++)                                   //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
  623.                          {
  624.                          writebyte(shi1616[y][x]);      //寫數據               
  625.                         }
  626.                  stop( );
  627.                 }
  628.         }
  629. void dispcunchucuowu( )
  630.         {
  631.          uchar x,y;
  632.          for(y=0;y<3;y++)
  633.                  {
  634.                  start();
  635.                      writebyte(0x78);         
  636.                     writebyte(0x00);                //寫指令            
  637.                     writebyte(0xb1+y);                          
  638.                  writebyte(0x00+(39%16));          //列地址低位
  639.                  writebyte(0x10+(39/16));          //列地址高位
  640.                     stop();
  641.                  start();
  642.                      writebyte(0x78);           
  643.                 writebyte(0x40);      //寫數據
  644.                  for(x=0;x<24;x++)
  645.                         {
  646.                          writebyte(cun2424[y][x]);     //存
  647.                         }
  648.                  for(x=0;x<24;x++)                                 
  649.                          {
  650.                          writebyte(chu2424[y][x]);     //儲                 
  651.                         }
  652.                  stop( );
  653.                 }
  654.          for(y=0;y<3;y++)
  655.                  {
  656.                  start();
  657.                      writebyte(0x78);         
  658.                     writebyte(0x00);                //寫指令            
  659.                     writebyte(0xb4+y);                          
  660.                  writebyte(0x00+(15%16));          //列地址低位
  661.                  writebyte(0x10+(15/16));          //列地址高位
  662.                     stop();
  663.                  start();
  664.                      writebyte(0x78);           
  665.                 writebyte(0x40);      //寫數據
  666.                  for(x=0;x<24;x++)
  667.                         {
  668.                          writebyte(cuo2424[y][x]);       //錯
  669.                         }
  670.                  for(x=0;x<24;x++)                                 
  671.                          {
  672.                          writebyte(wu2424[y][x]);               //誤        
  673.                         }
  674.                  for(x=0;x<24;x++)
  675.                         {
  676.                          writebyte(ce2424[y][x]);               //測
  677.                         }
  678.                  for(x=0;x<24;x++)                                 
  679.                          {
  680.                          writebyte(shi2424[y][x]);       //試               
  681.                         }
  682.                  stop( );
  683.                 }
  684.         }
  685. void dispshujucuowu( )
  686.         {
  687.          uchar x,y;
  688.          for(y=0;y<3;y++)
  689.                  {
  690.                  start();
  691.                      writebyte(0x78);         
  692.                     writebyte(0x00);                //寫指令            
  693.                     writebyte(0xb1+y);                          
  694.                  writebyte(0x00+(39%16));          //列地址低位
  695.                  writebyte(0x10+(39/16));          //列地址高位
  696.                     stop();
  697.                  start();
  698.                      writebyte(0x78);           
  699.                 writebyte(0x40);      //寫數據
  700.                  for(x=0;x<24;x++)
  701.                         {
  702.                          writebyte(shu2424[y][x]);     //數
  703.                         }
  704.                  for(x=0;x<24;x++)                                 
  705.                          {
  706.                          writebyte(ju2424[y][x]);     //據                 
  707.                         }
  708.                  stop( );
  709.                 }
  710.          for(y=0;y<3;y++)
  711.                  {
  712.                  start();
  713.                      writebyte(0x78);         
  714.                     writebyte(0x00);                //寫指令            
  715.                     writebyte(0xb4+y);                          
  716.                  writebyte(0x00+(15%16));          //列地址低位
  717.                  writebyte(0x10+(15/16));          //列地址高位
  718.                     stop();
  719.                  start();
  720.                      writebyte(0x78);           
  721.                 writebyte(0x40);      //寫數據
  722.                  for(x=0;x<24;x++)
  723.                         {
  724.                          writebyte(cun2424[y][x]);       //存
  725.                         }
  726.                  for(x=0;x<24;x++)                                 
  727.                          {
  728.                          writebyte(chu2424[y][x]);               //儲        
  729.                         }
  730.                  for(x=0;x<24;x++)
  731.                         {
  732.                          writebyte(cuo2424[y][x]);               //錯
  733.                         }
  734.                  for(x=0;x<24;x++)                                 
  735.                          {
  736.                          writebyte(wu2424[y][x]);       //誤               
  737.                         }
  738.                  stop( );
  739.                 }
  740.         }
  741. void displayshouzi(uchar page,uchar addr,bit m)
  742.         {
  743.          uchar x,y;
  744.          for(y=0;y<2;y++)
  745.                  {
  746.                  start();
  747.                      writebyte(0x78);         
  748.                     writebyte(0x00);                //寫指令            
  749.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  750.                  writebyte(0x00+(addr%16));          //列地址低位
  751.                  writebyte(0x10+(addr/16));          //列地址高位
  752.                     stop();
  753.                  start();
  754.                      writebyte(0x78);           
  755.                 writebyte(0x40);      //寫數據
  756.                  for(x=0;x<16;x++)
  757.                          {
  758.                          if(m==0)
  759.                                  {
  760.                                   writebyte(zi1616[y][x]);      //寫數據
  761.                                  }
  762.                          else
  763.                                  {
  764.                                  writebyte(shou1616[y][x]);
  765.                                 }
  766.                         }
  767.                  for(x=0;x<16;x++)                                   //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
  768.                          {
  769.                          writebyte(dong1616[y][x]);      //寫數據               
  770.                         }
  771.                  stop( );
  772.                 }
  773.         }
  774. void dispckou(uchar page,uchar addr)
  775.         {
  776.          uchar x,y;
  777.          for(y=0;y<2;y++)
  778.                  {
  779.                  start();
  780.                      writebyte(0x78);         
  781.                     writebyte(0x00);                //寫指令            
  782.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  783.                  writebyte(0x00+(addr%16));          //列地址低位
  784.                  writebyte(0x10+(addr/16));          //列地址高位
  785.                     stop();
  786.                  start();
  787.                      writebyte(0x78);           
  788.                 writebyte(0x40);      //寫數據
  789.                  for(x=0;x<16;x++)
  790.                          {
  791.                          writebyte(chuan1616[y][x]);      //寫數據
  792.                         }
  793.                  for(x=0;x<16;x++)                                   //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
  794.                          {
  795.                          writebyte(kou1616[y][x]);      //寫數據               
  796.                         }
  797.                  stop( );
  798.                 }
  799.         }
  800. void dispkaiguan(uchar page,uchar addr,bit m)
  801.         {
  802.          uchar x,y;
  803.          for(y=0;y<2;y++)
  804.                  {
  805.                  start();
  806.                      writebyte(0x78);         
  807.                     writebyte(0x00);                //寫指令            
  808.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  809.                  writebyte(0x00+(addr%16));          //列地址低位
  810.                  writebyte(0x10+(addr/16));          //列地址高位
  811.                     stop();
  812.                  start();
  813.                      writebyte(0x78);           
  814.                 writebyte(0x40);      //寫數據
  815.                  for(x=0;x<16;x++)
  816.                          {
  817.                          if(m==0)
  818.                                  {
  819.                                   writebyte(guan1616[y][x]);      //寫數據
  820.                                  }
  821.                          else
  822.                                  {
  823.                                  writebyte(kai1616[y][x]);
  824.                                 }
  825.                         }
  826.                  for(x=0;x<16;x++)                                   //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
  827.                          {
  828.                      if(m==0)
  829.                                  {
  830.                                   writebyte(bi1616[y][x]);      //寫數據
  831.                                  }
  832.                          else
  833.                                  {
  834.                                  writebyte(qi1616[y][x]);
  835.                                 }               
  836.                         }
  837.                  stop( );
  838.                 }
  839.         }
  840. void dispvcc(uchar page,uchar addr,bit vcc)
  841.         {
  842.          uchar x,y;
  843.          for(y=0;y<2;y++)
  844.                  {
  845.                  start();
  846.                      writebyte(0x78);         
  847.                     writebyte(0x00);                //寫指令            
  848.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  849.                  writebyte(0x00+(addr%16));          //列地址低位
  850.                  writebyte(0x10+(addr/16));          //列地址高位
  851.                     stop();
  852.                  start();
  853.                      writebyte(0x78);           
  854.                 writebyte(0x40);      //寫數據
  855.                  for(x=0;x<8;x++)
  856.                          {
  857.                          if(vcc==0)
  858.                                  {
  859.                                   writebyte(U0816[y][x]);      //寫數據
  860.                                  }
  861.                          else
  862.                                  {
  863.                                  writebyte(I0816[y][x]);
  864.                                 }
  865.                         }
  866.                  for(x=0;x<8;x++)                                   //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
  867.                          {
  868.                      if(vcc==0)
  869.                                  {
  870.                                   writebyte(S0816[y][x]);      //寫數據
  871.                                  }
  872.                          else
  873.                                  {
  874.                                  writebyte(N0816[y][x]);
  875.                                 }               
  876.                         }
  877.                  for(x=0;x<8;x++)                                   //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
  878.                          {
  879.                      if(vcc==0)
  880.                                  {
  881.                                   writebyte(B0816[y][x]);      //寫數據
  882.                                  }
  883.                          else
  884.                                  {
  885.                                  writebyte(T0816[y][x]);
  886.                                 }               
  887.                         }
  888.                  stop( );
  889.                 }
  890.         }
  891. void dispgongdian(uchar page,uchar addr)
  892.         {
  893.          uchar x,y;
  894.          for(y=0;y<2;y++)
  895.                  {
  896.                  start();
  897.                      writebyte(0x78);         
  898.                     writebyte(0x00);                //寫指令            
  899.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  900.                  writebyte(0x00+(addr%16));          //列地址低位
  901.                  writebyte(0x10+(addr/16));          //列地址高位
  902.                     stop();
  903.                  start();
  904.                      writebyte(0x78);           
  905.                 writebyte(0x40);      //寫數據
  906.                  for(x=0;x<16;x++)
  907.                          {
  908.                          writebyte(gong1616[y][x]);      //寫數據
  909.                         }
  910.                  for(x=0;x<16;x++)                                   //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
  911.                          {
  912.                          writebyte(dian1616[y][x]);      //寫數據               
  913.                         }
  914.                  stop( );
  915.                 }
  916.         }
  917. void dispnum2(uchar page,uchar addr,bit jz,uchar n)                         //寫2位數字
  918.         {
  919.          uchar x,y,na,nb;
  920.          if(jz==0)                   //jz=0代表10進制
  921.                  {
  922.                  na=n/10;
  923.                  nb=n%10;
  924.                  }
  925.          else                          //jz=1代表16進制
  926.                  {
  927.                  na=n/16;
  928.                  nb=n%16;
  929.                 }
  930.          for(y=0;y<2;y++)
  931.                  {
  932.                  start();
  933.                      writebyte(0x78);         
  934.                     writebyte(0x00);                //寫指令            
  935.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  936.                  writebyte(0x00+(addr%16));          //列地址低位
  937.                  writebyte(0x10+(addr/16));          //列地址高位
  938.                     stop();
  939.                  start();
  940.                      writebyte(0x78);           
  941.                 writebyte(0x40);      //寫數據
  942.                  for(x=0;x<8;x++)
  943.                          {
  944.                          if(y==0)
  945.                                  {
  946.                                   writebyte(num[na][x]);
  947.                                  }
  948.                          else
  949.                                  {
  950.                                   writebyte(num[na][x+8]);
  951.                                  }
  952.                         }
  953.                  for(x=0;x<8;x++)
  954.                          {
  955.                          if(y==0)
  956.                                  {
  957.                                   writebyte(num[nb][x]);
  958.                                  }
  959.                          else
  960.                                  {
  961.                                   writebyte(num[nb][x+8]);
  962.                                  }
  963.                         }
  964.                 }
  965.         }
  966. void disp_nn(uchar page,uchar addr)
  967.         {
  968.          uchar x,y;
  969.          for(y=0;y<2;y++)
  970.                  {
  971.                  start();
  972.                      writebyte(0x78);         
  973.                     writebyte(0x00);                //寫指令            
  974.                     writebyte(0xb0+y+page);                          //b6 b7 代表最后2頁
  975.                  writebyte(0x00+(addr%16));          //列地址低位
  976.                  writebyte(0x10+(addr/16));          //列地址高位
  977.                     stop();
  978.                  start();
  979.                      writebyte(0x78);           
  980.                 writebyte(0x40);      //寫數據
  981.                  for(x=0;x<16;x++)
  982.                          {
  983.                          if(y==0)
  984.                                  {
  985.                              writebyte(0x80);      //寫數據 ___
  986.                                  }
  987.                          else
  988.                                  {
  989.                                  writebyte(0x01);      //寫數據 ___
  990.                                 }
  991.                         }
  992.                  stop( );
  993.                 }
  994.         }
  995. void main( )
  996.         {
  997.          bit key,ms,ck,dy,dc,xz,btx;                //按鍵標志 模式狀態 串口狀態 供電選擇 電源開/關  下載標志 7F檢測失敗
  998.          uchar vdc,dat,j;           //供電選擇存儲數據 串口接收數據 7F個數
  999.          uint tt;                           //長按/短按計數
  1000.          uchar btln,btl;                           //波特率掃描次數 波特率
  1001.          delay(100);
  1002.          initoled( );
  1003.          init_uart( );
  1004.          timer0( );
  1005.          led=0;
  1006.          display( );
  1007.          delay(1500);
  1008.          led=1;
  1009.          qingping( );
  1010.          vdc=READ_IAP(0x0000);          //讀出供電存儲數據
  1011.          if(vdc==0x01||vdc==0x10)
  1012.                  {
  1013.                  if(vdc==0x01)
  1014.                          {
  1015.                          dy=0;                          //讀出的數據是01則是USB供電
  1016.                         }
  1017.                  else
  1018.                          {
  1019.                          dy=1;                          //讀出的數據是10則是INT供電
  1020.                         }
  1021.                 }
  1022.          else                                                  //既不是01也不是10的話,則是數據錯誤,可能是新的主控MCU,應該重新寫入數據
  1023.                  {
  1024.                  DELETE_IAP(0x0000);      //擦除扇區
  1025.                  WRITE_IAP(0X0000,0x01);  //重新寫入供電存儲數據,默認是USB供電
  1026.                  vdc=READ_IAP(0x0000);    //重新讀出數據
  1027.                  dispshujucuowu( );                          //報錯
  1028.                  delay(1500);
  1029.                  qingping( );
  1030.                 }
  1031.          displaymoshi(0,16);
  1032.          displayshouzi(0,80,ms);
  1033.          dispckou(4,16);
  1034.          dispvcc(2,0,dy);
  1035.          dispgongdian(2,24);
  1036.          dispkaiguan(2,80,dc);
  1037.          dispkaiguan(4,80,ck);
  1038.          disp_nn(6,75);
  1039.          disp_nn(6,110);
  1040.          disp_nn(6,0);
  1041.          disp_nn(6,16);
  1042.          delay(500);
  1043.          if(dy==1)
  1044.                  {
  1045.                  J3=0;                  //啟動INT供電繼電器GND
  1046.                  J1=0;
  1047.                  dc=1;
  1048.                  dispkaiguan(2,80,dc);
  1049.                 }
  1050.          else
  1051.                  {
  1052.                  J4=0;                 //啟動USB供電繼電器GND
  1053.                  J2=0;
  1054.                  dc=1;
  1055.                  dispkaiguan(2,80,dc);
  1056.                 }
  1057.          while(1)
  1058.                  {
  1059.                  if(ck==0)            //串口標志關閉時,掃描串口是否打開                                
  1060.                          {
  1061.                          if(RTS==0)
  1062.                                  {
  1063.                                  delay(1);
  1064.                                  if(RTS==0)
  1065.                                          {
  1066.                                          ck=1;
  1067.                                          dispkaiguan(4,80,ck);                 //識別到串口打開,更新顯示
  1068.                                          led=0;
  1069.                                         }
  1070.                                 }
  1071.                         }
  1072.                  if(ck)                                             
  1073.                          {
  1074.                          if(xz==0)                                                   //沒有出現下載標志時,定時調整波特率用以檢測7F,下載標志出現時就不能再調整波特率了
  1075.                                  {                                                           //2400-4800-9600-2400-4800-9600,共測試3種常用波特率,循環2次仍未檢測到7F就不再檢測
  1076.                                  if(btln==0&&bt==0)                           //波特率切換計數 波特率設置標志
  1077.                                          {
  1078.                                          btl=2400;                                   //從2400開始掃描
  1079.                                          AUXR&=0XEF;                           //停止獨立波特率發生器
  1080.                                          dispnum2(6,0,0,24);
  1081.                               dispnum2(6,16,0,0);
  1082.                                          BRT = 0xF4;                           //設置定時重載值
  1083.                                          AUXR |= 0x10;                       //啟動獨立波特率發生器
  1084.                                          bt=1;                                           //修改波特率標志,防止多次修改
  1085.                                          btln++;
  1086.                                          TR0=1;                                           //啟動定時器計時
  1087.                                         }
  1088.                                  if(btln==1&&bt==0)
  1089.                                          {
  1090.                                          btl=4800;                                   //波特率4800
  1091.                                          AUXR&=0XEF;                           //停止獨立波特率發生器
  1092.                                          dispnum2(6,0,0,48);
  1093.                                          BRT = 0xFA;                           //設置定時重載值
  1094.                                          AUXR |= 0x10;                       //啟動獨立波特率發生器
  1095.                                          bt=1;                                           //修改波特率標志,防止多次修改
  1096.                                          btln++;
  1097.                                          TR0=1;                                           //啟動定時器計時
  1098.                                         }
  1099.                                  if(btln==2&&bt==0)
  1100.                                          {
  1101.                                          btl=9600;                                   //波特率9600
  1102.                                          AUXR&=0XEF;                           //停止獨立波特率發生器
  1103.                                          dispnum2(6,0,0,96);
  1104.                                          BRT = 0xFD;                           //設置定時重載值
  1105.                                          AUXR |= 0x10;                       //啟動獨立波特率發生器
  1106.                                          bt=1;                                           //修改波特率標志,防止多次修改
  1107.                                          btln++;
  1108.                                          TR0=1;                                           //啟動定時器計時
  1109.                                         }
  1110.                                  if(btln==3&&bt==0)
  1111.                                          {
  1112.                                          btl=2400;                                   //從2400開始掃描
  1113.                                          AUXR&=0XEF;                           //停止獨立波特率發生器
  1114.                                          dispnum2(6,0,0,24);
  1115.                               dispnum2(6,16,0,0);
  1116.                                          BRT = 0xF4;                           //設置定時重載值
  1117.                                          AUXR |= 0x10;                       //啟動獨立波特率發生器
  1118.                                          bt=1;                                           //修改波特率標志,防止多次修改
  1119.                                          btln++;
  1120.                                          TR0=1;                                           //啟動定時器計時
  1121.                                         }
  1122.                                  if(btln==4&&bt==0)
  1123.                                          {
  1124.                                          btl=4800;                                   //波特率4800
  1125.                                          AUXR&=0XEF;                           //停止獨立波特率發生器
  1126.                                          dispnum2(6,0,0,48);
  1127.                                          BRT = 0xFA;                           //設置定時重載值
  1128.                                          AUXR |= 0x10;                       //啟動獨立波特率發生器
  1129.                                          bt=1;                                           //修改波特率標志,防止多次修改
  1130.                                          btln++;
  1131.                                          TR0=1;                                           //啟動定時器計時
  1132.                                         }
  1133.                                  if(btln==5&&bt==0)
  1134.                                          {
  1135.                                          btl=9600;                                   //波特率9600
  1136.                                          AUXR&=0XEF;                           //停止獨立波特率發生器
  1137.                                          dispnum2(6,0,0,96);
  1138.                                          BRT = 0xFD;                           //設置定時重載值
  1139.                                          AUXR |= 0x10;                       //啟動獨立波特率發生器
  1140.                                          bt=1;                                           //修改波特率標志,防止多次修改
  1141.                                          btln++;
  1142.                                          TR0=1;                                           //啟動定時器計時
  1143.                                         }
  1144.                                  if(btln==6&&bt==0)
  1145.                                          {
  1146.                                          btx=1;                                           //2輪波特率切換仍未出現xz標志,7F檢測失敗
  1147.                                         }
  1148.                                 }
  1149.                          if(RTS==1)                                     //掃描串口是否關閉
  1150.                                  {
  1151.                                  delay(1);
  1152.                                  if(RTS==1)
  1153.                                          {
  1154.                                          ck=0;
  1155.                                          dispkaiguan(4,80,ck);                 //識別到串口關閉,更新顯示
  1156.                                          disp_nn(6,75);
  1157.                                            disp_nn(6,110);
  1158.                                          disp_nn(6,0);
  1159.                                           disp_nn(6,16);                                 //________
  1160.                                          led=1;
  1161.                                          j=0;                                                //清除7F次數記錄
  1162.                                          xz=0;                                                //清除下載標志
  1163.                                          TR1=0;
  1164.                                          TL1 = 0x00;                                //設置定時初始值
  1165.                                           TH1 = 0x4C;                                //設置定時初始值
  1166.                                          t1=0;                                                //清除定時器1計數
  1167.                                          t=0;                                                //清除定時器0計數
  1168.                                          bt=0;                                                //清除波特率設置標志
  1169.                                          btln=0;                                        //清除波特率設置次數
  1170.                                          btx=0;                                                //清除7F檢測失敗標志
  1171.                                          delay(2);                                        //等待數毫秒,清除下載機上傳的數據
  1172.                                          RI=0;
  1173.                                         }
  1174.                                 }
  1175.                          if(RI&&btx==0&&xz==0)                        //掃描是否有數據,且沒有7F檢測失敗標志 下載標志也沒有被激活
  1176.                                  {
  1177.                                  dat=SBUF;
  1178.                                   RI=0;
  1179.                                  dispnum2(6,75,1,dat);                          //數據顯示
  1180.                                  if(dat==0x7f)
  1181.                                          {
  1182.                                          j++;
  1183.                                          dispnum2(6,110,0,j);
  1184.                                          if(j>34)                                          //連續35個7F,識別為下載數據流
  1185.                                                  {
  1186.                                                  j=34;
  1187.                                                  xz=1;                                          //設立下載標志
  1188.                                                  TR0=0;                                          //關閉定時器0
  1189.                                                  TL0 = 0x00;                          //恢復定時初始值以便下次使用
  1190.                                                   TH0 = 0x4C;
  1191.                                                  if(ms==0)                                  //自動模式才對繼電器控制,手動模式不予處理
  1192.                                                          {
  1193.                                                          if(dy)                                  //電源選擇為INT
  1194.                                                                  {
  1195.                                                                  if(dc)                          //如果供電在開啟狀態,先斷電再給電實現冷啟動
  1196.                                                                          {
  1197.                                                                           J1=1;
  1198.                                                                           dc=0;
  1199.                                                                          dispkaiguan(2,80,dc);
  1200.                                                                          delay(1500);
  1201.                                                                          J1=0;
  1202.                                                                           dc=1;
  1203.                                                                          dispkaiguan(2,80,dc);
  1204.                                                                           TR1=1;                                            //啟動定時器1;
  1205.                                                                          }
  1206.                                                                  else                         //如果供電在關閉狀態,直接給電即可實現冷啟動
  1207.                                                                          {
  1208.                                                                          J1=0;
  1209.                                                                           dc=1;
  1210.                                                                          dispkaiguan(2,80,dc);
  1211.                                                                           TR1=1;        
  1212.                                                                         }
  1213.                                                                 }
  1214.                                                          else                                 //電源選擇為USB
  1215.                                                                  {
  1216.                                                              if(dc)
  1217.                                                                          {
  1218.                                                                          J2=1;
  1219.                                                                          dc=0;
  1220.                                                                          dispkaiguan(2,80,dc);
  1221.                                                                          delay(1500);
  1222.                                                                          J2=0;
  1223.                                                                          dc=1;
  1224.                                                                          dispkaiguan(2,80,dc);
  1225.                                                                          TR1=1;                                            //啟動定時器1;
  1226.                                                                          }
  1227.                                                                  else
  1228.                                                                          {
  1229.                                                                          J2=0;
  1230.                                                                          dc=1;
  1231.                                                                          dispkaiguan(2,80,dc);
  1232.                                                                          TR1=1;                                            //啟動定時器1;
  1233.                                                                         }
  1234.                                                                 }
  1235.                                                         }
  1236.                                                 }
  1237.                                         }
  1238.                                  else
  1239.                                          {
  1240.                                          j=0;
  1241.                                          dispnum2(6,110,0,j);
  1242.                                         }
  1243.                                 }
  1244.                         }
  1245.                  if(k1==0&&key==0)
  1246.                          {
  1247.                          delay(5);
  1248.                          if(k1==0)
  1249.                                  {
  1250.                                  key=1;
  1251.                                  tt=1000;
  1252.                                  while(tt>0&&k1==0)
  1253.                                          {
  1254.                                          tt--;
  1255.                                          delay(1);
  1256.                                         }
  1257.                                  if(tt==0)                 //1S以上為長按
  1258.                                          {
  1259.                                           ms=~ms;         //長按為模式切換
  1260.                                           displayshouzi(0,80,ms);
  1261.                                          }
  1262.                                  else                         //1S以內為短按 電源開/關
  1263.                                          {
  1264.                                          dc=~dc;
  1265.                                          if(dy==1)                         //選擇為INT
  1266.                                                  {
  1267.                                                  J1=~dc;                 //繼電器與dc狀態相反
  1268.                                                 }
  1269.                                          else
  1270.                                                  {
  1271.                                                  J2=~dc;
  1272.                                                 }
  1273.                                          dispkaiguan(2,80,dc);
  1274.                                         }
  1275.                                 }
  1276.                         }
  1277.                  if(k2==0&&key==0)
  1278.                          {
  1279.                          delay(5);
  1280.                          if(k2==0)
  1281.                                  {
  1282.                                  key=1;
  1283.                                  J1=J2=J3=J4=1;                          //關閉所有供電繼電器
  1284.                                  dispkaiguan(2,80,0);          //電源顯示狀態為關閉
  1285.                                  dy=~dy;
  1286.                                  dispvcc(2,0,dy);
  1287.                                  DELETE_IAP(0x0000);
  1288.                                  if(dy==0)
  1289.                                          {     
  1290.                                   WRITE_IAP(0X0000,0x01);  //寫入USB供電存儲數據
  1291.                                          J4=0;
  1292.                                          }
  1293.                                  else
  1294.                                          {
  1295.                                          WRITE_IAP(0X0000,0x10);  //寫入INT供電存儲數據
  1296.                                          J3=0;
  1297.                                         }
  1298.                                  if(dc==1)                                  //電源狀態為開啟時,恢復繼電器
  1299.                                          {
  1300.                                          delay(500);
  1301.                                          if(dy==1)                          //電源選擇為INT
  1302.                                                  {
  1303.                                                  J1=0;                          //開啟繼電器1
  1304.                                                 }
  1305.                                          else                                 //電源選擇為USB
  1306.                                                  {
  1307.                                                  J2=0;                         //開啟繼電器2
  1308.                                                 }
  1309.                                          dispkaiguan(2,80,dc);          //電源顯示狀態為關閉
  1310.                                         }
  1311.                                 }
  1312.                         }
  1313.                  if(k3==0&&key==0)                                   //備用按鍵
  1314.                          {
  1315.                          delay(5);
  1316.                          if(k3==0)
  1317.                                  {
  1318.                                  qingping( );
  1319.                                  dispcunchucuowu( );
  1320.                                  DELETE_IAP(0x0000);      //擦除扇區
  1321.                                  WRITE_IAP(0X0000,0xFB);
  1322.                                  while(1);
  1323.                                 }
  1324.                         }
  1325.                  if(key)
  1326.                          {
  1327.                          if(k1==1&&k2==1&&k3==1)
  1328.                                  {
  1329.                                  delay(5);
  1330.                                  if(k1==1&&k2==1&&k3==1)
  1331.                                          {
  1332.                                          key=0;
  1333.                                         }
  1334.                                 }
  1335.                         }
  1336.                 }
  1337.         }
  1338. void timeraa( ) interrupt 1
  1339.         {
  1340.          TL1 = 0x00;                                //設置定時初始值
  1341.          TH1 = 0x4C;                                //設置定時初始值
  1342.          t++;
  1343.          if(t==20)
  1344.                  {
  1345.                  t=0;
  1346.                  TR0=0;                           //關閉定時器
  1347.                  bt=0;
  1348.                 }
  1349.         }
  1350. void timerbb( ) interrupt 3
  1351.         {
  1352.          TL1 = 0x00;                                //設置定時初始值
  1353.          TH1 = 0x4C;                                //設置定時初始值
  1354.          t1++;
  1355.          if(t1==4)
  1356.                  {
  1357.                  t1=0;
  1358.                  led=~led;
  1359.                 }
  1360.         }
復制代碼



格式工廠IMG_20260203_231608.jpg (231.37 KB, 下載次數: 0)

格式工廠IMG_20260203_231608.jpg

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1161211 發表于 2026-2-4 09:04 | 只看該作者
方案加入了繼電器控制上電,下載器更穩定,特別是有板載大電容時。
回復

使用道具 舉報

板凳
ID:584814 發表于 2026-2-5 12:08 | 只看該作者
這個和STC官方芯片方案或5塊錢的成品比優點 ?
回復

使用道具 舉報

地板
ID:16255 發表于 2026-2-5 16:55 | 只看該作者
我的情況正好相反。網上買的模塊基本能穩定使用,而且支持更高的波特率。(波特率越高,燒寫速度越快)
偏偏自己做的偶爾抽風,而且支持的波特率最高到9600,某些大程序燒寫會顯得很慢。
回復

使用道具 舉報

5#
ID:64089 發表于 2026-2-6 08:56 | 只看該作者
幾毛錢的STC單片機已經支持冷啟動下載,何必再造車輪?況且你這個頭有點感人,如果是興趣另說
回復

使用道具 舉報

6#
ID:1107340 發表于 2026-2-6 20:59 | 只看該作者
水平很高!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表