标题:
单片机矩阵键盘扫描仿真加源代码
[打印本页]
作者:
谢之
时间:
2017-6-12 17:25
标题:
单片机矩阵键盘扫描仿真加源代码
键盘扫描仿真原理图如下(proteus的仿真工程文件可以到附件中下载):
0.png
(19.84 KB, 下载次数: 53)
下载附件
2017-6-12 17:43 上传
0.png
(59.03 KB, 下载次数: 63)
下载附件
2017-6-12 17:43 上传
51单片机源代码如下:
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P2
#define outk P1
#define N 3
void delayms(uint);
uchar scan(void);
void main(void)
{
uchar key,i;
while(1)
{
key=scan();
if(key!=0xff) {
switch(key) {
case 0:
for(i=0;i<N;i++) {out=0xfe; delayms(100);
out=0xff; delayms(100);
} break;
case 1: for(i=0;i<N;i++) {out=0xfd; delayms(100);
out=0xff; delayms(100);
} break;
case 2: for(i=0;i<N;i++) {out=0xfb; delayms(100); out=0xff; delayms(100);
}break;
case 3: for(i=0;i<N;i++) {out=0xf7; delayms(100);out=0xff; delayms(100);
} break;
case 4: for(i=0;i<N;i++) {out=0xef; delayms(100);out=0xff; delayms(100);
} break;
case 5: for(i=0;i<N;i++) {out=0xdf; delayms(100); out=0xff; delayms(100);
}break;
case 6: for(i=0;i<N;i++) {out=0xbf; delayms(100);out=0xff; delayms(100);
} break;
case 7: for(i=0;i<N;i++) {out=0x7f; delayms(100);out=0xff; delayms(100);
} break;
case 8: for(i=0;i<N;i++) {out=0xfc; delayms(100);out=0xff; delayms(100);
} break;
case 9: for(i=0;i<N;i++) {out=0xf3; delayms(100);out=0xff; delayms(100);
} break;
case 10: for(i=0;i<N;i++) {out=0xcf; delayms(100);out=0xff; delayms(100);
} break;
case 11: for(i=0;i<N;i++) {out=0x3f; delayms(100); out=0xff; delayms(100);
}break;
case 12:
for(i=0;i<N;i++) {out=0x00; delayms(100);
out=0xff; delayms(100);
} break;
case 13: for(i=0;i<N;i++) {out=0xf8; delayms(100); out=0xff; delayms(100);
}break;
case 14: for(i=0;i<N;i++) {out=0xf0; delayms(100); out=0xff; delayms(100);
}break;
case 15: for(i=0;i<N;i++) {out=0x0f; delayms(100);out=0xff; delayms(100);
} break;
}}
}
}
// 延迟
void delayms(uint j)
{
uchar i;
for(;j>0;j--)
{
i=250;
while(--i);
i=249;
while(--i);
}
}
//键盘扫描函数
//行线为0 扫描列
uchar scan(void)
{
uchar k=16,m,n,in,a;
outk=0x0f; //行线为0 扫描列
a=outk&0x0f; //读入列线值
if(a!=0x0f) //检测有无键按下
{
delayms(100); //去抖
}
if(a!=0x0f) { //检测有无键按下
for(m=0;m<4;m++) //m为列号
{
outk=~(0x10<<m); //按位左移
for(n=0;n<4;n++)
{
in=outk;
in=in>>n; //按位右移
if((in&0x01)==0)
{
delayms(10);
if((in&0x01)==0){k=4*n+m;break;}
}
}
if(k!=16){break;}
}
}
return(k);
}
/*
// 列线为0 扫描行
uchar k=16,m,n,in,a;
outk=0xf0; //列线为0 扫描行
a=outk&0xf0; //读入行线值
if(a!=0xf0) //检测有无键按下
{
delayms(100); //去抖
}
if(a!=0xf0) { //检测有无键按下
for(m=0;m<4;m++) //m为行号
{
outk=~(0x01<<m); //按位左移
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
键盘扫描.zip
(44.67 KB, 下载次数: 20)
2017-6-12 17:24 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
假想敌
时间:
2018-9-19 10:37
楼主分享的很有用,
作者:
18779582598
时间:
2018-9-19 15:24
感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1