對三菱外呼小板進行研究,通過示波器,邏輯分析儀,分析出三菱小板對應與液晶顯示的邏輯,並通過實際現場實驗得出
本來打算做遠程監控的,覺得用此版麻煩,后來用can獲取通訊,比這個簡單。故丟棄不用了這些代碼,
2017年4月份辛苦一個星期得來的,丟掉可惜。
清除資料之前,分享給大家,看的懂看看,看不懂的就算了,不提供技術支援,本來就是寫的玩的。
禁止商業用途,只學習交流使用,本人不承擔任何后果
顯示板接口說明;以下的結構圖,對應着板子的位置
_________________________________________________________
| 1 2 3 4 5 6 7 8 |
| - - - - - - - - |
| G 12v G G |
| | y1 |5v |
| | y2 |5v |
| | y3 | |
| | y4 | G |
| | y5 | G |
| | yd1 | G |
| | yd2 | G |
| | yd3 | |
| | yd4 |12v |
| | yd5 |12v |
| | yDclk 上 下 |
| | yDblk - - - - - - - |
| | |
| P366714B000G03 |
|________________________________________________________|
________________________________________________________
以下是用STC15W4k芯片編寫的,編寫難免有些不足
函數接口說明
void GPIOxianshi(void);//初始化io口
bit tingyong(void);//只有顯示停用顯1,其他全部正常顯0 ;
bit yichang(void);//只要不是自動,全變1
bit bianhua(void);//當顯示有變化時,顯1(包括停用) ;做實時監控時使用
void ztsx_sxzt(void); //先狀態,后上下;代碼含義看程序 直接兩位代碼
void Sendlouxian(void);//顯示樓層 直接顯示樓層

