2772|1

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助高手,中断方式键盘扫描。 [复制链接]

用中断的方式,有键按下进中断扫描键盘。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;
}

最新回复

LZ能不能说说键盘的接口? P1=scancode; //输入扫描码 temp=scancode; keycode=P1;    //读出数据,看是否此列上有键按下 这几句,我看得云里雾里的   详情 回复 发表于 2008-9-30 12:14
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
LZ能不能说说键盘的接口?

P1=scancode; //输入扫描码
temp=scancode;
keycode=P1;    //读出数据,看是否此列上有键按下

这几句,我看得云里雾里的
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表