找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 56|回复: 0
打印 上一主题 下一主题
收起左侧

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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表