键盘接口实验

  • 格式:doc
  • 大小:63.50 KB
  • 文档页数:4

实验六 键盘接口实验

一、实验目的

1、掌握Keil C51软件与Protues软件联合仿真调试的方法;

2、掌握单片机的键盘接口电路;

3、掌握单片机的键盘扫描原理;

4、掌握键盘的去抖原理及处理方法。

二、实验仪器与设备

1、微机 一台 2、Keil C51集成开发环境 3、Protues仿真软件

三、实验内容

1、用Protues设计一矩阵键盘接口电路。要求利用P1口接一4×4矩阵键盘。串行口通过一74LS164接一共阴极数码管。

2. 用线反转法编写矩阵键盘识别程序,用中断方式(列线通过4输入与门74LS21接/INT0),无按键按下时数码管循环画8;有按键按下时产生中断并将按键的键值0~F通过串行口输出,在数码管上显示3秒后返回;返回后,数码管继续循环画“8”。

3.将P1口矩阵键盘改为8个独立按键(用中断方式设计),用定式扫描方式,每10ms扫描一次,其中key7每按动一次数码管显示的数字加1(从0开始),其他按键显示按键编号。

四、实验说明

矩阵键盘识别一般包括以下内容:

⑴判别有无键按下。

⑵键盘扫描取得闭合键的行、列号。

⑶用计算法或查表发的到键值;

⑷判断闭合键是否释放,如没释放则继续等待。

⑸将闭合键的键值保存,同时转去执行该闭合键的功能。

五、实验步骤

1、用Protues设计键盘接口电路;

2、在Keil C51中编写键盘识别程序,编译通过后,与Protues联合调试;

3、按动任意键,观察键值是否能正确显示。

六、实验电路仿真图

矩阵键盘 XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51C122pFC222pFX1CRYSTALC310uFR11kSRG8RC1/->&1D1324561081112913U274LS16402134812R2200R3200R4200R5200R6200R7200R8200R920061014711155913P10P11P12P13P14P15P16P17P10P11P12P13P14P15P16P1712456U3:A74LS21P14P15P16P17

独立按键

XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51C122pFC222pFX1CRYSTALC310uFR11kSRG8RC1/->&1D1324561081112913U274LS164R2200R3200R4200R5200R6200R7200R8200R9200P10P11P12P13P14P15P16P17P10P14P11P15P12P16P13P17

七、实验程序

矩阵键盘 #include

#define uchar unsigned char

#define uint unsigned int

uint m=0;count=0;

bit flag=0;

uchar code

key_table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};

uchar code

table0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar code

table[]={0x00,0x01,0x21,0x61,0x65,0x6d,0x7d,0x7d,0x7f};

void delay(uchar c)

{uchar a,b;

for(;c>0;c--)

for(a=142;a>0;a--)

for(b=2;b>0;b--);

}

void main()

{ P1=0xf0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

EX0=1;

IT0=1;

ET0=1;

TR0=1;

SCON=0x00;

IP=0x02;

for(m=0;m<9;m++)

{SBUF=table[m];

delay(200);

while(TI==0);TI=0;

}

}

void INT_0() interrupt 0

{uchar t,n,i,j;

P1=0xf0;

if(P1!=0xf0)

{delay(20);

if(P1!=0xf0)

{t=P1;

P1=0x0f;

j=t|P1;

for(i=0;i<16;i++)

if(j==key_table[i])

{n=i;break;}

SBUF=table0[n];

while(TI==0);TI=0;}

while(flag==0);

P1=0xf0;

}

}

void time0() interrupt 1

{TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count>=60)

{count=0;

flag=1;

}

}

2.独立按键

#include

#define uchar unsigned char #define uint unsigned int

uchar code

table[]={0x00,0x01,0x21,0x61,0x65,0x6d,0x7d,0x7d,0x7f};

uchar code

table0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uint i=0,k=0,temp,m;

bit flag=0;

void delay(uint c)

{uint a,b;

for(;c>0;c--)

for(a=30;a>0;a--)

for(b=2;b>0;b--);

}

void main()

{ uint j;

ET0=1;

TR0=1;

TMOD=0X01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

for(m=0;m<9;m++)

{SBUF=table[m];

delay(200);

while(TI==0);TI=0;

}

for(j=0;j<100;j++)

{if(TF0==1)

{TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TF0=0;

if(P1!=0xff&&(flag==0)) {temp=P1;

flag=1;

switch(temp)

{

case 0xfe:

SBUF=table0[0];while(TI==0);TI=0; delay(500);break;

case 0xfd:

SBUF=table0[1];while(TI==0);TI=0; delay(500);break;

case 0xfb:

SBUF=table0[2];while(TI==0);TI=0; delay(500);break;

case 0xf7:

SBUF=table0[3];while(TI==0);TI=0; delay(500);break;

case 0xef:

SBUF=table0[4];while(TI==0);TI=0; delay(500);break;

case 0xdf:

SBUF=table0[5];while(TI==0);TI=0; delay(500);break;

case 0xbf:

SBUF=table0[6];while(TI==0);TI=0; delay(500);break;

case

0x7f:SBUF=table0[i++];while(!TI==0)TI=0;delay(500);break;

}

}

else if(P1==0xff) flag=0;

}

delay(10);

}

}

八、实验总结

1、由于对定时器扫描方式不熟悉,一开始把定时器扫描方式写成了查询方式。

2、矩阵键盘常用的检测方法有线反转法、逐行扫描法。线反转法较简单且高效。在矩阵键盘的列线上接一与门,利用中断方式查询按键,可提高CPU的运行效率。

3、注意用线反转法扫描按键时,得到的键值不要再赋给temp,最好再设一新变量接收键值,否则再按下按键显示数字的过程中,再按按键会出现乱码。