#include "reg51.h"
#include "LCD1602.h"
//按鍵端口定義
sbit D0=P3^0;
sbit D1=P3^1;
sbit D2=P3^2;
sbit D3=P3^3;
sbit D4=P3^4;
sbit D5=P3^5;
sbit D6=P3^6;
sbit D7=P3^7;
//按鍵上LDE端口定義
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
sbit bg_1602=P2^4; //1602背光
sbit key=P2^0; //應答按鍵
sbit Beep=P2^3; //蜂鳴器
uchar jk,jk_1,jk_2,jk_3,jk_flag;
uchar jk_4,jk_5,jk_6,jk_7;
uchar q=0;
uchar flag=0;
bit flag_init=1;
uchar D0_1,D1_1,D2_1,D3_1;
uchar D4_1,D5_1,D6_1,D7_1;
uchar LCD[]=" 123456789 #########";
uchar qing_chu;
uint n;
//
//uc code tab0[]=" 123456789#"; //顯示幾號的碼表
//uc code tab1[]="Calling!!!"; //顯示呼叫的碼表
//uc code tab2[]="I Know!"; //顯示相應的碼表
//uc code tab3[]="Happy Every Day!"; //顯示開心快樂每一天的碼表
void LED_discode()
{
if(jk==1||jk_1==1||jk_2==1||jk_3==1||jk_4==1||jk_5==1||jk_6==1||jk_7==1) LED0=1;
else LED0=0;
if(jk==2||jk_1==2||jk_2==2||jk_3==2||jk_4==2||jk_5==2||jk_6==2||jk_7==2) LED1=1;
else LED1=0;
if(jk==3||jk_1==3||jk_2==3||jk_3==3||jk_4==3||jk_5==3||jk_6==3||jk_7==3) LED2=1;
else LED2=0;
if(jk==4||jk_1==4||jk_2==4||jk_3==4||jk_4==4||jk_5==4||jk_6==4||jk_7==4) LED3=1;
else LED3=0;
if(jk==5||jk_1==5||jk_2==5||jk_3==5||jk_4==5||jk_5==5||jk_6==5||jk_7==5) LED4=1;
else LED4=0;
if(jk==6||jk_1==6||jk_2==6||jk_3==6||jk_4==6||jk_5==6||jk_6==6||jk_7==6) LED5=1;
else LED5=0;
if(jk==7||jk_1==7||jk_2==7||jk_3==7||jk_4==7||jk_5==7||jk_6==7||jk_7==7) LED6=1;
else LED6=0;
if(jk==8||jk_1==8||jk_2==8||jk_3==8||jk_4==8||jk_5==8||jk_6==8||jk_7==8) LED7=1;
else LED7=0;
// if(jk!=1||jk_1!=1||jk_2!=1||jk_3!=1||jk_4!=1||jk_5!=1||jk_6!=1||jk_7!=1) LED0=0;
//
// if(jk!=2||jk_1!=2||jk_2!=2||jk_3!=2||jk_4!=2||jk_5!=2||jk_6!=2||jk_7!=2) LED1=0;
//
// if(jk!=3||jk_1!=3||jk_2!=3||jk_3!=3||jk_4!=3||jk_5!=3||jk_6!=3||jk_7!=3) LED2=0;
//
// if(jk!=4||jk_1!=4||jk_2!=4||jk_3!=4||jk_4!=4||jk_5!=4||jk_6!=4||jk_7!=4) LED3=0;
//
// if(jk!=5||jk_1!=5||jk_2!=5||jk_3!=5||jk_4!=5||jk_5!=5||jk_6!=5||jk_7!=5) LED4=0;
//
// if(jk!=6||jk_1!=6||jk_2!=6||jk_3!=6||jk_4!=6||jk_5!=6||jk_6!=6||jk_7!=6) LED5=0;
//
// if(jk!=7||jk_1!=7||jk_2!=7||jk_3!=7||jk_4!=7||jk_5!=7||jk_6!=7||jk_7!=7) LED6=0;
//
// if(jk!=8||jk_1!=8||jk_2!=8||jk_3!=8||jk_4!=8||jk_5!=8||jk_6!=8||jk_7!=8) LED7=0;
}
void LED_off()
{
}
void discode() //數據處理
{
if(D0==0||D1==0||D2==0||D3==0||D4==0||D5==0||D6==0||D7==0)
{
bg_1602=0; n=0;
D0_1=D0;
D1_1=D1;
D2_1=D2;
D3_1=D3;
D4_1=D4;
D5_1=D5;
D6_1=D6;
D7_1=D7;
while(D0==0||D1==0||D2==0||D3==0||D4==0||D5==0||D6==0||D7==0); //等待按鍵釋放
flag++;
if(flag>=9)
{
flag=8; //最多四個輸入
}
if(flag==1)
{
if(D0_1==0) { jk=1;}
if(D1_1==0) { jk=2;}
if(D2_1==0) { jk=3;}
if(D3_1==0) { jk=4;}
if(D4_1==0) { jk=5;}
if(D5_1==0) { jk=6;}
if(D6_1==0) { jk=7;}
if(D7_1==0) { jk=8;}
}
if(flag==2)
{
if(D0_1==0) { jk_1=1;}
if(D1_1==0) { jk_1=2;}
if(D2_1==0) { jk_1=3;}
if(D3_1==0) { jk_1=4;}
if(D4_1==0) { jk_1=5;}
if(D5_1==0) { jk_1=6;}
if(D6_1==0) { jk_1=7;}
if(D7_1==0) { jk_1=8;}
if(jk_1==jk)
{
jk_1=0;
flag--;
}
}
if(flag==3)
{
if(D0_1==0) { jk_2=1;}
if(D1_1==0) { jk_2=2;}
if(D2_1==0) { jk_2=3;}
if(D3_1==0) { jk_2=4;}
if(D4_1==0) { jk_2=5;}
if(D5_1==0) { jk_2=6;}
if(D6_1==0) { jk_2=7;}
if(D7_1==0) { jk_2=8;}
if(jk_2==jk||jk_2==jk_1)
{
jk_2=0;
flag--;
}
}
if(flag==4)
{
if(D0_1==0) { jk_3=1;}
if(D1_1==0) { jk_3=2;}
if(D2_1==0) { jk_3=3;}
if(D3_1==0) { jk_3=4;}
if(D4_1==0) { jk_3=5;}
if(D5_1==0) { jk_3=6;}
if(D6_1==0) { jk_3=7;}
if(D7_1==0) { jk_3=8;}
if(jk_3==jk||jk_3==jk_2||jk_3==jk_1)
{
jk_3=0;
flag--;
}
}
if(flag==5)
{
if(D0_1==0) { jk_4=1;}
if(D1_1==0) { jk_4=2;}
if(D2_1==0) { jk_4=3;}
if(D3_1==0) { jk_4=4;}
if(D4_1==0) { jk_4=5;}
if(D5_1==0) { jk_4=6;}
if(D6_1==0) { jk_4=7;}
if(D7_1==0) { jk_4=8;}
if(jk_4==jk||jk_4==jk_2||jk_4==jk_1||jk_4==jk_3)
{
jk_4=0;
flag--;
}
}
if(flag==6)
{
if(D0_1==0) { jk_5=1;}
if(D1_1==0) { jk_5=2;}
if(D2_1==0) { jk_5=3;}
if(D3_1==0) { jk_5=4;}
if(D4_1==0) { jk_5=5;}
if(D5_1==0) { jk_5=6;}
if(D6_1==0) { jk_5=7;}
if(D7_1==0) { jk_5=8;}
if(jk_5==jk||jk_5==jk_2||jk_5==jk_1||jk_5==jk_3||jk_5==jk_4)
{
jk_5=0;
flag--;
}
}
if(flag==7)
{
if(D0_1==0) { jk_6=1;}
if(D1_1==0) { jk_6=2;}
if(D2_1==0) { jk_6=3;}
if(D3_1==0) { jk_6=4;}
if(D4_1==0) { jk_6=5;}
if(D5_1==0) { jk_6=6;}
if(D6_1==0) { jk_6=7;}
if(D7_1==0) { jk_6=8;}
if(jk_6==jk||jk_6==jk_2||jk_6==jk_1||jk_6==jk_3||jk_6==jk_5||jk_6==jk_4)
{
jk_6=0;
flag--;
}
}
if(flag==8)
{
jk_flag=jk_7;
if(D0_1==0) { jk_7=1;}
if(D1_1==0) { jk_7=2;}
if(D2_1==0) { jk_7=3;}
if(D3_1==0) { jk_7=4;}
if(D4_1==0) { jk_7=5;}
if(D5_1==0) { jk_7=6;}
if(D6_1==0) { jk_7=7;}
if(D7_1==0) { jk_7=8;}
if(jk_7==jk||jk_7==jk_2||jk_7==jk_1||jk_7==jk_3||jk_7==jk_4||jk_7==jk_5||jk_7==jk_6)
{
jk_7=jk_flag;
flag--;
}
}
}
}
void display()
{
discode();
if(D0_1==1&&D1_1==1&&D2_1==1&&D3_1==1&&D4_1==1&&D5_1==1&&D6_1==1&&D7_1==1&&flag==0)
{
LCD1602_write(0,0x80);
LCD1602_writebyte("Happy Every Day!");
LCD1602_write(0,0x40);
LCD1602_writebyte(" ");
flag_init=1;
}
else
{
if(flag_init==1)
{
flag_init=0;
LCD1602_write(0,0x01);
} LCD1602_write(0,0x80); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x81); LCD1602_write(1,LCD[jk]);
LCD1602_write(0,0x82); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x83); LCD1602_write(1,LCD[jk_1]);
LCD1602_write(0,0x84); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x85); LCD1602_write(1,LCD[jk_2]);
LCD1602_write(0,0x86); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x87); LCD1602_write(1,LCD[jk_3]);
LCD1602_write(0,0x88); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x89); LCD1602_write(1,LCD[jk_4]);
LCD1602_write(0,0x8A); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x8B); LCD1602_write(1,LCD[jk_5]);
LCD1602_write(0,0x8C); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x8D); LCD1602_write(1,LCD[jk_6]);
LCD1602_write(0,0x8E); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x8F); LCD1602_write(1,LCD[jk_7]);
// LCD1602_write(0,0x8A); LCD1602_write(1,LCD[jk_3]);
}
}
void key_discode()
{
if(key==0)
{
LCD1602_delay(100);
if(key==0)
{ bg_1602=0; n=0;
while(key==0);
if(flag>0)
{
flag--;
jk=jk_1;
jk_1=jk_2;
jk_2=jk_3;
jk_3=jk_4;
jk_4=jk_5;
jk_5=jk_6;
jk_6=jk_7;
jk_7=0;
LCD1602_write(0,0x80); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x81); LCD1602_write(1,LCD[jk]);
LCD1602_write(0,0x82); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x83); LCD1602_write(1,LCD[jk_1]);
LCD1602_write(0,0x84); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x85); LCD1602_write(1,LCD[jk_2]);
LCD1602_write(0,0x86); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x87); LCD1602_write(1,LCD[jk_3]);
LCD1602_write(0,0x88); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x89); LCD1602_write(1,LCD[jk_4]);
LCD1602_write(0,0x8A); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x8B); LCD1602_write(1,LCD[jk_5]);
LCD1602_write(0,0x8C); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x8D); LCD1602_write(1,LCD[jk_6]);
LCD1602_write(0,0x8E); LCD1602_write(1,LCD[0]);
LCD1602_write(0,0x8F); LCD1602_write(1,LCD[jk_7]);
LCD1602_write(0,0xC0);
LCD1602_writebyte(" I Know! ");
q=1; qing_chu=0;
}
if(flag==0)
{
D0_1=D1_1=D2_1=D3_1=1;
D4_1=D5_1=D6_1=D7_1=1;
}
}
}
}
void main()
{
LCD1602_cls();
TMOD=0x01; //定時器0工作方式1
TH0=0x4b;
TL0=0xff; //賦初值
EA=1; //開總中斷
ET0=1; //定時器中斷開
TR0=1; //打開定時器
P1=0x00;
bg_1602=0; //打開背光燈
Beep=1;
n=0;
D0_1=D1_1=D2_1=D3_1=1;
D4_1=D5_1=D6_1=D7_1=1;
while(1)
{
LED_discode();
display(); //顯示函數
key_discode(); //
}
}
void T0_time() interrupt 1
{
uint m;
TH0=0x3c;
TL0=0xb0; //重新賦初值 50ms
m++;
if(m==20)
{
m=0;
if(flag>0) //如果有呼叫時開啟蜂鳴器
Beep=~Beep; //蜂鳴器打開
else Beep=1; //蜂鳴器關閉
}
n++;
qing_chu++;
if(qing_chu%20==0)
{
if(q==1)
{ q=0;
LCD1602_write(0,0xC0); //如果按下清除按鍵,
LCD1602_writebyte(" ");
}
}
if(n>200)
{
if(bg_1602==0)
{ n=0;
bg_1602=1;
}
|