微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 课程设计:矩阵键盘(c51,使用扫描法实现)

课程设计:矩阵键盘(c51,使用扫描法实现)

时间:11-18 来源:互联网 点击:
//可以比较一下和以前发表的一篇用反转法实现的不同(感觉一下那个更简单)

//这种方法是用只用P3口的前高四位来比较,看改变了么(由于比较仓促,没有proteus仿真,不过这是个比较经典的方法,网上有很多这个代码,源自郭天祥的视频和书籍)

#include

#define uchar unsigned char

#define uint unsigned int

sbit wela=P2^7;

sbit dula=P2^6;

uchar num,num1;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,

0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(uint xms)

{

uint x,y;

for(x=xms;x>0;x--)

for(y=111;y>0;y--);

}

void display(uchar num)

{

dula=1;

P1=table[num];

dula=0;

//delay(10);

}

void matrixkeyscan()

{

uchar temp,key;

P3=0xfe;//第一行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:

key=0;

break;

case 0xde:

key=1;

break;

case 0xbe:

key=2;

break;

case 0x7e:

key=3;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfd;//第二行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:

key=4;

break;

case 0xdd:

key=5;

break;

case 0xbd:

key=6;

break;

case 0x7d:

key=7;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfb;//第三行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:

key=8;

break;

case 0xdb:

key=9;

break;

case 0xbb:

key=10;

break;

case 0x7b:

key=11;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xf7;//第四行

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:

key=12;

break;

case 0xd7:

key=13;

break;

case 0xb7:

key=14;

break;

case 0x77:

key=15;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

}

void main()

{

dula=0;

wela=1;

P1=0x00;

wela=0;

//dula=0;

while(1)

{//dula=0;

matrixkeyscan();

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top