自己制作的STC的自動冷啟動下載器,雖然是51單片機這種老掉牙的東西,業余的電子愛好,折騰一下,以前買的那種模塊,識別率不高,經常識別不到。面板用OLED作顯示,8838鋁合金殼體(T12電烙鐵套裝殼子),TYPEC接口,手機數據線即可。
格式工廠捕獲.jpg (256.92 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
格式工廠捕獲5.jpg (403.46 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
主要電路原理: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觸發冷啟動,更高的波特率感覺不太必要,程序中也沒寫更多
格式工廠2.jpg (259.4 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
捕獲4.JPG (109.15 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
捕獲3.JPG (212.84 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
格式工廠IMG_20260202_222339.jpg (179.89 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
格式工廠IMG_20260201_224354.jpg (96.39 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
格式工廠IMG_20260127_223208.jpg (141.13 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
格式工廠IMG_20260127_223142.jpg (133.55 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
格式工廠IMG_20260201_225248.jpg (170.94 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
格式工廠IMG_20260201_224929.jpg (169.7 KB, 下載次數: 0)
下載附件
2026-2-3 22:31 上傳
hex文件.rar
(5.31 KB, 下載次數: 0)
2026-2-3 22:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
原理圖 PCB.rar
(6.51 MB, 下載次數: 0)
2026-2-3 22:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
- #include <STC12C5A60S2.H>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit SDA=P1^5;
- sbit SCL=P1^4;
- sbit k3=P2^7;
- sbit J1=P2^5;
- sbit J2=P2^4;
- sbit J3=P2^6;
- sbit J4=P2^3;
- sbit led=P0^3;
- sbit k1=P0^6;
- sbit RTS=P3^5;
- sbit k2=P0^7;
- uchar t,t1; //定時器計數
- bit bt; //波特率修改標志
- uchar code STC[3][60]={
- {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},
- {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},
- {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},
- }; //STC
- uchar code leng2424[3][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},
- {0x00,0x00,0x00,0x80,0xE0,0xF9,0x79,0x1C,0x6C,0x6E,0x67,0x63,0x61,0x62,0x67,0x7F,0x7C,0xE9,0xE3,0xE7,0x67,0x2E,0x0E,0x04},
- {0x00,0x0C,0x1E,0x1F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x06,0x0E,0x1C,0x3C,0x3C,0x7F,0x67,0x43,0x01,0x00,0x00,0x00,0x00},
- };//冷
- uchar code qi2424[3][24]={
- {0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x30,0x30,0x30,0x30,0x34,0x3E,0x3E,0x3C,0x30,0x30,0x30,0xF0,0xF0,0xF0,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC7,0xC7,0xC7,0xC0,0x00,0x00},
- {0x00,0x20,0x70,0x7E,0x3F,0x0F,0x01,0x7F,0x7F,0x7F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7F,0x7F,0x7F,0x00,0x00},
- };//啟
- uchar code dong2424[3][24]={
- {0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x80,0x80,0x80,0x80,0xFC,0xFC,0x84,0x80,0x80,0x80,0x80,0x80},
- {0x00,0x04,0x04,0x04,0xE4,0xFC,0x7C,0x1C,0x44,0xE4,0xE4,0x84,0x05,0x01,0x01,0xFD,0xFF,0xFF,0x01,0x01,0xE1,0xFF,0xFF,0x00},
- {0x00,0x00,0x0E,0x0F,0x0F,0x05,0x04,0x06,0x06,0x07,0x07,0x6F,0x7E,0x78,0x3E,0x0F,0x07,0x60,0x60,0x60,0x7F,0x7F,0x3F,0x00},
- };//動
- uchar code xia2424[3][24]={
- {0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF8,0xF8,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x08,0x1C,0x3C,0x78,0xF0,0xE0,0xC0,0x80,0x00,0x00},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00},
- }; //下
- uchar code zai2424[3][24]={
- {0x00,0x80,0x90,0x90,0x90,0x90,0xFE,0xFE,0xFE,0x90,0x90,0x90,0x90,0x80,0xFE,0xFE,0x82,0x80,0x8C,0x9C,0x98,0x90,0x80,0x80},
- {0x00,0x00,0xC8,0xE8,0xF8,0xBC,0x9F,0xEF,0xEA,0xE8,0x88,0x88,0x88,0x08,0x1F,0xFF,0xFF,0x80,0xF0,0xFC,0x3C,0x0C,0x00,0x00},
- {0x00,0x08,0x18,0x18,0x18,0x08,0x08,0x7F,0x7F,0x7F,0x0C,0x4C,0x64,0x70,0x38,0x3D,0x1F,0x1F,0x3F,0x78,0x60,0x78,0x78,0x18},
- }; //載
- uchar code cun2424[3][24]={
- {0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0xE0,0xF8,0xFE,0x3E,0x24,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},
- {0x00,0x40,0xC0,0xE0,0x70,0xFE,0xFE,0xFF,0x87,0x81,0x86,0x86,0x86,0x86,0x86,0xE6,0xF6,0xFE,0x9E,0x9E,0x8E,0x86,0x80,0x80},
- {0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x20,0x60,0x60,0x7F,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00},
- }; //存
- uchar code chu2424[3][24]={
- {0x00,0x00,0x00,0xC0,0xF8,0x3C,0x04,0x00,0x10,0xF8,0x60,0x00,0x00,0x30,0x30,0xFC,0xFC,0x30,0x30,0xC0,0x70,0x30,0x00,0x00},
- {0x00,0x0C,0x0F,0x03,0xFF,0x00,0x06,0x06,0xFE,0xFE,0x00,0x80,0xC6,0xC6,0xE6,0x37,0x3F,0x2E,0x27,0x27,0xE6,0x06,0x06,0x00},
- {0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x1F,0x1F,0x0C,0x06,0x01,0x00,0x7F,0x13,0x13,0x13,0x13,0x13,0x7F,0x00,0x00,0x00},
- }; //儲
- uchar code cuo2424[3][24]={
- {0x00,0x00,0xC0,0xE0,0xF8,0x7C,0x7C,0x64,0x60,0x60,0x60,0x60,0x60,0xFC,0xFC,0x60,0x60,0x60,0xFC,0xFC,0x60,0x60,0x60,0x00},
- {0x00,0x01,0x61,0x67,0xFE,0xFE,0xFE,0x66,0x66,0x60,0x04,0xE4,0xE4,0xE7,0x67,0x64,0x64,0x64,0x67,0xE7,0xE4,0xE4,0x04,0x04},
- {0x00,0x00,0x00,0x00,0x3F,0x3F,0x3F,0x1C,0x0E,0x06,0x00,0x7F,0x7F,0x7F,0x32,0x32,0x32,0x32,0x32,0x7F,0x7F,0x7F,0x00,0x00},
- };//錯
- uchar code wu2424[3][24]={
- {0x00,0x00,0x00,0x0C,0x1C,0x3C,0x38,0x30,0x00,0xF8,0xF8,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0xF8,0x00,0x00,0x00},
- {0x00,0x03,0x03,0x02,0xFE,0xFE,0xFE,0x00,0x88,0x89,0x89,0x89,0x89,0x89,0xF9,0xF9,0x99,0x89,0x89,0x89,0x89,0x88,0x88,0x80},
- {0x00,0x00,0x00,0x10,0x3F,0x3F,0x1F,0x4E,0x66,0x60,0x70,0x38,0x1E,0x1F,0x07,0x07,0x0F,0x1E,0x38,0x30,0x70,0x60,0x60,0x20},
- };//誤
- uchar code ce2424[3][24]={
- {0x00,0x00,0x08,0x1C,0x18,0x10,0x00,0xF8,0xF8,0x18,0x98,0x98,0x18,0xF8,0xF8,0x00,0x00,0xE0,0x20,0x00,0xFC,0xFC,0x00,0x00},
- {0x00,0x00,0x03,0x06,0xCC,0xC4,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00},
- {0x00,0x30,0x3C,0x1E,0x03,0x00,0x00,0x60,0x38,0x1E,0x07,0x04,0x0E,0x1C,0x78,0x20,0x00,0x03,0x63,0x60,0x7F,0x3F,0x00,0x00},
- };// 測
- uchar code shi2424[3][24]={
- {0x00,0x00,0x08,0x1C,0x38,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFC,0xFC,0x80,0x84,0x9C,0xB8,0x90,0x00,0x00},
- {0x00,0x06,0x06,0x06,0xFE,0xFE,0x00,0x00,0x18,0x18,0xF8,0xF8,0x18,0x18,0x00,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},
- {0x00,0x00,0x00,0x10,0x3F,0x1F,0x0C,0x06,0x32,0x10,0x1F,0x1F,0x08,0x0C,0x0C,0x00,0x03,0x0F,0x3C,0x70,0x60,0x7C,0x18,0x00},
- };// 試
- uchar code shu2424[3][24]={
- {0x00,0x00,0xC8,0xDC,0xF8,0xC0,0xC0,0xFC,0xC0,0xC0,0xF8,0xD8,0xC0,0x00,0xF0,0xFC,0x8C,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
- {0x00,0x00,0x4C,0x4C,0x46,0xE3,0x71,0x5F,0x40,0x43,0xCE,0xD4,0x3C,0x0F,0x7F,0xF0,0x80,0x00,0xE0,0xFF,0x03,0x00,0x00,0x00},
- {0x00,0x00,0x40,0x60,0x63,0x27,0x34,0x1C,0x0C,0x0F,0x0B,0x58,0x68,0x60,0x30,0x19,0x0F,0x0F,0x1B,0x30,0x60,0x60,0x00,0x00},
- };// 數
- uchar code ju2424[3][24]={
- {0x00,0x80,0x80,0x80,0x80,0xFC,0x84,0x80,0x80,0x00,0xF8,0xF8,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0xF8,0x08,0x00,0x00},
- {0x00,0x40,0xC0,0x60,0x20,0xFF,0x10,0x18,0x08,0x00,0xFF,0x3F,0x11,0x11,0x11,0x11,0xFF,0xFF,0x11,0x11,0x11,0x11,0x10,0x00},
- {0x00,0x00,0x20,0x60,0x60,0x7F,0x00,0x00,0x30,0x3E,0x07,0x00,0x7F,0x7F,0x31,0x31,0x31,0x31,0x31,0x31,0x7F,0x7F,0x00,0x00},
- };// 據
- uchar code ou1616[2][16]={
- {0x00,0x00,0xFC,0xFC,0xE4,0xC4,0xF4,0xF4,0xE4,0xFE,0xDE,0xD2,0xD0,0x70,0x70,0x10},
- {0x00,0x00,0x3F,0x3F,0x2E,0x27,0x27,0x66,0x60,0x70,0x3F,0x0F,0x1F,0x78,0xE0,0xC0},
- };//歐
- uchar code yang1616[2][16]={
- {0x00,0x00,0xFC,0xFC,0xE4,0xFC,0x9C,0x00,0xFC,0xFC,0x84,0x84,0x84,0xFC,0xFC,0xFC},
- {0x00,0x00,0xFF,0xFF,0x18,0x1F,0x0F,0x06,0x7F,0x7F,0x10,0x10,0x10,0x7F,0x7F,0x7F},
- };//陽
- uchar code yun1616[2][16]={
- {0x00,0xC0,0xC0,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0xC0,0xC0},
- {0x00,0x00,0x20,0x70,0x78,0x7C,0x2F,0x23,0x21,0x20,0x2C,0x3C,0x38,0x70,0x60,0x00},
- };//云
- uchar code tian1616[2][16]={
- {0x00,0xC0,0xC4,0xC4,0xC4,0xC4,0xC4,0xFC,0xFC,0xFC,0xC4,0xC4,0xC4,0xC4,0xC0,0xC0},
- {0x00,0x40,0x60,0x60,0x30,0x38,0x1E,0x0F,0x03,0x07,0x1E,0x18,0x30,0x60,0x60,0x40},
- }; //天
- uchar code mo1616[2][16]={
- {0x00,0x10,0x90,0xFE,0x90,0x10,0x04,0xE4,0xAE,0xAE,0xA4,0xAE,0xAE,0xE4,0x04,0x00},
- {0x00,0x06,0x03,0x7F,0x00,0x43,0x48,0x4B,0x2A,0x3A,0x0E,0x1A,0x2A,0x4B,0xC8,0x40},
- }; //模
- uchar code shi1616[2][16]={
- {0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3E,0xFE,0x10,0x14,0x1C,0x10,0x10,0x00},
- {0x00,0x20,0x61,0x21,0x3F,0x3F,0x11,0x11,0x10,0x03,0x1E,0x30,0x60,0x40,0x70,0x00},
- };//式
- uchar code zi1616[2][16]={
- {0x00,0x00,0x00,0xE0,0xE0,0xA0,0xB8,0xBC,0xAC,0xA0,0xA0,0xA0,0xF0,0xF0,0x00,0x00},
- {0x00,0x00,0x00,0x7F,0x7F,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x7F,0x7F,0x00,0x00},
- };//自
- uchar code shou1616[2][16]={
- {0x00,0x20,0xA0,0xA0,0xB0,0xB0,0xB0,0xF0,0xF0,0x98,0x98,0xD8,0xD8,0x90,0x00,0x00},
- {0x02,0x02,0x02,0x02,0x22,0x22,0x62,0x7F,0x7F,0x02,0x02,0x02,0x03,0x03,0x03,0x02},
- };//手
- uchar code dong1616[2][16]={
- {0x00,0x80,0x90,0x90,0x90,0x90,0x98,0xD8,0xD0,0xC0,0xF8,0xF8,0x40,0x60,0xE0,0xC0},
- {0x00,0x10,0x18,0x1E,0x17,0x17,0x5D,0x78,0x30,0x1E,0x0F,0x21,0x60,0x60,0x7F,0x3F},
- };//動
- uchar code chuan1616[2][16]={
- {0x00,0x00,0x00,0x78,0x78,0x48,0x48,0xFE,0xFE,0xFE,0x48,0x48,0x78,0x78,0x00,0x00},
- {0x00,0x00,0x1F,0x1F,0x11,0x11,0x11,0x7F,0x7F,0x7F,0x11,0x11,0x11,0x1F,0x1F,0x00},
- };//串
- uchar code kou1616[2][16]={
- {0x00,0x00,0x00,0xF8,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0xF8,0xF8,0x00},
- {0x00,0x00,0x00,0x7F,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x7F,0x7F,0x00},
- };//口
- uchar code kai1616[2][16]={
- {0x00,0x80,0x84,0x84,0x84,0xFC,0xFC,0xFC,0x84,0x84,0xFC,0xFC,0x84,0x84,0x84,0x80},
- {0x00,0x41,0x41,0x61,0x71,0x3F,0x1F,0x03,0x01,0x01,0x7F,0x7F,0x01,0x01,0x01,0x01},
- };//開
- uchar code qi1616[2][16]={
- {0x00,0x00,0x00,0xF8,0xF8,0xC8,0xC8,0xCA,0xCE,0xCE,0xC8,0xC8,0xF8,0xF8,0xF8,0x00},
- {0x00,0x60,0x78,0x3F,0x0F,0xFE,0xFE,0x22,0x22,0x22,0x22,0x22,0xFE,0xFE,0xFE,0x00},
- };//啟
- uchar code guan1616[2][16]={
- {0x00,0x00,0x30,0x30,0x30,0x3E,0x3E,0xF8,0xF0,0xF8,0x3E,0x3E,0x30,0x30,0x30,0x00},
- {0x00,0x42,0x42,0x42,0x62,0x32,0x3A,0x1F,0x0F,0x1F,0x1A,0x32,0x72,0x62,0x62,0x02},
- };//關
- uchar code bi1616[2][16]={
- {0x00,0xF0,0xF0,0xF6,0x4E,0x4C,0x40,0x44,0xC4,0xF4,0xF4,0x44,0x44,0xFC,0xFC,0xFC},
- {0x00,0x7F,0x7F,0x7F,0x18,0x1C,0x0E,0x67,0x63,0x3F,0x3F,0x00,0x40,0x7F,0x7F,0x3F},
- };//閉
- uchar code gong1616[2][16]={
- {0x00,0x80,0xE0,0xFC,0xFE,0x26,0x20,0xFE,0xFE,0xFE,0x20,0xFE,0xFE,0x20,0x20,0x20},
- {0x00,0x00,0x00,0x7F,0x7F,0x46,0x66,0x7F,0x3F,0x07,0x06,0x1F,0x3F,0x76,0x66,0x46},
- };//供
- uchar code dian1616[2][16]={
- {0x00,0x00,0xF0,0xF0,0x90,0x90,0x90,0xFE,0xFE,0x90,0x90,0x90,0xF0,0xF0,0x00,0x00},
- {0x00,0x00,0x1F,0x1F,0x0C,0x0C,0x0C,0x7F,0x7F,0x4C,0x4C,0x4C,0x4F,0x4F,0x60,0x60},
- };//電
- uchar code U0816[2][8]={
- {0x00,0xF8,0xF8,0x00,0x00,0x00,0xF8,0xF8},
- {0x00,0x1F,0x3F,0x30,0x20,0x30,0x3F,0x1F},
- };//U
- uchar code S0816[2][8]={
- {0x00,0x70,0xF8,0xD8,0x88,0x38,0x38,0x30},
- {0x00,0x1C,0x3C,0x31,0x21,0x33,0x3F,0x1E},
- };//S
- uchar code B0816[2][8]={
- {0x00,0xF8,0xF8,0x88,0x88,0x98,0xF8,0x70},
- {0x00,0x3F,0x3F,0x31,0x31,0x31,0x1F,0x1E},
- };//B
- uchar code I0816[2][8]={
- {0x00,0x00,0x00,0xF8,0xF8,0xF8,0x00,0x00},
- {0x00,0x00,0x00,0x3F,0x3F,0x3F,0x00,0x00},
- };//I
- uchar code N0816[2][8]={
- {0x00,0xF8,0xF8,0xF0,0xC0,0x00,0xF8,0xF8},
- {0x00,0x3F,0x3F,0x01,0x07,0x3F,0x3F,0x3F},
- };//N
- uchar code T0816[2][8]={
- {0x00,0x08,0x08,0xF8,0xF8,0xF8,0x08,0x08},
- {0x00,0x00,0x00,0x3F,0x3F,0x3F,0x00,0x00},
- };//T
- uchar code num[16][16]={
- {0x00,0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x0F,0x1F,0x30,0x20,0x30,0x1F,0x0F},/*"0",0*/
- {0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x3F,0x20,0x20},/*"1",1*/
- {0x00,0x70,0x78,0x08,0x08,0x08,0xF8,0xF0,0x00,0x30,0x38,0x2C,0x26,0x23,0x31,0x30},/*"2",2*/
- {0x00,0x30,0x38,0x08,0x08,0x88,0xF8,0x70,0x00,0x18,0x38,0x21,0x21,0x23,0x3E,0x1C},/*"3",3*/
- {0x00,0x00,0x80,0xC0,0x70,0xF8,0xF8,0x00,0x00,0x06,0x07,0x25,0x24,0x3F,0x3F,0x24},/*"4",4*/
- {0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x19,0x39,0x20,0x20,0x31,0x1F,0x0E},/*"5",5*/
- {0x00,0xE0,0xF0,0x98,0x88,0x98,0x90,0x00,0x00,0x0F,0x1F,0x31,0x20,0x20,0x3F,0x1F},/*"6",6*/
- {0x00,0x18,0x18,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x3E,0x3F,0x01,0x00,0x00},/*"7",7*/
- {0x00,0x70,0xF8,0x88,0x08,0x88,0xF8,0x70,0x00,0x1C,0x3E,0x23,0x21,0x23,0x3E,0x1C},/*"8",8*/
- {0x00,0xF0,0xF8,0x08,0x08,0x18,0xF0,0xE0,0x00,0x01,0x13,0x32,0x22,0x33,0x1F,0x0F},/*"9",9*/
- {0x00,0x00,0xC0,0xF8,0xF8,0xE0,0x00,0x00,0x20,0x3C,0x3F,0x23,0x02,0x27,0x3F,0x38},/*"A",10*/
- {0x08,0xF8,0xF8,0x88,0x88,0xF8,0x70,0x00,0x20,0x3F,0x3F,0x20,0x20,0x31,0x1F,0x0E},/*"B",11*/
- {0xC0,0xF0,0x38,0x08,0x08,0x08,0x38,0x38,0x07,0x1F,0x38,0x20,0x20,0x30,0x18,0x08},/*"C",12*/
- {0x08,0xF8,0xF8,0x08,0x08,0x18,0xF0,0xE0,0x20,0x3F,0x3F,0x20,0x20,0x30,0x1F,0x0F},/*"D",13*/
- {0x08,0xF8,0xF8,0x88,0xE8,0xE8,0x18,0x10,0x20,0x3F,0x3F,0x20,0x23,0x23,0x38,0x18},/*"E",14*/
- {0x08,0xF8,0xF8,0x88,0xE8,0xE8,0x18,0x10,0x20,0x3F,0x3F,0x20,0x03,0x03,0x00,0x00},/*"F",15*/
- };
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=925;y>0;y--);
- }
- void init_uart( ) //2400bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數據,可變波特率
- AUXR &= 0xFB; //定時器時鐘12T模式
- BRT = 0xF4; //設置定時重載值
- AUXR |= 0x01; //串口1使用獨立波特率發射器為波特率發生器
- //AUXR |= 0x10; //啟動獨立波特率發射器
- }
- void timer0( ) //50毫秒 16位自動重載
- {
- AUXR &= 0x3F; //定時器時鐘12T模式
- TMOD = 0x11; //設置定時器模式
- TL0 = 0x00; //設置定時初始值
- TH0 = 0x4C; //設置定時初始值
- TL1 = 0x00; //設置定時初始值
- TH1 = 0x4C; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TF1 = 0; //清除TF1標志
- EA=1;
- ET0=1; //開中斷
- ET1=1;
- }
- void IAP_CLOSE() //關閉IAP
- {
- IAP_CONTR = 0; //關閉IAP功能
- IAP_CMD = 0; //清除命令寄存器
- IAP_TRIG = 0; //清除觸發寄存器
- IAP_ADDRH = 0x80; //將地址設置到非IAP區域
- IAP_ADDRL = 0;
- }
- uchar READ_IAP(uint addr) //讀一個字節
- { //5A60S2有1kb存儲空間,空間地址從0000H到03FFH,每512字節為一個扇區,共2個扇區
- uchar dat; //數據緩沖區
- IAP_CONTR = 0x83; //使能IAP,1000----,設置CPU等待時間(11.0592)---- 0011
- IAP_CMD =0X01; //設置IAP讀取命令
- IAP_ADDRL = addr; //設置IAP低地址
- IAP_ADDRH = addr >> 8; //設置IAP高地址
- IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
- IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
- _nop_( ); //等待ISP/IAP/EEPROM操作完成
- _nop_( );
- _nop_( );
- dat = IAP_DATA; //讀ISP/IAP/EEPROM數據
- IAP_CLOSE( ); //關閉IAP功能
- return dat; //返回
- }
- void WRITE_IAP(uint addr, uchar dat) //寫入一個字節
- {
- IAP_CONTR =0x83; //使能IAP
- IAP_CMD =0X02; //設置IAP寫入命令
- IAP_ADDRL = addr; //設置IAP低地址
- IAP_ADDRH = addr >> 8; //設置IAP高地址
- IAP_DATA = dat; //寫ISP/IAP/EEPROM數據
- IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
- IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
- delay(1); //等待ISP/IAP/EEPROM操作完成 用不了1毫秒,幾十微秒就可,有微秒函數可替換
- IAP_CLOSE( );
- }
- void DELETE_IAP(uint addr) //扇區擦除
- {
- IAP_CONTR = 0x83; //使能IAP
- IAP_CMD =0x03; //設置IAP命令
- IAP_ADDRL = addr; //設置IAP低地址
- IAP_ADDRH = addr >> 8; //設置IAP高地址
- IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
- IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
- delay(25); //等待ISP/IAP/EEPROM操作完成
- IAP_CLOSE( );
- }
- void start( )
- {
- SCL = 1;
- SDA = 1;
- SDA = 0;
- _nop_( );
- _nop_( );
- SCL = 0;
- _nop_( );
- _nop_( );
- }
- void stop( )
- {
- SCL=0;
- SDA=0;
- _nop_( );
- SCL=1;
- _nop_( );
- SDA=1;
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- _nop_( );
- }
- void writebyte(uchar date) //寫1個字節
- {
- uchar i;
- for(i=8;i>0;i--)
- {
- date<<=1;
- SDA=CY;
- SCL=1;
- _nop_( );
- _nop_( );
- SCL=0;
- _nop_( );
- _nop_( );
- }
- SDA=1;
- SCL=1;
- _nop_( );
- SCL=0;
- }
- void qingping( )
- {
- uchar x,y;
- for(y=0;y<8;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y);
- writebyte(0x00); //列地址低位
- writebyte(0x10); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<128;x++)
- {
- writebyte(0x00); //清屏
- }
- stop();
- }
- }
- void initoled( ) //初始化OLED
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xae); //--關閉oled面板
- writebyte(0x00); //---設置低列地址
- writebyte(0x10); //---設置高列地址
- writebyte(0x40); //--設置起始行地址設置映射RAM顯示起始行 (0x00~0x3F)
- writebyte(0x81); //--設置對比度控制寄存器
- writebyte(0xFF); // 設置SEG輸出電流亮度
- writebyte(0xa1); //--設置SEG/列映射 0xa0左右反置 0xa1正常
- writebyte(0xc8); //設置COM/行掃描方向 0xc0上下反置 0xc8正常
- writebyte(0xa6); //--設置正常顯示
- writebyte(0xa8); //--設置多路復用率(1 to 64)
- writebyte(0x3f); //--1/64 duty
- writebyte(0xd3); //-設置顯示偏移 移位映射RAM計數器 (0x00~0x3F)
- writebyte(0x00); //-不抵消
- writebyte(0xd5); //--設置顯示時鐘分頻比/振蕩器頻率
- writebyte(0x80); //--設置分頻比,將時鐘設置為100幀/秒
- writebyte(0xd9); //--設定預充電時間
- writebyte(0xf1); //將預充電設置為15個時鐘,放電設置為1個時鐘
- writebyte(0xda); //--設置com引腳硬件配置
- writebyte(0x12);
- writebyte(0xdb); //--set vcomh
- writebyte(0x30); //設置VCOM取消選擇級別
- writebyte(0x20); //-設置頁面尋址模式 (0x00/0x01/0x02)
- writebyte(0x02); //
- writebyte(0x8d); //--設置電荷泵啟用/禁用
- writebyte(0x14); //--set(0x10) 使能
- writebyte(0xa4); // 在屏幕上禁用整個顯示 (0xa4/0xa5)
- writebyte(0xa6); // 禁用反轉顯示打開 (0xa6/a7)
- stop( );
- qingping( );
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xaf); //--打開oled面板 //先清屏再開顯示,否則容易顯示斷電前上一次的圖像
- stop( );
- }
- void display( )
- {
- uchar x,y,z;
- z=34; //要寫入的列地址首位
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y); //b0代表第一頁,最上面一檔的8個像素,寫0-1-2共3頁
- writebyte(0x00+(z%16)); //列地址低位,占用60列,居中排列則左邊第34個列地址開始寫
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<60;x++)
- {
- writebyte(STC[y][x]);
- }
- stop( );
- }
- delay(200);
- z=4;
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb3+y); //b3代表第4頁,寫4-5-6共3頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(leng2424[y][x]);
- }
- stop( );
- }
- delay(200);
- z=z+24;
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb3+y); //b3代表第4頁,寫4-5-6共3頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(qi2424[y][x]);
- }
- stop( );
- }
- delay(200);
- z=z+24;
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb3+y); //b3代表第4頁,寫4-5-6共3頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(dong2424[y][x]);
- }
- stop( );
- }
- delay(200);
- z=z+24;
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb3+y); //b3代表第4頁,寫4-5-6共3頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(xia2424[y][x]);
- }
- stop( );
- }
- delay(200);
- z=z+24;
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb3+y); //b3代表第4頁,寫4-5-6共3頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(zai2424[y][x]);
- }
- stop( );
- }
- delay(200);
- z=40;
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb7); //b7代表最后一頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<23;x++)
- {
- writebyte(0x30); //_____
- }
- stop( );
- delay(200);
- z=63;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb6+y); //b6 b7 代表最后2頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- writebyte(ou1616[y][x]);
- }
- stop( );
- }
- delay(200);
- z=z+16;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb6+y); //b6 b7 代表最后2頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- writebyte(yang1616[y][x]);
- }
- stop();
- }
- delay(200);
- z=z+16;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb6+y); //b6 b7 代表最后2頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- writebyte(yun1616[y][x]);
- }
- stop();
- }
- delay(200);
- z=z+16;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb6+y); //b6 b7 代表最后2頁
- writebyte(0x00+(z%16)); //列地址低位
- writebyte(0x10+(z/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- writebyte(tian1616[y][x]);
- }
- stop();
- }
- }
- void displaymoshi(uchar page,uchar addr)
- {
- uchar x,y;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- writebyte(mo1616[y][x]); //寫數據
- }
- for(x=0;x<16;x++) //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
- {
- writebyte(shi1616[y][x]); //寫數據
- }
- stop( );
- }
- }
- void dispcunchucuowu( )
- {
- uchar x,y;
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb1+y);
- writebyte(0x00+(39%16)); //列地址低位
- writebyte(0x10+(39/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(cun2424[y][x]); //存
- }
- for(x=0;x<24;x++)
- {
- writebyte(chu2424[y][x]); //儲
- }
- stop( );
- }
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb4+y);
- writebyte(0x00+(15%16)); //列地址低位
- writebyte(0x10+(15/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(cuo2424[y][x]); //錯
- }
- for(x=0;x<24;x++)
- {
- writebyte(wu2424[y][x]); //誤
- }
- for(x=0;x<24;x++)
- {
- writebyte(ce2424[y][x]); //測
- }
- for(x=0;x<24;x++)
- {
- writebyte(shi2424[y][x]); //試
- }
- stop( );
- }
- }
- void dispshujucuowu( )
- {
- uchar x,y;
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb1+y);
- writebyte(0x00+(39%16)); //列地址低位
- writebyte(0x10+(39/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(shu2424[y][x]); //數
- }
- for(x=0;x<24;x++)
- {
- writebyte(ju2424[y][x]); //據
- }
- stop( );
- }
- for(y=0;y<3;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb4+y);
- writebyte(0x00+(15%16)); //列地址低位
- writebyte(0x10+(15/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<24;x++)
- {
- writebyte(cun2424[y][x]); //存
- }
- for(x=0;x<24;x++)
- {
- writebyte(chu2424[y][x]); //儲
- }
- for(x=0;x<24;x++)
- {
- writebyte(cuo2424[y][x]); //錯
- }
- for(x=0;x<24;x++)
- {
- writebyte(wu2424[y][x]); //誤
- }
- stop( );
- }
- }
- void displayshouzi(uchar page,uchar addr,bit m)
- {
- uchar x,y;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- if(m==0)
- {
- writebyte(zi1616[y][x]); //寫數據
- }
- else
- {
- writebyte(shou1616[y][x]);
- }
- }
- for(x=0;x<16;x++) //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
- {
- writebyte(dong1616[y][x]); //寫數據
- }
- stop( );
- }
- }
- void dispckou(uchar page,uchar addr)
- {
- uchar x,y;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- writebyte(chuan1616[y][x]); //寫數據
- }
- for(x=0;x<16;x++) //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
- {
- writebyte(kou1616[y][x]); //寫數據
- }
- stop( );
- }
- }
- void dispkaiguan(uchar page,uchar addr,bit m)
- {
- uchar x,y;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- if(m==0)
- {
- writebyte(guan1616[y][x]); //寫數據
- }
- else
- {
- writebyte(kai1616[y][x]);
- }
- }
- for(x=0;x<16;x++) //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
- {
- if(m==0)
- {
- writebyte(bi1616[y][x]); //寫數據
- }
- else
- {
- writebyte(qi1616[y][x]);
- }
- }
- stop( );
- }
- }
- void dispvcc(uchar page,uchar addr,bit vcc)
- {
- uchar x,y;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<8;x++)
- {
- if(vcc==0)
- {
- writebyte(U0816[y][x]); //寫數據
- }
- else
- {
- writebyte(I0816[y][x]);
- }
- }
- for(x=0;x<8;x++) //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
- {
- if(vcc==0)
- {
- writebyte(S0816[y][x]); //寫數據
- }
- else
- {
- writebyte(N0816[y][x]);
- }
- }
- for(x=0;x<8;x++) //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
- {
- if(vcc==0)
- {
- writebyte(B0816[y][x]); //寫數據
- }
- else
- {
- writebyte(T0816[y][x]);
- }
- }
- stop( );
- }
- }
- void dispgongdian(uchar page,uchar addr)
- {
- uchar x,y;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- writebyte(gong1616[y][x]); //寫數據
- }
- for(x=0;x<16;x++) //1個字占用2頁,先把所有的字的1頁寫完了,再寫下1頁的字
- {
- writebyte(dian1616[y][x]); //寫數據
- }
- stop( );
- }
- }
- void dispnum2(uchar page,uchar addr,bit jz,uchar n) //寫2位數字
- {
- uchar x,y,na,nb;
- if(jz==0) //jz=0代表10進制
- {
- na=n/10;
- nb=n%10;
- }
- else //jz=1代表16進制
- {
- na=n/16;
- nb=n%16;
- }
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<8;x++)
- {
- if(y==0)
- {
- writebyte(num[na][x]);
- }
- else
- {
- writebyte(num[na][x+8]);
- }
- }
- for(x=0;x<8;x++)
- {
- if(y==0)
- {
- writebyte(num[nb][x]);
- }
- else
- {
- writebyte(num[nb][x+8]);
- }
- }
- }
- }
- void disp_nn(uchar page,uchar addr)
- {
- uchar x,y;
- for(y=0;y<2;y++)
- {
- start();
- writebyte(0x78);
- writebyte(0x00); //寫指令
- writebyte(0xb0+y+page); //b6 b7 代表最后2頁
- writebyte(0x00+(addr%16)); //列地址低位
- writebyte(0x10+(addr/16)); //列地址高位
- stop();
- start();
- writebyte(0x78);
- writebyte(0x40); //寫數據
- for(x=0;x<16;x++)
- {
- if(y==0)
- {
- writebyte(0x80); //寫數據 ___
- }
- else
- {
- writebyte(0x01); //寫數據 ___
- }
- }
- stop( );
- }
- }
- void main( )
- {
- bit key,ms,ck,dy,dc,xz,btx; //按鍵標志 模式狀態 串口狀態 供電選擇 電源開/關 下載標志 7F檢測失敗
- uchar vdc,dat,j; //供電選擇存儲數據 串口接收數據 7F個數
- uint tt; //長按/短按計數
- uchar btln,btl; //波特率掃描次數 波特率
- delay(100);
- initoled( );
- init_uart( );
- timer0( );
- led=0;
- display( );
- delay(1500);
- led=1;
- qingping( );
- vdc=READ_IAP(0x0000); //讀出供電存儲數據
- if(vdc==0x01||vdc==0x10)
- {
- if(vdc==0x01)
- {
- dy=0; //讀出的數據是01則是USB供電
- }
- else
- {
- dy=1; //讀出的數據是10則是INT供電
- }
- }
- else //既不是01也不是10的話,則是數據錯誤,可能是新的主控MCU,應該重新寫入數據
- {
- DELETE_IAP(0x0000); //擦除扇區
- WRITE_IAP(0X0000,0x01); //重新寫入供電存儲數據,默認是USB供電
- vdc=READ_IAP(0x0000); //重新讀出數據
- dispshujucuowu( ); //報錯
- delay(1500);
- qingping( );
- }
- displaymoshi(0,16);
- displayshouzi(0,80,ms);
- dispckou(4,16);
- dispvcc(2,0,dy);
- dispgongdian(2,24);
- dispkaiguan(2,80,dc);
- dispkaiguan(4,80,ck);
- disp_nn(6,75);
- disp_nn(6,110);
- disp_nn(6,0);
- disp_nn(6,16);
- delay(500);
- if(dy==1)
- {
- J3=0; //啟動INT供電繼電器GND
- J1=0;
- dc=1;
- dispkaiguan(2,80,dc);
- }
- else
- {
- J4=0; //啟動USB供電繼電器GND
- J2=0;
- dc=1;
- dispkaiguan(2,80,dc);
- }
- while(1)
- {
- if(ck==0) //串口標志關閉時,掃描串口是否打開
- {
- if(RTS==0)
- {
- delay(1);
- if(RTS==0)
- {
- ck=1;
- dispkaiguan(4,80,ck); //識別到串口打開,更新顯示
- led=0;
- }
- }
- }
- if(ck)
- {
- if(xz==0) //沒有出現下載標志時,定時調整波特率用以檢測7F,下載標志出現時就不能再調整波特率了
- { //2400-4800-9600-2400-4800-9600,共測試3種常用波特率,循環2次仍未檢測到7F就不再檢測
- if(btln==0&&bt==0) //波特率切換計數 波特率設置標志
- {
- btl=2400; //從2400開始掃描
- AUXR&=0XEF; //停止獨立波特率發生器
- dispnum2(6,0,0,24);
- dispnum2(6,16,0,0);
- BRT = 0xF4; //設置定時重載值
- AUXR |= 0x10; //啟動獨立波特率發生器
- bt=1; //修改波特率標志,防止多次修改
- btln++;
- TR0=1; //啟動定時器計時
- }
- if(btln==1&&bt==0)
- {
- btl=4800; //波特率4800
- AUXR&=0XEF; //停止獨立波特率發生器
- dispnum2(6,0,0,48);
- BRT = 0xFA; //設置定時重載值
- AUXR |= 0x10; //啟動獨立波特率發生器
- bt=1; //修改波特率標志,防止多次修改
- btln++;
- TR0=1; //啟動定時器計時
- }
- if(btln==2&&bt==0)
- {
- btl=9600; //波特率9600
- AUXR&=0XEF; //停止獨立波特率發生器
- dispnum2(6,0,0,96);
- BRT = 0xFD; //設置定時重載值
- AUXR |= 0x10; //啟動獨立波特率發生器
- bt=1; //修改波特率標志,防止多次修改
- btln++;
- TR0=1; //啟動定時器計時
- }
- if(btln==3&&bt==0)
- {
- btl=2400; //從2400開始掃描
- AUXR&=0XEF; //停止獨立波特率發生器
- dispnum2(6,0,0,24);
- dispnum2(6,16,0,0);
- BRT = 0xF4; //設置定時重載值
- AUXR |= 0x10; //啟動獨立波特率發生器
- bt=1; //修改波特率標志,防止多次修改
- btln++;
- TR0=1; //啟動定時器計時
- }
- if(btln==4&&bt==0)
- {
- btl=4800; //波特率4800
- AUXR&=0XEF; //停止獨立波特率發生器
- dispnum2(6,0,0,48);
- BRT = 0xFA; //設置定時重載值
- AUXR |= 0x10; //啟動獨立波特率發生器
- bt=1; //修改波特率標志,防止多次修改
- btln++;
- TR0=1; //啟動定時器計時
- }
- if(btln==5&&bt==0)
- {
- btl=9600; //波特率9600
- AUXR&=0XEF; //停止獨立波特率發生器
- dispnum2(6,0,0,96);
- BRT = 0xFD; //設置定時重載值
- AUXR |= 0x10; //啟動獨立波特率發生器
- bt=1; //修改波特率標志,防止多次修改
- btln++;
- TR0=1; //啟動定時器計時
- }
- if(btln==6&&bt==0)
- {
- btx=1; //2輪波特率切換仍未出現xz標志,7F檢測失敗
- }
- }
- if(RTS==1) //掃描串口是否關閉
- {
- delay(1);
- if(RTS==1)
- {
- ck=0;
- dispkaiguan(4,80,ck); //識別到串口關閉,更新顯示
- disp_nn(6,75);
- disp_nn(6,110);
- disp_nn(6,0);
- disp_nn(6,16); //________
- led=1;
- j=0; //清除7F次數記錄
- xz=0; //清除下載標志
- TR1=0;
- TL1 = 0x00; //設置定時初始值
- TH1 = 0x4C; //設置定時初始值
- t1=0; //清除定時器1計數
- t=0; //清除定時器0計數
- bt=0; //清除波特率設置標志
- btln=0; //清除波特率設置次數
- btx=0; //清除7F檢測失敗標志
- delay(2); //等待數毫秒,清除下載機上傳的數據
- RI=0;
- }
- }
- if(RI&&btx==0&&xz==0) //掃描是否有數據,且沒有7F檢測失敗標志 下載標志也沒有被激活
- {
- dat=SBUF;
- RI=0;
- dispnum2(6,75,1,dat); //數據顯示
- if(dat==0x7f)
- {
- j++;
- dispnum2(6,110,0,j);
- if(j>34) //連續35個7F,識別為下載數據流
- {
- j=34;
- xz=1; //設立下載標志
- TR0=0; //關閉定時器0
- TL0 = 0x00; //恢復定時初始值以便下次使用
- TH0 = 0x4C;
- if(ms==0) //自動模式才對繼電器控制,手動模式不予處理
- {
- if(dy) //電源選擇為INT
- {
- if(dc) //如果供電在開啟狀態,先斷電再給電實現冷啟動
- {
- J1=1;
- dc=0;
- dispkaiguan(2,80,dc);
- delay(1500);
- J1=0;
- dc=1;
- dispkaiguan(2,80,dc);
- TR1=1; //啟動定時器1;
- }
- else //如果供電在關閉狀態,直接給電即可實現冷啟動
- {
- J1=0;
- dc=1;
- dispkaiguan(2,80,dc);
- TR1=1;
- }
- }
- else //電源選擇為USB
- {
- if(dc)
- {
- J2=1;
- dc=0;
- dispkaiguan(2,80,dc);
- delay(1500);
- J2=0;
- dc=1;
- dispkaiguan(2,80,dc);
- TR1=1; //啟動定時器1;
- }
- else
- {
- J2=0;
- dc=1;
- dispkaiguan(2,80,dc);
- TR1=1; //啟動定時器1;
- }
- }
- }
- }
- }
- else
- {
- j=0;
- dispnum2(6,110,0,j);
- }
- }
- }
- if(k1==0&&key==0)
- {
- delay(5);
- if(k1==0)
- {
- key=1;
- tt=1000;
- while(tt>0&&k1==0)
- {
- tt--;
- delay(1);
- }
- if(tt==0) //1S以上為長按
- {
- ms=~ms; //長按為模式切換
- displayshouzi(0,80,ms);
- }
- else //1S以內為短按 電源開/關
- {
- dc=~dc;
- if(dy==1) //選擇為INT
- {
- J1=~dc; //繼電器與dc狀態相反
- }
- else
- {
- J2=~dc;
- }
- dispkaiguan(2,80,dc);
- }
- }
- }
- if(k2==0&&key==0)
- {
- delay(5);
- if(k2==0)
- {
- key=1;
- J1=J2=J3=J4=1; //關閉所有供電繼電器
- dispkaiguan(2,80,0); //電源顯示狀態為關閉
- dy=~dy;
- dispvcc(2,0,dy);
- DELETE_IAP(0x0000);
- if(dy==0)
- {
- WRITE_IAP(0X0000,0x01); //寫入USB供電存儲數據
- J4=0;
- }
- else
- {
- WRITE_IAP(0X0000,0x10); //寫入INT供電存儲數據
- J3=0;
- }
- if(dc==1) //電源狀態為開啟時,恢復繼電器
- {
- delay(500);
- if(dy==1) //電源選擇為INT
- {
- J1=0; //開啟繼電器1
- }
- else //電源選擇為USB
- {
- J2=0; //開啟繼電器2
- }
- dispkaiguan(2,80,dc); //電源顯示狀態為關閉
- }
- }
- }
- if(k3==0&&key==0) //備用按鍵
- {
- delay(5);
- if(k3==0)
- {
- qingping( );
- dispcunchucuowu( );
- DELETE_IAP(0x0000); //擦除扇區
- WRITE_IAP(0X0000,0xFB);
- while(1);
- }
- }
- if(key)
- {
- if(k1==1&&k2==1&&k3==1)
- {
- delay(5);
- if(k1==1&&k2==1&&k3==1)
- {
- key=0;
- }
- }
- }
- }
- }
- void timeraa( ) interrupt 1
- {
- TL1 = 0x00; //設置定時初始值
- TH1 = 0x4C; //設置定時初始值
- t++;
- if(t==20)
- {
- t=0;
- TR0=0; //關閉定時器
- bt=0;
- }
- }
- void timerbb( ) interrupt 3
- {
- TL1 = 0x00; //設置定時初始值
- TH1 = 0x4C; //設置定時初始值
- t1++;
- if(t1==4)
- {
- t1=0;
- led=~led;
- }
- }
復制代碼
|