#include #include #include #define uchar unsigned char #define uint unsigned int #define LCD_data P0 uchar code tabb[]={"开机时间: 秒"}; uchar code tabc[]={"关机时间: 秒"}; uchar code tabd[]={"开关次数: "}; uchar code tabe[]={"0123456789"}; //根据按键硬件连接定义按键键值 #define KEY_VALUE_1 0x0e #define KEY_VALUE_2 0x0d #define KEY_VALUE_3 0x0b #define KEY_VALUE_4 0x07 #define KEY_NULL 0x0f //定义长按键的TICK数,以及连_发间隔的TICK数 #define KEY_LONG_PERIOD 100 #define KEY_CONTINUE_PERIOD 10 //定义按键返回值状态(按下,长按,连_发,释放) #define KEY_DOWN 0x80 #define KEY_LONG 0x40 #define KEY_CONTINUE 0x20 #define KEY_UP 0x10 //定义按键状态 #define KEY_STATE_INIT 0 #define KEY_STATE_WOBBLE 1 #define KEY_STATE_PRESS 2 #define KEY_STATE_LONG 3 #define KEY_STATE_CONTINUE 4 #define KEY_STATE_RELEASE 5 sbit cs=P2^3; sbit sid=P2^4; sbit sclk=P2^5; sbit PSB=P2^6; sbit key1=P1^0; sbit io_key_1 = P1^1 ; sbit io_key_2 = P1^2 ; //sbit key2=P1^1; //sbit key3=P1^2; sbit key4=P1^3; sbit led=P1^4;//控制输出脚 sbit led1=P1^5;//指示灯 uchar a,flga,flga1,flga2,flga3,flga4; uchar ge,shi,bai,qian,wuan,num,num1,num2,num4,flga5,num5,num6,num7; uchar open_time,closing_time,time_off,time_on;//开关时间 uint count,num3,time_count;//开关次数 void delay(uint a) { uchar x,y; for(x=a;x>0;x--) for(y=110;y>0;y--); } static uint KeyScan(void) { if(io_key_1 == 0)return KEY_VALUE_1 ; //按键1按下返回 0x0e if(io_key_2 == 0)return KEY_VALUE_2 ; //按键2按下返回 0x0d //if(io_key_3 == 0)return KEY_VALUE_3 ; //按键3按下返回 0x0b //if(io_key_4 == 0)return KEY_VALUE_4 ; //按键4按下返回 0x07 return KEY_NULL ; //无按键按下返回 0x0f } uint GetKey() { static uint s_u8KeyState = KEY_STATE_INIT ; static uint s_u8KeyTimeCount = 0 ; static uint s_u8LastKey = KEY_NULL ; //保存按键释放时候的键值 uint KeyTemp = KEY_NULL ; // KEY_DOWN 0x80 // KEY_LONG 0x40 // KEY_CONTINUE 0x20 // KEY_UP 0x10 KeyTemp = KeyScan() ; //获取键值 switch(s_u8KeyState) { case KEY_STATE_INIT : //标置位0 { if(KEY_NULL != (KeyTemp)) //有按键按下则执行 { s_u8KeyState = KEY_STATE_WOBBLE ; //将标置位置1 } } break ; case KEY_STATE_WOBBLE : //消抖 { s_u8KeyState = KEY_STATE_PRESS ; } break ; case KEY_STATE_PRESS : { if(KEY_NULL != (KeyTemp)) { s_u8LastKey = KeyTemp ; //保存键值,以便在释放按键状态返回键值 KeyTemp |= KEY_DOWN ; //按键按下 s_u8KeyState = KEY_STATE_LONG ; } else { s_u8KeyState = KEY_STATE_INIT ; } } break ; case KEY_STATE_LONG : { if(KEY_NULL != (KeyTemp)) { if(++s_u8KeyTimeCount > KEY_LONG_PERIOD) { s_u8KeyTimeCount = 0 ; KeyTemp |= KEY_LONG ; //长按键事件发生 s_u8KeyState = KEY_STATE_CONTINUE ; } } else { s_u8KeyState = KEY_STATE_RELEASE ; } } break ; case KEY_STATE_CONTINUE : { if(KEY_NULL != (KeyTemp)) { if(++s_u8KeyTimeCount > KEY_CONTINUE_PERIOD) { s_u8KeyTimeCount = 0 ; KeyTemp |= KEY_CONTINUE ; } } else { s_u8KeyState = KEY_STATE_RELEASE ; } } break ; case KEY_STATE_RELEASE : { s_u8LastKey |= KEY_UP ; KeyTemp = s_u8LastKey ; s_u8KeyState = KEY_STATE_INIT ; } break ; default : break ; } return KeyTemp ; //返回键值 } void send_command(uchar command_data) { uchar i; uchar date; date=0xf8;//发送写指令码 cs=1; sclk=0; for(i=0;i<8;i++)//发送第一个字节(指令码); { sid=(bit)(date&0x80); /***************************************************************************** 比如i=0时,tab[i]的值为0x3f,那么这句bit_dat((bit)(tab[i]&0x80));的作用是: 第一步:tab[i]与0x80作位与,即0x3f与0x80作位与(与0x40相位与就是取了第6位), 这样的效果是取得了0x3f的最高位(第7位),其它位全部被屏蔽为0。 第二步:作int向bit强制转换,向bit转换有一个规则,只要待转换前变量是非零, 转换后的bit类型变量即为1,否则为0,这里,0x3f&0x80的结果为0,也就是((bit)(tab[i]&0x80)) 的结果为0。 第三步:调用bit_dat函数,向外设写入这一位。 后面的(bit_dat((bit)(tab[i]&0x40))句子就是取次高位,后面的依此类推,就可以从高位取到低位了。 ************************************************************************************/ sclk=0; sclk=1; date=date<<1; } date=command_data; date&=0xf0; for(i=0;i<8;i++) { sid=(bit)(date&0x80); sclk=0; sclk=1; date=date<<1; } date=command_data; date<<=4; for(i=0;i<8;i++) { sid=(bit)(date&0x80); sclk=0; sclk=1; date=date<<1; } cs=0; delay(10); } void send_data(uchar command_data) { uchar i; uchar date; date=0xfa; cs=1; sclk=0; for(i=0;i<8;i++) { sid=(bit)(date&0x80); sclk=0; sclk=1; date=date<<1; } date=command_data; date&=0xf0; for(i=0;i<8;i++) { sid=(bit)(date&0x80); sclk=0; sclk=1; date=date<<1; } date=command_data; date<<=4; for(i=0;i<8;i++) { sid=(bit)(date&0x80); sclk=0; sclk=1; date=date<<1; } cs=0; delay(10); } void init() { delay(100); PSB=0; delay(1); send_command(0x30); send_command(0x0C); send_command(0x01); send_command(0x02); send_command(0x80); } void opentime() { if(io_key_1==0) { delay(5); if(io_key_1==0) { open_time++; if(open_time>=61)open_time=0; } send_command(0X87); send_data('<'); while(io_key_1!=1); } if(io_key_2==0) { delay(5); if(io_key_2==0) { if(open_time<=0)open_time=61; open_time--; } while(io_key_2!=1); } } void closingtime() { if(io_key_1==0) { delay(5); if(io_key_1==0) { closing_time++; if(closing_time>=61)closing_time=0; } while(io_key_1!=1); } if(io_key_2==0) { delay(5); if(io_key_2==0) { if(closing_time<=0)closing_time=61; closing_time--; } while(io_key_2!=1); } } void Count_add() { uint KeyValue = KEY_NULL; uint temp = 0 ; KeyValue=GetKey(); KeyValue&=KeyValue; if(KeyValue == (KEY_VALUE_1 | KEY_DOWN)) { count++; if(count>=20001)count=0; } if(KeyValue == (KEY_VALUE_1 | KEY_LONG));//{ P1=0xfd;} if(KeyValue == (KEY_VALUE_1 | KEY_CONTINUE)) { count=count+10; if(count>=20001)count=0; } if(KeyValue == (KEY_VALUE_1 | KEY_UP));//{P1=0x0f; } if(KeyValue == (KEY_VALUE_2 | KEY_DOWN)) {if(count<1)count=20001;count--; } if(KeyValue == (KEY_VALUE_2 | KEY_LONG));//{ P1=0xfd;} if(KeyValue == (KEY_VALUE_2 | KEY_CONTINUE)) {if(count<=10)count=20010;count=count-10; } if(KeyValue == (KEY_VALUE_2 | KEY_UP));//{P1=0x0f; } /************************************************ if(io_key_1==0) { delay(5); if(io_key_1==0) { count++; if(count>=20001)count=0; } while(io_key_1!=1); } if(io_key_2==0) { delay(5); if(io_key_2==0) { if(count<=0)count=20001; count--; } while(io_key_2!=1); } **********************************************/ } void time_init() { TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET0=1; ET1=1; //TR0=1; TR1=0; } void main() { led=0; init(); time_init(); send_command(0X80); for(a=0;a<14;a++) { send_data(tabb[a]); } send_command(0X90); for(a=0;a<14;a++) { send_data(tabc[a]); } send_command(0X88); for(a=0;a<9;a++) { send_data(tabd[a]); } while(1) { if(count>1) { if(time_count<=0) { if(time_off<=0)time_off=open_time; if(time_on<=0)time_on=closing_time; time_count=time_off+time_on; } else if(num7==1) { time_off=open_time; time_on=closing_time; time_count=time_off+time_on; } } if(num5==1) { if(key4==0) { delay(5); if(key4==0) { flga5++; if(flga5>=2)flga5=0; } while(key4!=1); } if(count<=1){flga5=0;led=0;count=0;} if(closing_time<=0)flga5=0; if(open_time<=0)flga5=0; switch(flga5) { case 0:TR0=0;break; case 1:TR0=1;break;// default:break; } } else TR0=0; if(key1==0) { delay(5); if(key1==0) { flga++; if(flga>=4)flga=0; } while(key1!=1); } switch(flga) { case 0:num=0;num1=0;num2=0;num5=1;num7=0;break; case 1:opentime();num1=1;num2=0;num5=0;num7=1;flga5=0;led1=1;led=0;break;// case 2:closingtime();num1=0;num2=1;break;// case 3:Count_add();num=1;num1=0;num2=0;break;// default:break; } send_command(0X85); shi=open_time/10; ge=open_time%10; send_data(tabe[shi]); send_data(tabe[ge]); if(num1==1) { send_command(0X87); send_data('<'); } else { send_command(0X87); send_data(' '); } send_command(0X95); shi=closing_time/10; ge=closing_time%10; send_data(tabe[shi]); send_data(tabe[ge]); if(num2==1) { send_command(0X97); send_data('<'); } else { send_command(0X97); send_data(' '); } send_command(0X8d); wuan=count/10000; qian=count%10000/1000; bai=count%1000/100; shi=count%100/10; ge=count%10; send_data(tabe[wuan]); send_data(tabe[qian]); send_data(tabe[bai]); send_data(tabe[shi]); send_data(tabe[ge]); if(num==1) { send_data('<'); } else send_data(' '); shi=time_count/10; ge=time_count%10; send_command(0X98); send_data(tabe[shi]); send_data(tabe[ge]); } } void T0_time()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num6++; if(num6>=10) { num6=0; num4++; led1=~led1; if(num4>=2) { num4=0; time_count--; if(time_count>time_on)led=0; else if(time_count