微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 课程设计,键盘扫描显示程序(c51)

课程设计,键盘扫描显示程序(c51)

时间:11-18 来源:互联网 点击:
//课程设计键盘扫描显示程序

//由于开发板中使用了锁存器,在proteus中仿真的话,加上锁存器的话,会出现乱码,并且//不成功,所以,就不贴图了,不过以下代码,在事物板上测试成功

//实验代码为实现按键扫描,并显示在数码管上

//实验班上共有4个按键,分别接在p3.4,p3,5,p3.6.p3.7上,因此并没有用到矩阵键盘扫描,//控制起来比较简单,6数码管观通过锁存器接在P0口上。

#include

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6; //数码管段选控制位

sbit wela=P2^7; //数码管位选控制位

uchar key=8;

//共阴数码管段码(不叫特殊的编码)

uchar code table[]=

{

0xed, 0x48, 0xf4, 0xb5, 0x99,

0x3d, 0x7d, 0x85, 0xfd, 0xbd,

0xdd, 0x79, 0x6c, 0xf1, 0x7c,

0x5c, 0x10, 0x00,

};

//位选编码

uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//函数声明

void display(uchar Duan_value,uchar Wei_value); //数码管扫描函数

void delay(uchar t); //延时函数

void key_scan(); //按键扫描函数

void delay(uchar t)

{

uchar x,y;

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

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

}

//显示对应位选的数码管按键值

void display(uchar Duan_value,uchar Wei_value)

{

dula=1;

P0=table[Duan_value];

dula=0;

wela=1;

P0=table1[Wei_value];

wela=0;

delay(3);

}

void key_scan()

{

uchar temp;

P3=0xff; //P3口写1,用于读取数据

temp=P3&0xf0; //只取高四位

if(temp!=0xf0)

{

delay(10); //延时,去除抖动

temp=P3&0xf0;

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;

default:

key=8;break;

}

do{ //消除按起抖动

temp=P3;

temp&=0Xf0;

}while(temp!=0xf0);

}

}

}

void main()

{

while(1)

{

display(key,5); //用开发板上最后一位显示按键值

key_scan();

}

}

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

网站地图

Top