您的位置:首页 > 科技 > IT业 > 两个输入信号同时输入判断

两个输入信号同时输入判断

2024/11/19 17:40:39 来源:https://blog.csdn.net/czhaii/article/details/139725647  浏览:    关键词:两个输入信号同时输入判断

/*******两个输入信号同时输入判断,2019 4 6**********/
/*******桥架机AB系统拉拔选择其中一个先拉进位置*****/
/***AB都在等待区A先前进,B在等待区A在中间B先前进****/
/***其中一个不在等待区拉拔后退PAST L259 CODE640****/
               #include      <REG52.H>
               #include      <intrins.H>
               #define       uint unsigned int  
               #define       uchar unsigned char
               uchar         code disdt[11]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xa3};
               sbit          CS=P1^2;             //  12864PIN4     vala显示缓冲valb加减时间处理缓冲
               sbit          SID=P1^3;           //     12864PIN5
               sbit          SCLK=P1^4;             //     12864PIN6
               sbit          key1=P3^2;         //     设置按键
               sbit          key2=P1^7;         //
               uchar         k;
               uchar         kcounter;             //按键计数器
               uchar         counter;              //手动按键检测计数器
               uchar         kstatus;              //状态寄存器
               bit           A_Flag;               //A按键按下标志
               bit           B_Flag;               //B按键按下标志
               bit           Chuange_Flag;           //按键输入更新标志
               uchar         AB_Flag;               //按键输入编号标记
/*------------------延时子程序------------------------*/
               void delay(unsigned int t)
               {
                uint i,j;
                for(i=0;i<t;i++)
                for(j=0;j<500;j++);
               }
/*------------------延时子程序------------------------*/
               void delay_1ms(uint x)
               {
               int i, j;
               for(i=0;i<x;i++)
               for(j=0;j<1500;j++);
               }                
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               delay(10);                        //延时                  
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               delay(10);                        //延时
               }
/*------------------写命令到LCD-----------------------*/
               void write_com(unsigned char cmdcode)
               {
               uchar i;
               uchar i_data,temp_data1,temp_data2;
               EA=0;
               i_data=0xf8;
               delay_1ms(10);
               CS=1;
               SCLK=0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=cmdcode;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=cmdcode;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               EA=1;
               }
/*-------------------写数据到LCD----------------------*/
               void write_data(unsigned char Dispdata)
               {
               uchar i;
               uchar i_data,temp_data1,temp_data2;
               EA=0;
               i_data=0xfa;
               delay_1ms(10);
               CS=1;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               EA=1;
               }
/*------------------初始化LCD屏-----------------------*/
               void lcd_init()
               {
               uchar comdata;
               delay_1ms(100);
               comdata=0x30;
               write_com(comdata); /*功能设置:一次送8位数据,基本指令集*/
               comdata=0x04;
               write_com(comdata); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
               comdata=0x0f;
               write_com(comdata); /*显示设定:开显示,显示光标,当前显示位反白闪动*/
               comdata=0x01;
               write_com(comdata); /*清DDRAM*/
               comdata=0x02;
               write_com(comdata); /*DDRAM地址归位*/
               comdata=0x80;
               write_com(comdata); /*把显示地址设为0X80,即为第一行的首位*/
               }
/***********************************/
               void ABpositionCalculation()
               {
               Chuange_Flag=0;                     //复位更新标志
               if(A_Flag==0&&B_Flag==0)            // 0 0
               AB_Flag=1;
               else  if(A_Flag==0&&B_Flag==1)    // 0 1
               AB_Flag=2;
               else  if(A_Flag==1&&B_Flag==0)    // 1 0
               AB_Flag=3;
               else  if(A_Flag==1&&B_Flag==1)    // 1 1
               AB_Flag=4;
               A_Flag=1;
               B_Flag=1;
               }
/***********************************/
               void Dis_Lcd()
               {
                if(AB_Flag==1)
                {
                write_com(0X82);
                write_data(0xA3);                /**/
                write_data(disdt[1]);            /**/
                }
                else if(AB_Flag==2)
                {
                write_com(0X82);
                write_data(0xA3);                /**/
                write_data(disdt[2]);            /**/
                }
                else if(AB_Flag==3)
                {
                write_com(0X82);
                write_data(0xA3);                /**/
                write_data(disdt[3]);            /**/
                }
                else if(AB_Flag==4)
                {
                write_com(0X82);
                write_data(0xA3);                /**/
                write_data(disdt[4]);            /**/
                }
               }
/*------------------主循环程序----------------*/      
               void   main( )                    /*主程序开始*/
               {
               delay(5000);
               lcd_init();                       /*液晶复位*/
               A_Flag=1;                         //A输入信号
               B_Flag=1;                         //B输入信号
               Chuange_Flag=1;                     //更新标志
               while(1)
               {
                RstKey();
                for(;kcounter<5;)                //按键循环5次
                {
                 if(!key1)                       //低电平
                 {
                 LowVoltKey();                   //按键计数器状态标志加一
                 }
                 else if(~!key1)                 //按键高电平
                 {
                 HighVoltKey();                  //按键计数器加一 状态标志归零
                 }
                 if(kstatus>=3)  
                 {
                 Chuange_Flag=1;
                 A_Flag=0;
                 write_com(0X92);
                 write_data(0xA3);               /**/
                 write_data(disdt[1]);           /**/
                 }
                }
                RstKey();
                for(;kcounter<5;)                //按键循环5次
                {
                 if(!key2)                       //低电平
                 {
                 LowVoltKey();                   //按键计数器状态标志加一
                 }
                 else if(~!key2)                 //按键高电平
                 {
                 HighVoltKey();                  //按键计数器加一 状态标志归零
                 }
                 if(kstatus>=3)  
                 {
                 Chuange_Flag=1;
                 B_Flag=0;
                  write_com(0X93);
                 write_data(0xA3);               /**/
                 write_data(disdt[2]);           /**/
                 }
                }
                if(Chuange_Flag==1)                 //更新标志等于1,有键按下更新计算和显示
               {
                ABpositionCalculation();         //计算
                Dis_Lcd();                         //显示
               }
               }
              }                                     //L259 CODE640

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com