黄金会员
主题
回帖0
积分9861
阅读权限40
注册时间2009-11-11
最后登录1970-1-1
在线时间 小时
|
#include<reg52.h>
#define un8 unsigned char
#define un16 unsigned int
sbit Press_key = P2^0;//按键的I/O
sbit Press_key1 = P3^4;
un8 bdata Control_Port; // 声明一个可位寻址的字节变量
sbit new_value = Control_Port^1; // 引用该字节变量的某一位
sbit old_value = Control_Port^2;
sbit new_value1 = Control_Port^3; // 引用该字节变量的某一位
sbit old_value1 = Control_Port^4;
sbit led=P1^0;
sbit e= P0^2;
sbit rs=P0^3;
un8 code TAB[]={"0123456789"};
void lcdinit(); //1602初始化
void lcdcom(un8 com); //1602写指令
void lcddata(un8 dat); //1602写数据
void Delay(un8 xms);
void Delay1(un16 xus);
un8 COUTER=0;
////*********************////
main()
{
EA=1;
ET0=1;
TMOD|=0X01;
TH0=(65536-60536)/256;
TL0=(65536-60536)%256;
TR0=1;
//old_value=1;
// old_value1=1;
lcdinit();
//lcdcom(0X82);//第1行第3位
while(1)
{
lcdcom(0X80);//第1行第3位
lcddata('n');
lcddata(TAB[COUTER/10]);
lcddata(TAB[COUTER%10]);
}
//其他代码
}
/*void P_key() //按下后松开有效
{
new_value =Press_key;
if(new_value && !old_value)//识别按键。
{
led=~led;
}
old_value = new_value;
} */
////**************************************////
void Timer0_interrupt() interrupt 1 using 2
{
un8 ban,can;
TH0=(65536-65500)/256;
TL0=(65536-65500)%256;
////////////////////////////////////////////////////
new_value =Press_key;
if(!new_value && old_value)//识别按键。(按下即有效)
{
COUTER++;
if(100==COUTER)
{
COUTER=0;
}
}
old_value = new_value;
//短按减1,长按按下后先减1,按下超过25X65.5MS后每4x65.5MS减1//
new_value1 =Press_key1;
if(!new_value1 && old_value1)//短按立即有效.
{
COUTER--;
can=0;
if(255==COUTER)
{
COUTER=99;
}
}
if(!new_value1&&!old_value1) //按下未松开则每65,5MS can+1
{
can++;
if(can>25)
{
ban++;
if(4==ban)
{
ban=0;
COUTER--;
if(255==COUTER)
{
COUTER=99;
}
}
}
}
old_value1 = new_value1;
}
////***************Lcd初始化****************************////
void lcdinit()
{
Delay(15);
lcdcom(0x33);
Delay(5) ;
lcdcom(0x32);
Delay(2);
lcdcom(0x2); //4线模式
Delay(1);
lcdcom(0x06); //地址增量1,字符不动
lcdcom(0x0C); //显示开,光标关,光标不闪
lcdcom(0x28);
lcdcom(0x01); //清屏
Delay(5);
lcdcom(0x02); //光标复位
}
////*********LCD写指令***********/////
void lcdcom(un8 com)
{
//un8 temp;
// temp=com;
P0=com|0x0f; //不需要前面两条,因为COM的值未变
rs=0;
Delay1(2);
e=1;
Delay1(2);
e=0;
//com=temp;
P0=(com<<4)|0x0f;
rs=0;
Delay1(2);
e=1;
Delay1(2);
e=0;
}
////*****************LCD写数据**************////
void lcddata(un8 dat)
{
// un8 temp1;
// temp1=dat;
P0=dat|0x0f;
rs=1;
Delay1(2);
e=1;
Delay1(2);
e=0;
// dat=temp1;
P0=(dat<<4)|0x0f;
rs=1;
Delay1(2);
e=1;
Delay1(2);
e=0;
}
////************************////
void Delay(un8 xms)
{
un8 i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
////**********************////
void Delay1(un16 xus)
{
un16 i,j;
for(i=xus;i>0;i--)
for(j=25;j>0;j--);
}
key1好.rar
(53.53 KB, 下载次数: 492)
|
|