|
用中断的方式,有键按下进中断扫描键盘。P1口先置为0x0f,为中断准备。中断后P1口置0xff(关键是这里,中断进去后没用,不知道怎么办),然后扫描键盘。
下面是程序:
#include
#include
#include
#include
#define COM8155 XBYTE[0xff20] //8155控制口地址
#define PA XBYTE[0xff21] //8155A口地址
#define PB XBYTE[0xff22] //8155B口地址
sbit LED=P3^0;
sbit LOUD=P3^5; //报警器脉冲
unsigned code seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示段位
unsigned dispbuf[8]={0}; //显示缓存
unsigned dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数位扫描
unsigned code Pwd[8]={0};
unsigned int i=0; //第几次按键
unsigned char key,k=0,dispcount=0;
/****************************************************/
void led()
{
PA=seg[key];
PB=dispbit[k];
k++;
if (k==7)
k=0;
dispcount++;
}
/*******************************************************************
/*函数名:bi
/*功 能:喇叭发声
/*参 数:t
******************************************************************/
void bi(unsigned long t)
{
unsigned long c;
unsigned int n;
for(c=0;c
{
for(n=0;n<50;n++); //延时
LOUD=~LOUD; //取反输出到喇叭的信号
}
}
/******************************************************************
/*函数名:lamp
******************************************************************/
void lamp(unsigned long l)
{
unsigned char c;
for(c=0;c
LED=1;
}
/*****************************************************************
/*函数名:KeyInt
/*功 能:4*4键盘扫描
*****************************************************************/
void KeyInt() interrupt 0 using 0
{
int t; //延时循环变量
char keycode; //最终键盘码
char scancode; //扫描码
char temp;
char flag=0xff; //看键是否释放
t=5000;
while(t--); //延时10ms
if (INT0==1)
return;
P1=0xff;
EX0=0; //关闭键盘中断
scancode=0xef; //键盘扫描码,采用逐列扫描的方式
while(scancode!=0xff)
{
P1=scancode; //输入扫描码
temp=scancode;
keycode=P1; //读出数据,看是否此列上有键按下
if ((keycode&0x0f)!=0x0f)
break; //扫描到有键按下,退出
scancode=(keycode<<1)|0x0f; //否则更新扫描码继续扫描
}
/*keycode=temp|keycode; */
keycode=~keycode;
if (keycode==0x11) //S11,数字“1”
{
dispbuf[dispcount]=seg[1];
}
if (keycode==0x21) //S21,数字“4”
{
dispbuf[dispcount]=seg[4];
}
if (keycode==0x41) //S31,数字“7”
{
dispbuf[dispcount]=seg[7];
}
if (keycode==0x81) //S41,数字“0”
{
dispbuf[dispcount]=seg[0];
}
if (keycode==0x12) //S12,数字“2”
{
dispbuf[dispcount]=seg[2];
}
if (keycode==0x22) //S22,数字“5”
{
dispbuf[dispcount]=seg[5];
}
if (keycode==0x42) //S32,数字“8”
{
dispbuf[dispcount]=seg[8];
}
/*if (keycode==0x82) //S42,CHG,更换密码
{
key=0;
}*/
if (keycode==0x14) //S13,数字“3”
{
dispbuf[dispcount]=seg[3];
}
if (keycode==0x24) //S23,数字“6”
{
dispbuf[dispcount]=seg[6];
}
if (keycode==0x44) //S33,数字“9”
{
dispbuf[dispcount]=seg[9];
}
/*if (keycode==0x84) //S43,ENTR,确认
{
if(strcmp(dispbuf,Pwd)==0)
{
lamp(100);
}
else bi(100);
} */
P1=0x0f;
while(1) //看键是否释放
{
if(INT0==1)
{
flag=~flag;
if (flag==0)
break;
}
t=1000;
while(t--);
}
EX0=1; //打开键盘中断
dispcount++;
return;
}
void main()
{
void lamp();
void bi();
LED=0;
LOUD=0;
COM8155=0x03; //设置8155工作方式,PA,PB均为输出口
EA=1; //开中断
EX0=1; //开外部中断0
IT0=0;
P1=0x0f;
PA=0;
while(1)
{
PA=seg[dispbuf[k]];
PB=dispbit[k];
k++;
if (k==dispcount)
k=0;
}
EA=0;
}
|
|