/*******两个输入信号同时输入判断,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