浏览 2671 次
锁定老帖子 主题:单片机 键盘编程
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-31
那怎样来使用8个端口控制16个键呢?其实很简单,先必须要掌握她的原理图, 附件中作者上传了一张,仅供参考.原理图看了之后,我们就可以正式开始编写程序了. 先将KEY0置低电平,其余的置高电平,当我们按下第一列的按键时,P2的高四位肯定会有所变化,而我们就是用的这种变化达到分辨不同按键的目的.同理,我们可以将KEY1置低电平,再去检测P2的高四位,也得出了第二列按的哪个键.依次类推,我们即可检测单片机的16个按键了. 下面有一个单片机键盘的完整示例程序,本程序已在89C52单片机上成功运行,产生的效果是,按下单片机上不同的键时,数码管将显示不同的值与之对应. #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit sda = P1^0; sbit clk = P1^1; sbit dig1 = P1^2; sbit dig2 = P1^3; sbit dig3 = P1^4; sbit dig4 = P1^5; uchar code table[]={0x7e,0x0c,0xb6,0x9e, 0xcc,0xda,0xfa,0x0e, 0xfe,0xde,0xef,0xf9, 0x72,0xb8,0xf2,0xe2}; uchar key = 255; uchar diskey = 255; void init(); void delay(uchar); void write(uchar); void display(uchar); uchar scankey(); void main() { init(); while(1) { diskey = scankey(); display(diskey); //scankey(); delay(10); } } /** 键盘扫描 **/ uchar scankey() { uchar temp; /* 检查第一列是否有按键按下 */ P2 = 0xfe; temp = P2; temp = temp&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { switch (temp) { case 0xe0 : key = 0; break; case 0xd0 : key = 1; break; case 0xb0 : key = 2; break; case 0x70 : key = 3; break; } } //display(key);//显示按的键 } /* 检查第二列是否有按键按下 */ P2 = 0xfd; temp = P2; temp = temp&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { switch (temp) { case 0xe0 : key = 4; break; case 0xd0 : key = 5; break; case 0xb0 : key = 6; break; case 0x70 : key = 7; break; } } //display(key);//显示按的键 } /* 检查第三列是否有按键按下 */ P2 = 0xfb; temp = P2; temp = temp&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { switch (temp) { case 0xe0 : key = 8; break; case 0xd0 : key = 9; break; case 0xb0 : key = 10; break; case 0x70 : key = 11; break; } } //display(key);//显示按的键 } /* 检查第四列是否有按键按下 */ P2 = 0xf7; temp = P2; temp = temp&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { switch (temp) { case 0xe0 : key = 12; break; case 0xd0 : key = 13; break; case 0xb0 : key = 14; break; case 0x70 : key = 15; break; } } //display(key);//显示按的键 } return key; } /** 显示一个3位的整数 **/ void display(uchar num) { uchar bai,shi,ge; bai = num/100; shi = num%100/10; ge = num%10; /* 显示个位 */ dig4 = 0; write(table[ge]); delay(10); dig4 = 1; /* 显示十位 */ dig3 = 0; write(table[shi]); delay(10); dig3 = 1; /* 显示百位 */ if(bai!=0) { dig2 = 0; write(table[bai]); delay(10); [img]/upload/attachment/89564/a2582c87-2c23-3974-bf9c-f935ad8c6c92.bmp[/img] [img]/upload/attachment/89564/a2582c87-2c23-3974-bf9c-f935ad8c6c92.bmp[/img] dig2 = 1; } } /** 程序初始化函数 **/ void init() { P2 = 0xfe; //dig1 = 1; //dig2 = 1; //dig3 = 1; //dig4 = 0; } /** 向数据码管写入一个字节数据 **/ void write(uchar u) { uchar i; for(i=0;i<8;i++) { clk = 1; sda = u&0x80; clk = 0; u = u<<1; } } /** 延迟函数 **/ void delay(uchar t) { uchar x,y; for(x=t;x>0;x--) for(y=101;y>0;y--); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |