?? 111.c
字號:
/*********************程序功能*********************/
/******************第一行顯示鍵碼******************/
/****************第二行顯示總按鍵數(shù)****************/
/*******當(dāng)按鍵超過1.5秒時總數(shù)加一并提示警告********/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P1^5;
sbit ST=P1^4;
sbit SH=P1^3;
sbit DS2=P1^2;
sbit ST2=P1^1;
sbit SH2=P1^0;
uchar key,temp,num=0;
uchar g=0x30,s=0x30,b=0x30,q=0x30;
uchar code table[]=
"0123456789ABCDEF";
uchar code table1[]=
"warnning!!!";
uchar code table2[]=
"it is rignt";
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
/*液晶數(shù)據(jù)端寫入函數(shù)(即第一個595)*/
void date_input(uchar date)
{
uchar temp;
uchar i;
for(i=0;i<8;i++)
{
temp=date&(_cror_(0x80,i));
if(temp==0)
{
DS=0;
SH=0;
SH=1;
// delay(20); //5ms
}
else
{
DS=1;
SH=0;
SH=1;
// delay(20);
}
}
ST=0;
ST=1;
// delay(20);
}
/*液晶控制端寫入函數(shù)(即第二個595)*/
void control_input(uchar date1)
{
uchar temp1;
uchar i;
for(i=0;i<8;i++)
{
temp1=date1&(_cror_(0x80,i));
if(temp1==0)
{
DS2=0;
SH2=0;
SH2=1;
// delay(20);
}
else
{
DS2=1;
SH2=0;
SH2=1;
// delay(20);
}
}
ST2=0;
ST2=1;
// delay(20);
}
/*液晶寫指令函數(shù)*/
void write_com(uchar date2)
{
control_input(0x00);
date_input(date2);
delay(20); //5ms
control_input(0x40);
delay(50); //11.7ms
control_input(0x00);
}
/*液晶寫數(shù)據(jù)函數(shù)*/
void write_date(uchar date3)
{
control_input(0x10);
date_input(date3);
delay(20); //5ms
control_input(0x50);
delay(50); //11.7ms
control_input(0x10);
}
/*液晶初始化函數(shù)*/
void init()
{
write_com(0x38);
delay(20);
write_com(0x0f);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
/*鍵碼顯示函數(shù)*/
void display(uchar num1)
{
write_com(0x80);
delay(20);
write_date(table[num1]);
}
/*按鍵次數(shù)顯示函數(shù)*/
void display1()
{
write_com(0xc0);
delay(20);
write_date(q);
write_date(b);
write_date(s);
write_date(g);
}
/*按鍵超過1.5S時顯示警告函數(shù)*/
void display2()
{
uchar i;
write_com(0x83);
for(i=0;i<11;i++)
{
write_date(table1[i]);
}
}
/*鍵盤掃描函數(shù)*/
void key_scan()
{
uchar i;
P0=0Xef;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(50); //10ms(去抖動)
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e: key=1;
break;
case 0x0d: key=2;
break;
case 0x0b: key=3;
break;
case 0x07: key=4;
break;
}
while(P0!=0XEF)
{
/*開定時器1,當(dāng)延時到達(dá)1.5秒時顯示警告*/
EA=1;
ET1=1;
TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(P0!=0XEF); //松手時關(guān)中斷,并消除警告顯示正確
num=0; //松手時num清0
EA=0;
write_com(0x83);
for(i=0;i<11;i++)
{
write_date(table2[i]); //按鍵不超過1.5S(正常情況)或松手時,顯示it is right
}
}
}
}
P0=0Xdf;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(50);
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e: key=5;
break;
case 0x0d: key=6;
break;
case 0x0b: key=7;
break;
case 0x07: key=8;
break;
}
while(P0!=0XDF)
{
EA=1;
ET1=1;
TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(P0!=0XDF);
num=0;
EA=0;
write_com(0x83);
for(i=0;i<11;i++)
{
write_date(table2[i]);
}
}
}
}
P0=0Xbf;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(50);
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e: key=9;
break;
case 0x0d: key=10;
break;
case 0x0b: key=11;
break;
case 0x07: key=12;
break;
}
while(P0!=0XBF)
{
EA=1;
ET1=1;
TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(P0!=0XBF);
num=0;
EA=0;
write_com(0x83);
for(i=0;i<11;i++)
{
write_date(table2[i]);
}
}
}
}
P0=0X7f;
temp=P0;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(50);
if(temp!=0x0f)
{
switch(temp)
{
case 0x0e: key=13;
break;
case 0x0d: key=14;
break;
case 0x0b: key=15;
break;
case 0x07: key=16;
break;
}
while(P0!=0X7F)
{
EA=1;
ET1=1;
TMOD=0X10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(P0!=0X7F);
num=0;
EA=0;
write_com(0x83);
for(i=0;i<11;i++)
{
write_date(table2[i]);
}
}
}
}
}
void main()
{
init();
while(1)
{
key_scan();
if(key!=0) //當(dāng)有鍵按下時才進行一次液晶顯示
{
display(key-1);
g++;
if(g>0x39)
{
g=0x30;
s++;
}
if(s>0x39)
{
s=0x30;
b++;
}
if(b>0x39)
{
b=0x30;
q++;
}
display1();
key=0; //顯示1次后key清0,防止液晶不停顯示
}
}
}
void time1() interrupt 4
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num++;
if(num==30) //延時50ms*30=1.5s
{
num=0;
g++;
if(g>0x39)
{
g=0x30;
s++;
}
if(s>0x39)
{
s=0x30;
b++;
}
if(b>0x39)
{
b=0x30;
q++;
}
display1();
display2();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -