对三菱外呼小板进行研究,通过示波器,逻辑分析仪,分析出三菱小板对应与液晶显示的逻辑,并通过实际现场实验得出
本来打算做远程监控的,觉得用此版麻烦,后来用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