#include "unstc15.h" #include "uart.h" #include "sl_xianshi.h" #include "delay.h" #include <intrins.h> /****改端口****/ //(一下端口按着順序排列) /*顯示板接口說明 _________________________________________________________ | 1 2 3 4 5 6 7 8 | | - - - - - - - - | | G 12v G G | | | y1 |5v | | | y2 |5v | | | y3 | | | | y4 | G | | | y5 | G | | | yd1 | G | | | yd2 | G | | | yd3 | | | | yd4 |12v | | | yd5 |12v | | | yDclk 上 下 | | | yDblk - - - - - - - | | | | | P366714B000G03 | |________________________________________________________| */ /*********讀地址***********/ sbit Y1 = P5^4; // y1 y2 y3 的順序 000 (0)無符號狀態 100(4)停用 010(2)專用 001(1)專用滿員 sbit Y2 = P4^7; // 110(6)滿員 011(3)自動滿員 101(5)自動 111(7)異常 sbit Y3 = P4^6; // sbit Y4 = P4^5; // y4 y5 01下行 10上行 sbit Y5 = P4^4; // _______________ sbit YD1 = P4^3; // 5位編制碼 可以編制成1024位 | | sbit YD2 = P4^2; // | | sbit YD3 = P4^1; // | 全速采集10/s| sbit YD4 = P4^0; // | | sbit YD5 = P5^2; // |_____________| sbit YDclk = P5^1; //2/3的占空比脈沖 30ms 110  ̄  ̄ _ sbit YDbclk = P5^0; //1/3的占空比脈沖 30ms 100  ̄ _ _ /*i****** 單片機操作 ***********/ sbit key= P0^7; //默認key高電平,低電平與pc通訊 /******* 數碼管操作 ***********/ /**************顯示二維數組********因為測試解碼很費時間關系只做了-2到35的數值顯示(包括16進制)********/ code u32 xianshi[1024]={ // 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32 //0 //00 ////測試8 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x18,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00, //1 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //2 //8, //28 //18 0xff,0xff,0x08,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x28,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x18,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //3 //1 0xff,0xff,0xff,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //4 //4 //24 //14 //34 0xff,0xff,0xff,0xff,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x24,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x14,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x34,0xff,0xff,0xff, //5 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //6 //b //2b //1b 0xff,0xff,0xff,0xff,0xff,0xff,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //7 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //8 //22 //2 //32 //12 //37=-2 0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x12,0xff,0xff,0x37,0xff,0xff,0xff,0xff, //9 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //10 //20 //30 //10 0xff,0xff,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x30,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x10,0xff,0xff,0xff,0xff,0xff, //11 //2d //d //1d 0xff,0xff,0xff,0x2d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1d,0xff,0xff,0xff,0xff, //12 //26 //6 //16 0xff,0xff,0xff,0xff,0x26,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x06,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x16,0xff,0xff,0xff, //13 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //14 //2e //e //1e 0xff,0xff,0xff,0xff,0xff,0xff,0x2e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1e,0xff, //15 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //16//11 //-1=36 //31 //21 0x11,0xff,0xff,0x36,0xff,0xff,0xff,0xff,0x31,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x21,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //17 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //18 //19 //9 //29 0xff,0xff,0x19,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x09,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x29,0xff,0xff,0xff,0xff,0xff, //19 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //20 //15 //35 //5 //25 0xff,0xff,0xff,0xff,0x15,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x35,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x05,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x25,0xff,0xff,0xff, //21 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //22 //1c //c //2c 0xff,0xff,0xff,0xff,0xff,0xff,0x1c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2c,0xff, //23 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //24//33 //13 //23 //03 0x33,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x13,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x23,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //25 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //26 //1a //2a //a 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0a,0xff,0xff,0xff,0xff,0xff, //27 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //28 //7 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x17,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x27,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xff,0xff,0xff, //29 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //30 //1f //2f //f 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff, //31 //997 0xff,0xff,0xff,0xff,0xef,0xee,0xe2,0x66,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x66 // 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30 }; //36-1 36=-2 code u8 *zifu[56]={ "--","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F", //16 "10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F", //32 "20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F", //48 "30","31","32","33","34","35","-1","-2"}; //54 // 0 1 2 3 4 5 6 7 //code u8 *ztz[8]={"無符號","專用滿員","專用","自動滿員","停用","自動","滿員","異常"}; code u8 *ztz[8]={"0","1","2","3","4","5","6","7"}; //上//下 code u8 *shangx[4]={"-","M","W","-"}; /****************************************/ u16 kgao; // 2/3時鍾地址(下降沿有效) u16 kdi; // 1/3時鍾地址 (上升沿有效) u16 kezt; // 狀態,比如自動停用 u16 keud; //上下 u16 SS; u16 kk; //數據位 u8 szkey=250; //設置按鍵反映時間 u8 kkk1;u8 kkk2=77; u8 kkk3,kkk4=5; u8 p1zt;u8 p2zt=254; //必須放在這里,因為一調用函數會變掉這里是初始值 /******************** IO配置函數 **************************/ void GPIOxianshi(void) { P4M0 = 0; //設置p1准雙向口 P4M1 = 0; P5M0 = 0; //設置p0准雙向口 P5M1 = 0; Y1=Y2=Y3=Y4=Y5=YD1=YD2=YD3=YD4=YD5=YDclk =YDbclk =1; } /***********/ chuli(void); u16 gao(void); u16 duqu(void); bit CLKERROR(void); void Sendlouxian(void); state_sxzt(void); void ztsx_sxzt(void); /*************************************************************************************/ //對樓顯信息進行處理函數 檢測異常函數 bit yichang(void) { //bit key;//key由接受指令控制(這里因為沒有加入處理占時自定義) state_sxzt(); //讀取停用值 kezt if(kezt==5) return 0; else return 1; } bit tingyong(void) { //bit key;//key由接受指令控制(這里因為沒有加入處理占時自定義) state_sxzt(); //讀取停用值 kezt if(kezt==4) return 1; else return 0; } bit bianhua(void) //啟動網絡發送標志位,一旦樓顯數據變化。發送 { state_sxzt(); //讀取kezt keud p1zt=kezt; kkk3=keud; kkk1=duqu(); if(p1zt!=p2zt) // 發生變化發送 {p2zt=p1zt; return 1;//空格 } else if(kkk1!=kkk2) //樓顯發生變化發送 {kkk2=kkk1;return 1;} else if(kkk3!=kkk4) //發生變化發送 {kkk4=kkk3;return 1;} else return 0; } ////////////////////////上行狀態反映/////////////////////////////// void ztsx_sxzt(void) //直接打印自動還是滿員和上行或下行 { u8 *ud; u8 *zt; state_sxzt(); //可以不要,也可以實時刷新數據 zt=ztz[kezt]; ud=shangx[keud]; //SendString("狀態:"); SendString(zt); //SendString("\r\n"); //SendString("運行方向狀態:"); SendString(ud); //SendString("\r\n"); } /**************************************************/ void Sendlouxian(void) //直接打印顯示樓層數 { u8 *s; // SendString("樓層:"); kkk2=duqu(); if(0<=kkk2&&kkk2<=55) {s=zifu[kkk2]; SendString(s); //SendString("\r\n"); } else SendString("EE"); } /******************************************************** 狀態顯示 ***********************************************************/ state_sxzt(void) { kezt=0; _nop_(); if(Y1) {kezt<<=1; kezt=(kezt|1);} else kezt<<=1; _nop_(); if(Y2) {kezt<<=1; kezt=(kezt|1);} else kezt<<=1; _nop_(); if(Y3) {kezt<<=1; kezt=(kezt|1);} else kezt<<=1; _nop_(); /****************上下*************************/ keud=0; _nop_(); if(Y4) {keud<<=1; keud=(keud|1);} else keud<<=1; _nop_(); if(Y5) {keud<<=1; keud=(keud|1);} else keud<<=1; _nop_(); return kezt,keud; } /***********對pic解碼處理***********************************************************************************/ //事實顯示主要處理函數 (顯示十六進制進制數值) u16 duqu(void) { kk=0; if(!CLKERROR()) {kk=999;} //66 這里為假設值 (實際ef要測) ef時鍾故障 (31 4) else chuli(); SS=xianshi[kk]; return (SS); } bit CLKERROR(void)//對上clk異常判斷函數 // { u8 i;bit sss=0; for(i=0;i<25;i++) //假設100ms沒有反映,將輸出無顯示假=0 { if((YDbclk==1)||(YDclk==1)) { sss=1;return 1;} delay_ms(1); } if(sss==1) return 1; else return 0; } //主要確定不誤碼 chuli(void) { u16 k1,i1,k2; bit cl; k1=0;k2=0;cl=0; for(i1=0;i1<4;i1++) //不用while 避免陷入死循環 {kgao=0; kdi=0; k1=gao(); delay_ms(16); kgao=0; kdi=0; k2=gao(); if(k1==k2) {kk=k1;cl=1; return kk;} } if(cl==0) {kk=998;return kk;} return kk; //這里為假設 ee ee為讀取故障 (31,5) } u16 gao(void) { u8 i,i3; bit cl2f=0; bit clf=0; for(i=0;i<10;i++) //不陷入死循環 {delay_ms(3); if(!YDclk) //高5位輸入 { kgao=0; _nop_(); if(YD1) {kgao<<=1; kgao=(kgao|1);} else kgao<<=1; _nop_(); if(YD2) {kgao<<=1; kgao=(kgao|1);} else kgao<<=1; _nop_(); if(YD3) {kgao<<=1; kgao=(kgao|1);} else kgao<<=1; _nop_(); if(YD4) {kgao<<=1; kgao=(kgao|1);} else kgao<<=1; _nop_(); if(YD5) {kgao<<=1; kgao=(kgao|1);} else kgao<<=1; _nop_(); cl2f=1;break; } if(cl2f==0) kgao=0; //指定33位 錯誤位 指向ff } kdi=kgao; for(i3=0;i3<10;i3++) //不陷入死循環 {delay_ms(3); if(YDbclk) //低5位輸入 { if(YD1) {kdi<<=1; kdi=(kdi|1);} else kdi<<=1; if(YD2) {kdi<<=1; kdi=(kdi|1);} else kdi<<=1; if(YD3) {kdi<<=1; kdi=(kdi|1);} else kdi<<=1; if(YD4) {kdi<<=1; kdi=(kdi|1);} else kdi<<=1; if(YD5) {kdi<<=1; kdi=(kdi|1);} else kdi<<=1; clf=1; return kdi; } } if(clf==0) kdi=1;return kdi; //指定33位 錯誤位 指向ff } /******************************************************************************************************************/

#ifndef __SL_XIANSHI_H #define __SL_XIANSHI_H//__sl_xianshi_H #include "unstc15.h" void GPIOxianshi(void);//初始化io口 bit tingyong(void);//只有顯示停用顯1,其他全部正常顯0 ; bit yichang(void);//只要不是自動,全變1 bit bianhua(void);//當顯示有變化時,顯1(包括停用) ;做實時監控時使用 void ztsx_sxzt(void); //先狀態,后上下;代碼含義看程序 直接兩位代碼 void Sendlouxian(void);//顯示樓層 直接顯示樓層 #endif