黄金会员
主题
回帖0
积分9861
阅读权限40
注册时间2009-11-11
最后登录1970-1-1
在线时间 小时
|
///*2011/10/10*///
///*WOSS1001*///
#include<reg52.h>
#define un8 unsigned char
#define un16 unsigned int
sbit e= P0^2;
sbit rs=P0^3;
un8 code TAB[]={"0123456789abcdef"};
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-65000)/256;
TL0=(65536-65000)%256;
TR0=1;
lcdinit();
while(1)
{
lcdcom(0X80);//第1行第1位
if(255==COUTER)
{
COUTER=99;
}
if(100==COUTER)
{
COUTER=0;
}
//lcddata('n');
lcddata(TAB[COUTER/10]);
lcddata(TAB[COUTER%10]);
}
//其他代码
}
////*********每65MS扫描一次键盘*******************////
void Timer0_interrupt() interrupt 1 using 2
{
un8 row,col,value,temp,n;
TH0=(65536-65000)/256;
TL0=(65536-65000)%256;
P3=0x0f;
row=P3&0x0f;
row=row&0x0f;
if((row!=0x0f)&&(temp=0x0f))
{
n++; //有按钮按下后N+1,65MS后再次检测按钮是否按着相当于按下消抖
}
else
{
n=0;
temp=row;
}
if(2==n) //稳定后
{
P3=0xf0;
col=P3&0xf0;
col=col&0xf0;
if(col!=0xf0)
{
value=row|col; //键值
switch (value)
{
case 0x77:COUTER++; //只作示范,按自己需要修改
break;
case 0x7b:COUTER++;
break;
case 0x7d:COUTER++;
break;
case 0x7e:COUTER++;
break;
case 0xb7:COUTER++;
break;
case 0xbb:COUTER++;
break;
case 0xbd:COUTER++;
break;
case 0xbe:COUTER++;
break;
case 0xd7:COUTER--;
break;
case 0xdb:COUTER--;
break;
case 0xdd:COUTER--;
break;
case 0xde:COUTER--;
break;
case 0xe7:COUTER--;
break;
case 0xeb:COUTER--;
break;
case 0xed:COUTER--;
break;
case 0xee:COUTER--;
break;
default: break;
}
temp=row;
}
}
}
////***************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--);
}
矩阵键盘.rar
(81.71 KB, 下载次数: 318)
|
|