/*PCB机板增加读写24C64函数PAST   2017 12 26 08:10 CODE 7382*/
 /*按11键进入手动选择,按12键进入参数设定界面
 按1存1 2存2 3存3 15存0 16存1236  17读EEPROM显示正确
                 L1008  13775061792 ******/
               #include       <reg52.h>
               #include       <intrins.h>
               #include       <stdlib.h>
               #include       <stdio.h>
               #define        uchar unsigned char
               #define        uint unsigned int
               typedef        unsigned char BYTE;
               typedef        unsigned int WORD;
               sbit           cd=P7^7;           //    PIN    56
               sbit           ce=P4^5;           //    PIN    57
               sbit           rst=P4^6;           //    PIN    58
               sbit           wr=P7^6;           //    PIN    55
               sbit           rd=P7^5;           //    PIN    54
               sbit           fs=P6^0;           //    PIN    5
               sbit           OUT1=P2^7;           //    PIN    52    按键总线例
               sbit           OUT2=P7^4;           //    PIN    53
               sbit           OUT3=P5^2;           //    PIN    64
               sbit           OUT4=P5^3;           //    PIN    1
               sbit           IN1=P2^4;           //    PIN49    按键总线横
               sbit           IN2=P2^5;           //    PIN50
               sbit           IN3=P2^6;           //    PIN51
               sbit           IN4=P6^1;           //    PIN6
               sbit           IN5=P6^2;           //    PIN7
               sbit           IN6=P6^3;           //    PIN8
               sbit           IN7=P5^5;           //    PIN20
               sbit           STOP=P3^3;           //    停止
               sbit           INSERT=P3^2;       //    插入
               sbit           CP1=P2^2;           //    PIN47
               sbit           DIR1=P2^3;           //    PIN48
               sbit           EN1=P7^2;           //    PIN39
               sbit           CP2=P2^1;           //    PIN46
               sbit           DIR2=P7^1;           //    PIN38
               sbit           EN2=P7^0;           //    PIN37
               sbit           CP3=P3^5;           //    PIN34
               sbit           DIR3=P5^1;           //    PIN33
               sbit           EN3=P4^0;           //    PIN22
               sbit           INTPUT0=P2^0;       //    PIN45
               sbit           INTPUT1=P4^4;       //    PIN44
               sbit           INTPUT2=P4^3;       //    PIN43
               sbit           INTPUT3=P4^2;       //    PIN42
               sbit           INTPUT4=P4^1;       //    PIN41
               sbit           INTPUT5=P7^3;       //    PIN40
               sbit           INTPUT6=P3^7;       //    PIN36
               sbit           INTPUT7=P3^6;       //    PIN35
               sbit           SCL=P1^7;           //    PIN17 外部EEPROM       24C64PIN6
               sbit           SDA=P5^4;           //    PIN18 外部EEPROM       24C64PIN5
               #define        dataport P0  //P0为数据口
               uint           counter,val,vals;
               sbit           Rom_CS=P1^4;      /*1字库IC接口定义Rom_CS就是字库IC的CS#*/
               sbit           Rom_SCK=P1^6;     /*2字库IC接口定义:Rom_SCK就是字库IC的SCK*/
               sbit           Rom_OUT=P1^3;     /*字库IC接口定义:Rom_OUT就是字库IC的OUT*/
               sbit           Rom_IN=P1^5;      /*字库IC接口定义:Rom_IN就是字库IC的IN*/
               #define        ulong unsigned long
               uchar          fontbuff[32];       //字库中读出的数据存放缓冲数组单元
               uchar          newbuff[32];        //将字库中读出的数据进行转换
               bdata          char com_data;                           /********/
               sbit           mos_bit=com_data^7;                      /****高位****/
               sbit           low_bit=com_data^0;                      /****低位****/
               uchar          code Testbuff[32]={
               0X07,0X04,0X04,0X04,0X07,0X04,0X04,0X04,
               0XF0,0X10,0X10,0X10,0XF0,0X10,0X10,0X10,
               0X07,0X04,0X08,0X08,0X10,0X20,0X40,0X00,
               0XF0,0X10,0X10,0X10,0X10,0X10,0X50,0X20
               };
               uint     counter;
 int      code fontadd[32]={0,8,1,9,2,10,3,11,           //竖置横排转横置横排点阵排列表
                            4,12,5,13,6,14,7,15,
                            16,24,17,25,18,26,19,27,
                            20,28,21,29,22,30,23,31};
 int      code xsadd[15]={0,16,32,48,64,80,96,112,128,144,160,176,192,208,224};  //0-9首地址 每字64字节
 uchar code tab0[240]={
 0X00,0X3C,0X42,0X42,0X42,0X42,0X42,0X42,
 0X42,0X42,0X42,0X42,0X42,0X42,0X3C,0X00,//0
 0X00,0X30,0X50,0X10,0X10,0X10,0X10,0X10,
 0X10,0X10,0X10,0X10,0X10,0X10,0X38,0X00,//1
 0X00,0X3C,0X42,0X02,0X02,0X02,0X04,0X08,
 0X10,0X20,0X20,0X40,0X40,0X42,0X7E,0X00,//2
 0X00,0X3C,0X42,0X02,0X02,0X02,0X02,0X3C,
 0X02,0X02,0X02,0X02,0X02,0X42,0X3C,0X00,//3
 0X00,0X0C,0X14,0X24,0X24,0X44,0X44,0X84,
 0X84,0XFE,0X04,0X04,0X04,0X04,0X04,0X00,//4
 0X00,0X7E,0X40,0X40,0X40,0X40,0X7C,0X02,
 0X02,0X02,0X02,0X02,0X42,0X42,0X3C,0X00,//5
 0X00,0X3C,0X42,0X40,0X40,0X40,0X7C,0X42,
 0X42,0X42,0X42,0X42,0X42,0X42,0X3C,0X00,//6
 0X00,0X3E,0X42,0X04,0X04,0X08,0X08,0X10,
 0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X00,//7
 0X00,0X3C,0X42,0X42,0X42,0X42,0X42,0X3C,
 0X42,0X42,0X42,0X42,0X42,0X42,0X3C,0X00,//8
 0X00,0X3C,0X42,0X42,0X42,0X42,0X42,0X3C,
 0X02,0X02,0X02,0X02,0X02,0X42,0X3C,0X00,//9
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"清除",*/
 0X00,0X00,0X42,0X42,0X24,0X24,0X18,0X18,
 0X18,0X18,0X24,0X24,0X42,0X42,0X00,0X00,//X
 0X00,0X00,0X41,0X41,0X22,0X14,0X08,0X08,
 0X08,0X08,0X08,0X08,0X08,0X08,0X00,0X00,//Y
 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
 0X00,0X00,0X00,0X00,0X00,0X60,0X60,0X00,//.
 0X00,0X3C,0X42,0X42,0X40,0X40,0X40,0X3C,
 0X02,0X02,0X02,0X02,0X42,0X42,0X3C,0X00    //S 14
 };
 /*------------延时子程序---------------------*/
               void delay(unsigned int t)
               {  
               unsigned int i,j;
               for(i=0;i<t;i++)
               for(j=0;j<100;j++);
               }
 /**************************************/
                void start()
                {
                SDA=1;_nop_();_nop_();_nop_();_nop_();
                SCL=1;_nop_();_nop_();_nop_();_nop_();
                SDA=0;_nop_();_nop_();_nop_();_nop_();
                SCL=0;_nop_();_nop_();_nop_();_nop_();
                }
 /***************************************/
                void stop()
                {
                SDA=0;_nop_();_nop_();_nop_();_nop_();
                SCL=1;_nop_();_nop_();_nop_();_nop_();
                SDA=1;_nop_();_nop_();_nop_();_nop_();
                }
 /***************************************/
                void ack()
                {
                SCL=1;_nop_();_nop_();_nop_();_nop_();
                SCL=0;_nop_();_nop_();_nop_();_nop_();
                }
 /***************************************/
                void shift8(char a)
                {
                data uchar i;
                com_data=a;
                 for(i=0;i<8;i++)
                 {
                 SDA=mos_bit;
                 SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                 SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                 com_data=com_data*2;
                 }
                }
 /***************************************/
                void delay_iic(int v)
                {
                int i,j;
                for(i=1;i<v;i++)
                {
                 for(j=0;j<50;j++)
                 {
                  _nop_();
                 }
                 }
                }
 /***************************************/
                uchar rd_24C64(char a)
                {
                data uint i,command;
                SDA=1;_nop_();_nop_();_nop_();_nop_();
                SCL=0;_nop_();_nop_();_nop_();_nop_();
                start();
                command=160;
                shift8(command);                            /*****写入160*****/
                ack();                                        
                shift8(0X0F);                               /*****写高八位地址 高三位无效*****/
                ack();
                shift8(a);                                   //
                ack();
                start();
                command=161;
                shift8(command);                            /*****写入161*****/
                ack();
                SDA=1;_nop_();_nop_();_nop_();_nop_();
                for(i=0;i<8;i++)
                 {
                  com_data=com_data*2;
                  SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                  low_bit=SDA;
                  SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                 }
                stop();
                return(com_data);
               }
 /***************************************/
                void wr_24C64(char a,char b)      //a地址 b数据
                {
                data uint command;
                _nop_();_nop_();_nop_();_nop_();_nop_();
                SDA=1;_nop_();_nop_();_nop_();_nop_();
                SCL=0;_nop_();_nop_();_nop_();_nop_();
                start();
                command=160;
                shift8(command);                             /*****写入160*****/
                ack();                                        
                shift8(0X0F);                                /*****写高八位地址 高三位无效*****/
                ack();
                shift8(a);                                   /*****写入低八位地址 a *****/
                ack();
                shift8(b);                                   /*****写入 b *****/
                ack();
                stop();
                _nop_();_nop_();_nop_();_nop_();_nop_();
                }
 /************延时函数****************/
               void delay_nms(unsigned int n)
               {
               unsigned int i,j;
               for(i=n;i>0;i--)
               {
                for(j=2000;j>0;j--)
                {
                }
               }
               }
 /***状态检查函数*指令,数据读写状态检查**/
               void Lcd_Busy()
               {
               uchar dat;
                do
                {
                dataport=0xff;
                ce=0;
                cd=1;
                wr=1;
                rd=0;
                dat=dataport;
                rd=1;
                dat=0x03&dat;//STA0,STA1是否准备好
               }
               while(dat!=0x03);
               }
 /*******数据自动写状态检查*****************/
               void autowcheck()
               {
               uchar dat;
                do
                {
                dataport=0xff;
                ce=0;
                cd=1;
                wr=1;
                rd=0;
                dat=dataport;
                rd=1;
                dat=0x08&dat;//STA3是否准备好
               }
               while(dat==0x00);
               }
 /*------输入/出函数,与T6963通讯------------------------------------------------*/
 // 向数据口发Data
               void wr_data(uchar dat)
               {  
               ce=0;
               cd=0;  
               dataport=dat;
               wr=0;
               wr=1;
               }
 /*****写有1个参数命令***********/
               void wr_com1(uchar command)
               {
               Lcd_Busy();
               cd=1;
               ce=0;
               rd=1;
               dataport=command;
               wr=0;
               wr=1;
               }
 /******写有 3 个参数命令*******************/
               void wr_com3(uchar data1, uchar data2, uchar command)
               {
               Lcd_Busy();
               wr_data(data1);
               Lcd_Busy();
               wr_data(data2);    
               wr_com1(command);
               }
 /*--------------------------------*/
               void lcd_address(uchar urow,uchar ucol)    //urow 为1---30(240/8=30),,ucol为1---64
               {
               uint ipos;
               uchar urow1;
               uchar ucol1;
               urow1=urow-1;     //    1---30
               ucol1=ucol-1;     //    1---64
               ipos=ucol1*30+urow1;
               wr_com3(ipos&0xff,0x08+ipos/256,0x24);
               }
 /************清屏*******************/
               void ClearScreen()
               {
               unsigned int i;
               wr_com3(0x00,0x00,0x24); //设置指针地址0000H
               wr_com1(0xb0); //设置自动写状态
                for(i=0;i<9600;i++)      //320X240/8=9600
                {
                autowcheck();
                wr_data(0x00);
                }
               wr_com1(0xb2); // 自动写结束
               }
 /**********初始化LCD****************/
               void InitLCD()
               {
               cd=1;
               wr=1;
               rd=1;
               wr_com3(0x00,0x00,0x40); //设置文本显示区域首地址GraphAddr
               wr_com3(0x1e,0x00,0x41); //设置文本显示区域宽度:1eH  1 1110 16+8+4+2=30
               wr_com3(0x00,0x08,0x42); //设置图形显示区域首地址GraphAddr
               wr_com3(0x1e,0x00,0x43); //设置图形显示区域宽度:1eH
               wr_com1(0XA0);           //设置显示方式: CGROM方式 文本\图形 "或"
               wr_com1(0X80);           //设置显示方式: CGROM方式 文本\图形 "或"
               wr_com1(0X9C);           //显示开关设置,开文本和图形显示*/
               ClearScreen();
               }
 /*显示字库处理汉字字符表汉字点阵代码*/
               void display_chines_16x16(uchar urow,uchar ucol,uchar *dp)
               {
               uchar i,j,K;
               K=0;
                for(j=0;j<16;j++)
                {
                lcd_address(urow,ucol+j);
                wr_com1(0xb0); //设置自动写状态
                 for(i=0;i<2;i++)
                 {    
                 autowcheck();  /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                 wr_data(*(dp+fontadd[K]));
                 K++;
                 }
                wr_com1(0xb2); // 自动写结束
                }
               }
 /********************************/
               void display_graphic_16x8(uchar urow,uchar ucol,int mm,uchar *dp)
               {
               uchar j;
                for(j=0;j<16;j++)
                {
                lcd_address(urow,ucol+j);
                wr_com1(0xb0); //设置自动写状态
                autowcheck();  /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                wr_data(*(dp+mm));
                dp++;
                wr_com1(0xb2); // 自动写结束
                }
               }
 /*反码显示字库处理汉字字符表汉字点阵代码*/
               void display_negate_16x16(uchar urow,uchar ucol,uchar *dp)
               {
               uchar i,j,K;
               K=0;
                for(j=0;j<16;j++)
                {
                lcd_address(urow,ucol+j);
                wr_com1(0xb0); //设置自动写状态
                 for(i=0;i<2;i++)
                 {    
                 autowcheck();  /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                 wr_data(~*(dp+fontadd[K]));
                 K++;
                 }
                wr_com1(0xb2); // 自动写结束
                }
               }
 /***********字库芯片程序*************************/
 /***********送指令到字库IC***********************/
               void send_command_to_ROM( uchar datu )
               {
              uchar i;
               for(i=0;i<8;i++)
               {
               if(datu&0x80)
               Rom_IN=1;
               else
               Rom_IN=0;
               datu=datu<<1;
               Rom_SCK=0;
               Rom_SCK=1;
               }
               }
 /*****(从字库IC中取汉字或字符数据(1个字节****/
               static uchar ROMDATA( )
               {
                uchar i;
                uchar ret_data=0;
                Rom_SCK=1;
                for(i=0;i<8;i++)
                {
                Rom_OUT=1;
                delay(1);
                Rom_SCK=0;
                ret_data=ret_data<<1;
                if( Rom_OUT )
                ret_data=ret_data+1;
                else
                ret_data=ret_data+0;
                Rom_SCK=1;
                }
               return(ret_data);
               }
 /*从相关地址High地址高字节Mid地址中字节Low地址低字节中连续读出DataLen个字节的数据到 pBuff的地址*/
               void BytesDataFromROM(uchar ADHigh,ADMid, ADLow,DataLen,uchar *pBuff)
               {
               uchar i;
               Rom_CS = 0;
               Rom_SCK=0;
               send_command_to_ROM(0x03);
               send_command_to_ROM(ADHigh);
               send_command_to_ROM(ADMid);
               send_command_to_ROM(ADLow);
               for(i=0;i<DataLen;i++ )
               *(pBuff+i)=ROMDATA();
               Rom_CS=1;
               }
 /******************************************************************/
               ulong  fontaddr=0;
               void displayGB2312(uchar MSB,uchar LSB)
               {
               uchar i= 0;
               uchar addrHigh,addrMid,addrLow ;
               if(((MSB>=0xb0) &&(MSB<=0xf7))&&(LSB>=0xa1))
               {                        
 /*国标简体(GB2312)汉字在字库IC中的地址由以下公式来计算:*/
 /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
 /*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/
               fontaddr = (MSB-0xb0)*94;
               fontaddr += (LSB-0xa1)+846;
               fontaddr = (ulong)(fontaddr*32);
               addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
               addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
               addrLow = fontaddr&0xff;        /*地址的低8位,共24位*/
               BytesDataFromROM(addrHigh,addrMid,addrLow,32,fontbuff);/*取32个字节的数据,存到"fontbuf[32]"*/
               i+=2;
               }
               else if(((MSB>=0xa1) &&(MSB<=0xa3))&&(LSB>=0xa1))
               {                        
 /*国标简体(GB2312)15x16点的字符在字库IC中的地址由以下公式来计算:*/
 /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
 /*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/
               fontaddr = (MSB- 0xa1)*94;
               fontaddr += (LSB-0xa1);
               fontaddr = (ulong)(fontaddr*32);
               addrHigh = (fontaddr&0xff0000)>>16;  /*地址的高8位,共24位*/
               addrMid = (fontaddr&0xff00)>>8;      /*地址的中8位,共24位*/
               addrLow = fontaddr&0xff;        /*地址的低8位,共24位*/
               BytesDataFromROM(addrHigh,addrMid,addrLow,32,fontbuff);/*取32个字节的数据,存到"fontbuf[32]"*/
               i+=2;
               }
               else if((MSB>=0x20) &&(MSB<=0x7e))    
               {                        
               unsigned char fontbuff[16];            
               fontaddr = (MSB- 0x20);
               fontaddr = (unsigned long)(fontaddr*16);
               fontaddr = (unsigned long)(fontaddr+0x3cf80);            
               addrHigh = (fontaddr&0xff0000)>>16;
               addrMid = (fontaddr&0xff00)>>8;
               addrLow = fontaddr&0xff;
               BytesDataFromROM(addrHigh,addrMid,addrLow,16,fontbuff);/*取16个字节的数据,存到"fontbuf[32]"*/
               i+=1;
               }
               else
               i++;    
              }    
 /*汉字旋转子程序 将字库读出竖置横排结构的32字节数据
 旋转90度成横置横排结构,转换后点阵结构为
 左上部 右上部
 左下部 右下部
 显示时先取左上部最顶端数据,再取右上部顶端数据,
 再取左上部第二行数据,右上部第二行数据 ......*****/
               void  fontchange(void)
               {
                uchar          fontbuf;
                uint buff,i,step;
                 for(step=0;step<8;step++)        //16X16 左上角部分 总循环8步
                {
                fontbuf=0;                   //初始化 字节运算缓存器等于0
                buff=0;                        //字节缓冲器初始化.
                 for(i=0;i<8;i++)            //第一层循环,取竖置横排8字节第1个点。
                 {
                  fontbuf<<=1;                //数据自右向左移动,共移动7位,合并一字节
                  buff=fontbuff[i]>>step;    //将当前转换的列地址fontbuff[i]右移step步.
                  buff&=0X01;                //保留最低位置,
                  fontbuf|=buff;                //字节缓存器等于新的运算字节和最低位相与
                 }
                 newbuff[step]=fontbuf;      //将当前运算的一字节新数据存当前运算地址.
                }
               for(step=0;step<8;step++)        //16X16 右上角部分总循环8步
                {
                fontbuf=0;                   //初始化 字节运算缓存器等于0
                buff=0;                        //字节缓冲器初始化.
                 for(i=0;i<8;i++)            //第一层循环,取竖置横排8字节第1个点。
                 {
                  fontbuf<<=1;                //数据自右向左移动,共移动7位,合并一字节
                  buff=fontbuff[i+8]>>step;    //将当前转换的列地址fontbuff[i]右移step步.
                  buff&=0X01;                //保留最低位置,
                  fontbuf|=buff;                //字节缓存器等于新的运算字节和最低位相与
                 }
                 newbuff[step+8]=fontbuf;   //将当前运算的一字节新数据存当前运算地址.
                }
                for(step=0;step<8;step++)    //16X16 左下角部分总循环8步
                {
                fontbuf=0;                   //初始化 字节运算缓存器等于0
                buff=0;                        //字节缓冲器初始化.
                 for(i=0;i<8;i++)            //第一层循环,取竖置横排8字节第1个点。
                 {
                  fontbuf<<=1;                //数据自右向左移动,共移动7位,合并一字节
                  buff=fontbuff[i+16]>>step;    //将当前转换的列地址fontbuff[i]右移step步.
                  buff&=0X01;                //保留最低位置,
                  fontbuf|=buff;                //字节缓存器等于新的运算字节和最低位相与
                 }
                 newbuff[step+16]=fontbuf;    //将当前运算的一字节新数据存当前运算地址.
                }
               for(step=0;step<8;step++)        //16X16 右下角部分总循环8步
                {
                fontbuf=0;                   //初始化 字节运算缓存器等于0
                buff=0;                        //字节缓冲器初始化.
                 for(i=0;i<8;i++)            //第一层循环,取竖置横排8字节第1个点。
                 {
                  fontbuf<<=1;                //数据自右向左移动,共移动7位,合并一字节
                  buff=fontbuff[i+24]>>step;    //将当前转换的列地址fontbuff[i]右移step步.
                  buff&=0X01;                //保留最低位置,
                  fontbuf|=buff;                //字节缓存器等于新的运算字节和最低位相与
                 }
                 newbuff[step+24]=fontbuf;   //将当前运算的一字节新数据存当前运算地址.
                }
               }
 /************************************/
                void counteradd()
               {
                uchar  h1,l1,m1,n1;                /****个十百千代码缓冲**/
                h1=counter/1000;
                l1=(counter-h1*1000)/100;
                m1=(counter-h1*1000-l1*100)/10;
                n1=counter-h1*1000-l1*100-m1*10;
                display_graphic_16x8(11,49,xsadd[h1],tab0);//
                display_graphic_16x8(12,49,xsadd[l1],tab0);//
                display_graphic_16x8(13,49,xsadd[m1],tab0);//
                display_graphic_16x8(14,49,xsadd[n1],tab0);//    
               }
 /************************************/
               void dis_val()
               {
                uchar  h,l,m,n;                /****个十百千代码缓冲**/
                //vals=1225;
                h=vals/1000;
                l=(vals-h*1000)/100;
                m=(vals-h*1000-l*100)/10;
                n=vals-h*1000-l*100-m*10;
                display_graphic_16x8(11,33,xsadd[h],tab0);//
                display_graphic_16x8(12,33,xsadd[l],tab0);//
                display_graphic_16x8(13,33,xsadd[m],tab0);//
                display_graphic_16x8(14,33,xsadd[n],tab0);//    
               }
 /************************************/
               void write_val()
               {
                uchar  h,l,m,n;                /****个十百千代码缓冲**/
                h=val/1000;                      //千位
                l=(val-h*1000)/100;              //百位
                m=(val-h*1000-l*100)/10;          //十位
                n=val-h*1000-l*100-m*10;          //个位
                wr_24C64(1,n);         /*写入个位*/
                wr_24C64(2,m);         /*写入十位*/
                wr_24C64(3,l);         /*写入百位*/
                wr_24C64(4,h);         /*写入千位*/
               }
 /************************************/
               void read_val()
               {
               uchar k_data,h_data,t_data,b_data; //
               b_data=rd_24C64(1);delay_iic(200); // 个位
               t_data=rd_24C64(2);delay_iic(200); // 十位
               h_data=rd_24C64(3);delay_iic(200); // 百位
               k_data=rd_24C64(4);delay_iic(200); // 千位
               vals=k_data*1000+h_data*100+t_data*10+b_data;    
               //vals=2206;
               }
 /************************************/
               void main(void)
               {
               P0M0=0;
               P0M1=0;
               P1M0=0X80;    //1000 0000      P1.7开漏
               P1M1=0X80;    //1000 0000
               P2M0=0;
               P2M1=0;
               P3M0=0;
               P3M1=0;
               P4M0=0;
               P4M1=0;
               P5M0=0X10;    //0001 0000      P5.4开漏
               P5M1=0X10;    //0001 0000
               P6M0=0;
               P6M1=0;
               P7M0=0;
               P7M1=0;
               OUT1=1;
               OUT2=1;
               OUT3=1;
               OUT4=1;
               IN1=1;
               IN2=1;
               IN3=1;
               IN4=1;
               IN5=1;
               IN6=1;
               IN7=1;
               counter=0;
               rst=0;
               delay_nms(100);
               rst=1;
               delay_nms(100);
               fs=0;
               InitLCD();
               ClearScreen();
               wr_24C64(10,2);         /*写入个位*/
               wr_24C64(11,2);         /*写入个位*/
               wr_24C64(12,6);         /*写入十位*/
               wr_24C64(13,9);         /*写入百位*/
               displayGB2312(0XD7,0XD4);
               fontchange();
               display_chines_16x16(1,1,newbuff);
               displayGB2312(0XB6,0XAF);
               fontchange();
               display_chines_16x16(3,1,newbuff);
               displayGB2312(0XD6,0XB4);
               fontchange();
               display_chines_16x16(5,1,newbuff);
               displayGB2312(0XD0,0XD0);
               fontchange();
               display_chines_16x16(7,1,newbuff);    //自动执行
               displayGB2312(0XCA,0XD6);
               fontchange();
               display_chines_16x16(1,17,newbuff);
               displayGB2312(0XB6,0XAF);
               fontchange();
               display_chines_16x16(3,17,newbuff);
               displayGB2312(0XB2,0XD9);
               fontchange();
               display_chines_16x16(5,17,newbuff);
               displayGB2312(0XD7,0XF7);
               fontchange();
               display_chines_16x16(7,17,newbuff);     //手动操作
               displayGB2312(0XB3,0XCC);
               fontchange();
               display_chines_16x16(1,33,newbuff);
               displayGB2312(0XD0,0XF2);
               fontchange();
               display_chines_16x16(3,33,newbuff);
               displayGB2312(0XB9,0XDC);
               fontchange();
               display_chines_16x16(5,33,newbuff);
               displayGB2312(0XC0,0XED);
               fontchange();
               display_chines_16x16(7,33,newbuff);     //程序管理
               displayGB2312(0XB2,0XCE);
               fontchange();
               display_chines_16x16(1,49,newbuff);
               displayGB2312(0XCA,0XFD);
               fontchange();
               display_chines_16x16(3,49,newbuff);
               displayGB2312(0XC9,0XE8);
               fontchange();
               display_chines_16x16(5,49,newbuff);
               displayGB2312(0XD6,0XC3);
               fontchange();
               display_chines_16x16(7,49,newbuff);     //参数设置
               delay_nms(2000);
               displayGB2312(0XD7,0XD4);
               fontchange();
               display_negate_16x16(1,1,newbuff);
               displayGB2312(0XB6,0XAF);
               fontchange();
               display_negate_16x16(3,1,newbuff);
               displayGB2312(0XD6,0XB4);
               fontchange();
               display_negate_16x16(5,1,newbuff);    //反显自动执行
               displayGB2312(0XD0,0XD0);
               fontchange();
               display_negate_16x16(7,1,newbuff);
               display_graphic_16x8(9,1,xsadd[11],tab0);//     X
               display_graphic_16x8(11,1,xsadd[0],tab0);//     0
               display_graphic_16x8(12,1,xsadd[0],tab0);//     0
               display_graphic_16x8(13,1,xsadd[0],tab0);//     0
               display_graphic_16x8(14,1,xsadd[0],tab0);//     0
               display_graphic_16x8(15,1,xsadd[13],tab0);//.
               display_graphic_16x8(16,1,xsadd[0],tab0);//     0
               display_graphic_16x8(17,1,xsadd[0],tab0);//     0
               display_graphic_16x8(19,1,xsadd[12],tab0);// Y
               display_graphic_16x8(21,1,xsadd[0],tab0);//     0
               display_graphic_16x8(22,1,xsadd[0],tab0);//     0
               display_graphic_16x8(23,1,xsadd[0],tab0);//     0
               display_graphic_16x8(24,1,xsadd[0],tab0);//     0
               display_graphic_16x8(25,1,xsadd[13],tab0);//.
               display_graphic_16x8(26,1,xsadd[0],tab0);//     0
               display_graphic_16x8(27,1,xsadd[0],tab0);//     0
               while(1)
               {
               counteradd();
               delay_nms(50);
               counter++;
                if(!STOP)
                {
                display_graphic_16x8(28,1,xsadd[2],tab0);//  显示27
                display_graphic_16x8(29,1,xsadd[7],tab0);//
                CP1=1;
                DIR1=1;
                EN1=1;
                CP2=1;
                DIR2=1;
                EN2=1;
                CP3=1;
                DIR3=1;
                EN3=1;
                }
                 if(!INSERT)
                 {
                  display_graphic_16x8(28,1,xsadd[2],tab0);//  显示25
                  display_graphic_16x8(29,1,xsadd[5],tab0);//
                  CP1=0;
                  DIR1=0;
                  EN1=0;
                  CP2=0;
                  DIR2=0;
                  EN2=0;
                  CP3=0;
                  DIR3=0;
                  EN3=0;
                 }
                 OUT1=0;
                 if(!IN1)
                 {
                  val=0003;           /
                  write_val();
                  display_graphic_16x8(28,1,xsadd[10],tab0);// 显示3
                  display_graphic_16x8(29,1,xsadd[3],tab0);//
                  EN1=0;
                 }
                 if(!IN2)
                 {
                 val=0002;           /
                  write_val();
                  display_graphic_16x8(28,1,xsadd[10],tab0);//  显示2
                  display_graphic_16x8(29,1,xsadd[2],tab0);//
                  DIR1=0;
                 }
                 if(!IN3)
                 {
                 val=0001;           /
                  write_val();
                  display_graphic_16x8(28,1,xsadd[10],tab0);//  显示1
                  display_graphic_16x8(29,1,xsadd[1],tab0);//
                  CP1=0;
                 }
                 if(!IN4)
                 {
                  display_graphic_16x8(28,1,xsadd[2],tab0);//  显示26
                  display_graphic_16x8(29,1,xsadd[6],tab0);//
                 }
                 if(!IN5)
                 {
                  display_graphic_16x8(28,1,xsadd[1],tab0);//  显示19
                  display_graphic_16x8(29,1,xsadd[9],tab0);//
                 }
                 if(!IN6)
                 {
                  val=0000;           /
                  write_val();
                  display_graphic_16x8(28,1,xsadd[1],tab0);//  显示15
                  display_graphic_16x8(29,1,xsadd[5],tab0);//
                 }
                 if(!IN7)
                 {                                           //显示11
                 displayGB2312(0XCA,0XD6);
                 fontchange();
                 display_chines_16x16(1,1,newbuff);     //手动     高速
                 displayGB2312(0XB6,0XAF);
                 fontchange();
                 display_chines_16x16(3,1,newbuff);
                 displayGB2312(0XB8,0XDF);
                 fontchange();
                 display_chines_16x16(5,1,newbuff);
                 displayGB2312(0XCB,0XD9);
                 fontchange();
                 display_chines_16x16(7,1,newbuff);
                 displayGB2312(0XB5,0XE3);             //点动操作
                 fontchange();
                 display_chines_16x16(1,17,newbuff);
                 displayGB2312(0XB6,0XAF);
                 fontchange();
                 display_chines_16x16(3,17,newbuff);
                 displayGB2312(0XB2,0XD9);
                 fontchange();
                 display_chines_16x16(5,17,newbuff);
                 displayGB2312(0XD7,0XF7);
                 fontchange();
                 display_chines_16x16(7,17,newbuff);
                 displayGB2312(0XBB,0XD8);            //回程序零
                 fontchange();
                 display_chines_16x16(1,33,newbuff);
                 displayGB2312(0XB3,0XCC);
                 fontchange();
                 display_chines_16x16(3,33,newbuff);
                 displayGB2312(0XD0,0XF2);
                 fontchange();
                 display_chines_16x16(5,33,newbuff);
                 displayGB2312(0XC1,0XE3);
                 fontchange();
                 display_chines_16x16(7,33,newbuff);
                 displayGB2312(0XBB,0XD8);            //回机械零
                 fontchange();
                 display_chines_16x16(1,49,newbuff);
                 displayGB2312(0XBB,0XFA);
                 fontchange();
                 display_chines_16x16(3,49,newbuff);
                 displayGB2312(0XD0,0XB5);
                 fontchange();
                 display_chines_16x16(5,49,newbuff);
                 displayGB2312(0XC1,0XE3);
                 fontchange();
                 display_chines_16x16(7,49,newbuff);
                 }
                 OUT1=1;
                 delay_nms(50);
                 OUT2=0;
                 if(!IN1)
                 {
                  display_graphic_16x8(28,1,xsadd[10],tab0);// 显示6  
                  display_graphic_16x8(29,1,xsadd[6],tab0);//
                  EN2=0;
                 }
                 if(!IN2)
                 {
                  display_graphic_16x8(28,1,xsadd[10],tab0);//  显示5
                  display_graphic_16x8(29,1,xsadd[5],tab0);//
                  DIR2=0;
                 }
                 if(!IN3)
                 {
                  uchar k_data,h_data,t_data,b_data; //
                  b_data=rd_24C64(10);delay_iic(200); // 个位
                  t_data=rd_24C64(11);delay_iic(200); // 十位
                  h_data=rd_24C64(12);delay_iic(200); // 百位
                  k_data=rd_24C64(13);delay_iic(200); // 千位
                  vals=k_data*1000+h_data*100+t_data*10+b_data;    
                  dis_val();
                  display_graphic_16x8(28,1,xsadd[10],tab0);//  显示4
                  display_graphic_16x8(29,1,xsadd[4],tab0);//
                  CP2=0;
                 }
                 if(!IN4)
                 {
                  display_graphic_16x8(28,1,xsadd[2],tab0);//   显示22
                  display_graphic_16x8(29,1,xsadd[2],tab0);//
                 }
                 if(!IN5)
                 {
                  display_graphic_16x8(28,1,xsadd[1],tab0);//   显示18
                  display_graphic_16x8(29,1,xsadd[8],tab0);//
                 }
                 if(!IN6)
                 {
                  display_graphic_16x8(28,1,xsadd[1],tab0);//   显示14
                  display_graphic_16x8(29,1,xsadd[4],tab0);//
                 }
                 if(!IN7)
                 {
                  display_graphic_16x8(28,1,xsadd[1],tab0);//     显示10
                  display_graphic_16x8(29,1,xsadd[0],tab0);//
                 }
                 OUT2=1;
                 delay_nms(50);
                 OUT3=0;
                 if(!IN1)
                 {
                  display_graphic_16x8(28,1,xsadd[10],tab0);//  显示9
                  display_graphic_16x8(29,1,xsadd[9],tab0);//
                  EN3=0;
                 }
                 if(!IN2)
                 {
                  display_graphic_16x8(28,1,xsadd[10],tab0);//     显示8
                  display_graphic_16x8(29,1,xsadd[8],tab0);//
                  DIR3=0;
                 }
                 if(!IN3)
                 {
                  display_graphic_16x8(28,1,xsadd[10],tab0);//      显示7
                  display_graphic_16x8(29,1,xsadd[7],tab0);//
                  CP3=0;
                 }
                 if(!IN4)
                 {
                  display_graphic_16x8(28,1,xsadd[2],tab0);//   显示21
                  display_graphic_16x8(29,1,xsadd[1],tab0);//
                 }
                 if(!IN5)
                 {
                 read_val();
                 dis_val();
                 display_graphic_16x8(28,1,xsadd[1],tab0);//  显示17
                 display_graphic_16x8(29,1,xsadd[7],tab0);//
                 }
                 if(!IN6)
                 {
                  display_graphic_16x8(28,1,xsadd[1],tab0);//  显示13
                  display_graphic_16x8(29,1,xsadd[3],tab0);//
                 }
                 OUT3=1;
                 delay_nms(50);
                 OUT4=0;
                 if(!IN1)
                 {
                  display_graphic_16x8(28,1,xsadd[2],tab0);// 显示24
                  display_graphic_16x8(29,1,xsadd[4],tab0);//
                 }
                 if(!IN2)
                 {
                  display_graphic_16x8(28,1,xsadd[10],tab0);//  显示0
                  display_graphic_16x8(29,1,xsadd[0],tab0);//
                 }
                 if(!IN3)
                 {
                  display_graphic_16x8(28,1,xsadd[2],tab0);//  显示23
                  display_graphic_16x8(29,1,xsadd[3],tab0);//
                 }
                 if(!IN4)
                 {
                  display_graphic_16x8(28,1,xsadd[2],tab0);//  显示20
                  display_graphic_16x8(29,1,xsadd[0],tab0);//
                 }
                 if(!IN5)
                 {
                  val=1236;
                  write_val();
                  display_graphic_16x8(28,1,xsadd[1],tab0);//  显示16
                  display_graphic_16x8(29,1,xsadd[6],tab0);//
                 }
                 if(!IN6)
                 {
                 InitLCD();
                 ClearScreen();
                 displayGB2312(0XB2,0XCE);          /*---参---*/
                 fontchange();
                 display_chines_16x16(1,1,newbuff);    
                 displayGB2312(0XCA,0XFD);           /*---数---*/
                 fontchange();
                 display_chines_16x16(3,1,newbuff);
                 displayGB2312(0XC9,0XE8);           /*---设---*/
                 fontchange();
                 display_chines_16x16(5,1,newbuff);
                 displayGB2312(0XB6,0XA8);           /*---定---*/
                 fontchange();
                 display_chines_16x16(7,1,newbuff);
                 dis_val();
                 }
                 OUT4=1;
                 delay_nms(50);            //INTPUT0
                 if(!INTPUT0)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[0],tab0);//     显示S0
                 }
                 if(!INTPUT1)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[1],tab0);//     显示S1
                 }
                 if(!INTPUT2)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[2],tab0);//     显示S2
                 }
                 if(!INTPUT3)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[3],tab0);//     显示S3
                 }
                 if(!INTPUT4)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[4],tab0);//     显示S4
                 }
                 if(!INTPUT5)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[5],tab0);//     显示S5
                 }
                 if(!INTPUT6)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[6],tab0);//     显示S6
                 }
                 if(!INTPUT7)
                 {
                 display_graphic_16x8(11,33,xsadd[14],tab0);//.
                 display_graphic_16x8(12,33,xsadd[7],tab0);//     显示S7
                 }
                }
               }