CPU控制的键盘扫描实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CPU键盘扫描实验

电路图如下:

要求按下s1键时,p3口的8位LED正向流水点亮;按下s2键时,p3口的8位LED反向流水点亮;按下s3键时,p3口的8位LED 熄灭;按下s4键时,p3口的8位LED闪烁。

程序代码:

#include

unsigned char tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //段码表

sbit S1=P1^4; //将S1位定义为P1.4引脚

sbit S2=P1^5; //将S2位定义为P1.5引脚

sbit S3=P1^6; //将S3位定义为P1.6引脚

sbit S4=P1^7; //将S4位定义为P1.7引脚

/*流水灯延时*/

void delay0()

{

unsigned char i,j;

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

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

;

}

/*软件消抖延时*/

void delay1()

{

unsigned char i,j;

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

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

;

}

/*正转*/

void zheng()

{

int i;

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

{P3=tab[i];

delay0();}

}

/*反转*/

void fan()

{

int i;

for(i=7;i>=0;i--)

{P3=tab[i];

delay0();}

}

/*关闭*/

void close()

{

P3=0xff;

}

/*闪烁*/

void shan()

{

P3=0xff;

delay0();

P3=0x00;

delay0();

}

void main()

{

int key=0;

while(1)

{

P1=0xf0;

if((P1&0xf0)!=0xf0)

{

delay1();

if((P1&0xf0)!=0xf0)

{

if(S1==0)

key=1;

if(S2==0)

key=2;

if(S3==0)

key=3;

if(S4==0)

key=4;

}

}

switch(key)

{

case 1: zheng();

break;

case 2: fan();

break;

case 3: close();

break;

case 4: shan();

break;

}

}

}

说明:在s1键按下后,LED正向流水亮;要想反向亮,按s2键时按下时间长一点。下面介绍一个用951中定时器扫描中断的方法。

实验电路图同上,用定时器T1每1ms扫描一次键盘,这样便可以很好地实现键盘控制功能。代码如下:

#include

unsigned char tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //段码表sbit S1=P1^4; //将S1位定义为P1.4引脚

sbit S2=P1^5; //将S2位定义为P1.5引脚

sbit S3=P1^6; //将S3位定义为P1.6引脚

sbit S4=P1^7; //将S4位定义为P1.7引脚

unsigned char key=0;

/*流水灯延时*/

void delay0()

{

unsigned char i,j;

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

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

;

}

/*软件消抖延时*/

void delay1()

{

unsigned char i,j;

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

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

;

}

/*正转*/

void zheng()

{

int i;

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

{P3=tab[i];

delay0();}

}

/*反转*/

void fan()

{

int i;

for(i=7;i>=0;i--)

{P3=tab[i];

delay0();}

}

/*关闭*/

void close()

{

P3=0xff;

}

/*闪烁*/

void shan()

{

P3=0xff;

delay0();

P3=0x00;

delay0();

}

void main()

{

TMOD=0x10; //定时器1工作与状态1

EA=1; //开总中断

ET1=1; //开定时器1中断

TH1=(65536-1000)/256; //每1毫秒扫描一次

TL1=(65536-1000)%256;

TR1=1; //启动定时器1

while(1)

{

switch(key)

{

case 1: zheng();

break;

case 2: fan();

break;

case 3: close();

break;

case 4: shan();

break;

}

}

}

void int1() interrupt 3 using 0

{

P1=0xf0;

TR1=0;

if((P1&0xf0)!=0xf0) //判断是否有按键按下{

delay1(); //用软件延时消抖

相关文档
最新文档