用51单片机中断编写的4x4键盘程序.docx
- 文档编号:5882619
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:7
- 大小:297.02KB
用51单片机中断编写的4x4键盘程序.docx
《用51单片机中断编写的4x4键盘程序.docx》由会员分享,可在线阅读,更多相关《用51单片机中断编写的4x4键盘程序.docx(7页珍藏版)》请在冰豆网上搜索。
用51单片机中断编写的4x4键盘程序
用51单片机中断编写的4x4键盘程序
用51单片机中断编写的4x4键盘程序
应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29日博文《MSP430和AT89C51单片机4x4键盘C程序》),如果用中断编写,设置中断响应在下降沿时执行中断,则程序编写不用去抖动判断,所以相比较要简单很多!
下面用汇编和C语言两种方式编写4X4键盘程序!
一、汇编程序
ORG0000H
LJMPMAIN
ORG0003h
LjmpZD0
ORG000Bh
LJMPTZD0
ORG0013h
LjmpZD1
ORG001Bh
LJMPTZD1
ORG0040H
MAIN:
MovTMOD,#66h
MOVTH0,#0ffh
MOVTL0,#0ffh
MOVTH1,#0ffh
MOVTL1,#0ffh
SETBEA
SETBET0
SETBTR0
SETBET1
SETBTR1
SETBIT0
SETBIT1
SETBEX0
SETBEX1
xh:
movP1,#0feh
LcallDelay
movP1,#0fdh
LcallDelay
movP1,#0fbh
LcallDelay
movP1,#0f7h
LcallDelay
SJMPxh
ZD0:
JNBP1.0,dat1
JNBP1.1,dat2
JNBP1.2,dat3
JNBP1.3,dat4
dat1:
movP2,#06h ;1
sjmpZD0R
dat2:
movP2,#5bh ;2
sjmpZD0R
dat3:
movP2,#4fh ;3
sjmpZD0R
dat4:
movP2,#66h ;4
ZD0R:
reti
ZD1:
JNBP1.0,dat5
JNBP1.1,dat6
JNBP1.2,dat7
JNBP1.3,dat8
dat5:
movP2,#6dh ;50110
sjmpZD1R
dat6:
movP2,#7dh ;6
sjmpZD1R
dat7:
movP2,#07h ;7
sjmpZD1R
dat8:
movP2,#7fh ;8
ZD1R:
reti
TZD0:
JNBP1.0,dat9
JNBP1.1,dat0
JNBP1.2,dat10
JNBP1.3,dat11
dat9:
movP2,#6fh ;9
sjmpZD0R
dat0:
movP2,#3fh ;0
sjmpZD0R
dat10:
movP2,#77h ;A
sjmpZD0R
dat11:
movP2,#7ch ;B
TZD0R:
reti
TZD1:
JNBP1.0,dat12
JNBP1.1,dat13
JNBP1.2,dat14
JNBP1.3,dat15
dat12:
movP2,#39h ;C
sjmpTZD1R
dat13:
movP2,#5eh ;D
sjmpTZD1R
dat14:
movP2,#79h ;E
sjmpTZD1R
dat15:
movP2,#71h ;F
TZD1R:
reti
Delay:
movr7,#10d
djnzr7,$
ret
end
二、C语言程序(扫描P1)
#include"reg51.h"
intyu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
inti,j,k,time,temp,dat;
voiddelay(time)
{
while(time--)
for(i=0;i<120;i++);
}
voidmain()
{
P2=0x40;
TMOD=0x66; //设定定时计数器T0、T1为方式2计数模式
TH0=0xFF;
TL0=0xFF;
TH1=0xFF;
TL1=0xFF;
IE=0x8F; //开总中断和定时计数器两个中断,两个外中断
IT0=1;
IT1=1; //设置外中断为下降沿触发
TR0=1;
TR1=1; //打开定时计数器开始计数
while
(1)
{
P1=0xfe;
delay
(1);
P1=0xfd;
delay
(1);
P1=0xfb;
delay
(1);
P1=0xf7;
delay
(1);
}
}
voidintsvr0(void)interrupt0 using1
{
temp=P1;
switch(temp)
{
case0xfe:
key=0;break;
case0xfd:
key=1;break;
case0xfb:
key=2;break;
case0xf7:
key=3;break;
default:
break;
}
P2=yu[dat];
}
voidtimer0(void)interrupt1using1
{
temp=P1;
if(temp==0xfe) dat=4;
if(temp==0xfd)dat=5;
if(temp==0xfb)dat=6;
if(temp==0xf7)dat=7;
P2=yu[dat];
}
voidintsvr1(void)interrupt2using1
{
temp=P1;
if(temp==0xfe) dat=8;
if(temp==0xfd)dat=9;
if(temp==0xfb)dat=10;
if(temp==0xf7)dat=11;
P2=yu[dat];
}
voidtimer1(void)interrupt3using1
{
intdat;
temp=P1;
switch(temp)
{
case0xfe:
key=12;break;
case0xfd:
key=13;break;
case0xfb:
key=14;break;
case0xf7:
key=15;break;
default:
break;
}
P2=yu[dat];
}
/*************************************************************/
三、C语言(扫描P3的P3.0、P3.1、P3.6、P3.7)
从这个程序也可以看出51单片机I/O口没有方向性,输入输出都可读写,而且在一个寄存器中。
注意该程序对应电路图与上图的区别。
#include"reg51.h"
sbitpp0=P3^0;
sbitpp1=P3^1;
sbitpp2=P3^6;
sbitpp3=P3^7;
intyu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
inti,j,k,time,temp,dat;
voiddelay(time)
{
while(time--)
for(i=0;i<120;i++);
}
voidmain()
{
P2=0x40;
TMOD=0x66; //设定定时计数器T0、T1为方式2计数模式
TH0=0xFF;
TL0=0xFF;
TH1=0xFF;
TL1=0xFF;
IE=0x8F; //开总中断和定时计数器两个中断,两个外中断
IT0=1;
IT1=1; //设置外中断为下降沿触发
TR0=1;
TR1=1; //打开定时计数器开始计数
while
(1)
{
pp0=0;
delay(5);
pp0=1;
pp1=0;
delay(5);
pp1=1;
pp2=0;
delay(5);
pp2=1;
pp3=0;
delay(5);
pp3=1;
/*以上可用下列这段代替
P3=0xfe;
delay(5);
P3=0xfd;
delay(5);
P3=0xbf;
delay(5);
P3=0x7f;
delay(5);*/
}
}
voidintsvr0(void)interrupt0 using1
{
temp=P3;
switch(temp)
{
case0xfa:
dat=0;break;
case0xf9:
dat=1;break;
case0xbb:
dat=2;break;
case0x7b:
dat=3;break;
default:
break;
}
P2=yu[dat];
}
voidtimer0(void)interrupt1using1
{
temp=P3;
if(temp==0xee)dat=8;
if(temp==0xed)dat=9;
if(temp==0xaf)dat=10;
if(temp==0x6f)dat=11;
P2=yu[dat];
}
voidintsvr1(void)interrupt2using3
{
temp=P3;
if(temp==0xf6)dat=4;
if(temp==0xf5)dat=5;
if(temp==0xb7)dat=6;
if(temp==0x77)dat=7;
P2=yu[dat];
}
voidtimer1(void)interrupt3using1
{
intdat;
temp=P3;
switch(temp)
{
case0xde:
dat=12;break;
case0xdd:
dat=13;break;
case0x9f:
dat=14;break;
case0x5f:
dat=15;break;
default:
break;
}
P2=yu[dat];
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 中断 编写 x4 键盘 程序