资讯详情

中断法键盘扫描c程序

/*

程序效果:按键,蜂鸣器响,数字管有相应的键值

按E键继电器关闭,按C键继电器打开。

这和上一个程序一样简单

但理解相对困难。

运行平台:51hei单片机学习板

*/

#includereg52.h> //头文件

#includeintrins.h>

#define uchar unsigned char //宏定义

#define uint unsigned int

sbit jdq=P3^5; //位声明驱动继电器管脚

sbit fmq=P3^4; //位声明驱动蜂鸣器管脚

code uchar table[]={0x3f,0x06,0x5b,///数字管显示的数值

0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};

code uchar key_tab[17]={ ///这个数组用键盘编码

0xed,0x7e,0x7d,0x7b, // 0,1,2,3,

0xbe,0xbd,0xbb,0xde, // 4,5,6,7,

0xdd,0xdb,0x77,0xb7, // 8,9,a, b,

0xee,0xeb,0xd7,0xe7,0xff}; // c,d,e,f,

uchar l_key=0x00; ///定义变量,存储键值

uchar l_keyold=0xff; ////作为按钮放开否的凭证

void readkey(); ///扫描键盘,获得键值

void display(uchar *lp,uchar lc); //显示子函数

void delay(); //延迟子函数

void main() //主函数

{

EA=1; ///打开总中断

EX0=1; //打开外部中断

P0=0xf0; //键值高4位为高电平,低4位为低电平

while(1)

{

display(l_key,1); //调用显示子函数

if(l_key==14) //是否按E键,关闭继电器

jdq=1;

if(l_key==12) 是否按C键,打开继电器

jdq=0;

}

}

void key_scan() interrupt 0///外部中断0,0优先级最高

{

EX0=0; //阅读键盘时,关闭外部中断,防止干扰引起的多次中断

TMOD=0xf1; ///设置定时器1

TH0=0x2e; //设置初值为12毫秒,十进制值为1176

TL0=0x00;

ET0=1; ///打开定时器中断0

TR0=1; //启动定时器计数

}

void time0() interrupt 1 ////定时器0中断函数

{

TR0=0; ///关闭定时器0

readkey(); //定时12ms中断后,调用此函数读取键值

}

void readkey() //扫描键盘函数

{

uchar i,j,key; //定义局部变量

j=0xfe; ///设定初始值

key=0xff;

for(i=0;i4;i ) // 逐列扫描键盘

{

P0=j;

if((P00xf0)!=0xf0) ///按下按钮,高4位不可能全部为1

{

key=P0; //读取P0口值,启动循环,否则下次循环

break;

}

j=_crol_(j,1); //这个函数的功能是:左移循环

}

if(key==0xff) //如果读不到P如果值,如干扰,返回

{

l_keyold=0xff;

P0=0xf0; // 恢复P0口值,等按钮

fmq=1;

EX0=1; ///返回前打开外部中断

return;

}

fmq=0; //按下按钮,打开蜂鸣器

if(l_keyold==key) // 检查按钮是否放开。如果相等,则表示未放开

{

TH0=0x2e; //设置初始值

TL0=0x00;

TR0=1; //继续启动定时器,检查按钮是否打开

return;

}

TH0=0x2e;

TL0=0;

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

l_keyold=key; //获取键值作为放开否的凭证

for(i=0;i17;i ) ///将相应的16进制值存储在查表中l_key中

{

if(key==key_tab[i])

{

l_key=i;

break;

}

}

///程序运行到这里,说明有键值存储在这里l_key中,主程序

///可以检测键盘值并进行相应的处理

}

void display(uchar *lp,uchar lc) //显示子函数

{

uchar i; //定义局部变量

P1=0xf8; ///点亮第一个数字管

P2=0; //P2口为输出值

for(i=0;ilc;i ) //循环显示

{

P2=table[lp[i]]; ///查表获得相应的数字段显示

delay(); //延时

P2=0; ///清零,准备显示下一个值

}

}

void delay() //延时子函数

{

_nop_();_nop_();_nop_();_nop_();_nop_();

}

标签: 7d计数继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台