• 西北工控自动化网 专业的兰州PCB芯片级无图维修,电路板软硬件开发公司-甘肃先睿工控科技有限公司!欢迎你! 业务咨询电话:0931-8593134 技术支持电话:18609487812

 

先睿工控广告

编程开发
其它的类

首页 》 全屏查看 》


51 单片机按键扫描通用代码模块

关键词: 51 单片机按键扫描通用代码模块
描述:

51 单片机按键扫描通用代码模块


作者:代码灵魂  日期:2017/5/22

51 单片机按键扫描通用代码模块

51 单片机 按键扫描通用代码模块,在单片机编程中,可直接引用。

以下为KEYTSCAN.C文件内容

#include "KEYSCAN.H"

//=======================================================================================//

/* 按键扫描程序模块 */

/*

功能:通用单片机按键扫描程序

说明:本扫描采用uPort 即PortB 也就是P0口

免费声明:本程序仅供初学者入门参考,使用,禁止用于商业用途,或造成任何后果,与作者无关。

附加说明:需要更改端口时,将KEYSCAN.H中,#define uPort PortB 中PortB改为 P0,P1,P2,P3 即可。

程序来源:源码世界 QQ群:12897024 西北工控自动化网:HTTP://WWW.

备注:使用或引用本模块,请保留,程序来源一行。

日期:2014/07/03

//=======================================================================================//

/*

说明:

本为解释为新手所用的详细解释。

按键为行CORD_H 1111 4,3,2,1,bit

按键为列CORD_L 1111 8,7,6,5,bit

当按键为1时,上下行,列的值应该为:1110,0111 组合后因为电路图中列为高位,则高位在前为:01111110 即十六进制:7e 1

当按键为2时,上下行,列的值应该为:1110,1011 组合后因为电路图中列为高位,则高位在前为:10111110 即十六进制:be 2

当按键为3时,上下行,列的值应该为:1110,1101 组合后因为电路图中列为高位,则高位在前为:11011110 即十六进制:de 3

当按键为4时,上下行,列的值应该为:1110,1110 组合后因为电路图中列为高位,则高位在前为:11101110 即十六进制:ee 4

当按键为5时,上下行,列的值应该为:1101,0111 组合后因为电路图中列为高位,则高位在前为:01111110 即十六进制:7d 5

当按键为6时,上下行,列的值应该为:1101,1011 组合后因为电路图中列为高位,则高位在前为:01111110 即十六进制:bd 6

当按键为7时,上下行,列的值应该为:1101,1101 组合后因为电路图中列为高位,则高位在前为:11011101 即十六进制:dd 7

当按键为8时,上下行,列的值应该为:1101,1110 组合后因为电路图中列为高位,则高位在前为:11101101 即十六进制:ed 8

当按键为9时,上下行,列的值应该为:1011,0111 组合后因为电路图中列为高位,则高位在前为:01111011 即十六进制:7b 9

当按键为0时,上下行,列的值应该为:1011,1011 组合后因为电路图中列为高位,则高位在前为:10111011 即十六进制:bb 0

当按键为a时,上下行,列的值应该为:1011,1101 组合后因为电路图中列为高位,则高位在前为:11011011 即十六进制:db a 该为确认键,

当按键为b时,上下行,列的值应该为:1011,1110 组合后因为电路图中列为高位,则高位在前为:11101011 即十六进制:eb b 该为清除键,

当按键为c时,上下行,列的值应该为:0111,0111 组合后因为电路图中列为高位,则高位在前为:01110111 即十六进制:77 c 该为xx键,

当按键为d时,上下行,列的值应该为:0111,1011 组合后因为电路图中列为高位,则高位在前为:10110111 即十六进制:b7 d 该为xx键,

当按键为e时,上下行,列的值应该为:0111,1101 组合后因为电路图中列为高位,则高位在前为:11010111 即十六进制:c7 e 该为xx键,

当按键为f时,上下行,列的值应该为:0111,1110 组合后因为电路图中列为高位,则高位在前为:11100111 即十六进制:d7 f 该为xx键,

而这些代码就是单片机在按键扫描的8根线上所获得的数据。

*/

uchar const Keycode[]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,

0x41,0x42,0x43,0x44,0x45,0x46};//0-F

extern void delay(uint i);

uchar PortData;

uchar key;

//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍

//本函数实现按键扫描。即将数据返回给调用函数,

uchar keyscan()//键盘扫描函数,使用行列反转扫描法

{

uchar cord_h,cord_l;//行列值

uPort=0x0f; //行线输出全为0

cord_h=uPort&0x0f; //读入列线值

if(cord_h!=0x0f) //先检测有无按键按下

{

delay(100); //去抖

if(cord_h!=0x0f)

{

cord_h=uPort&0x0f; //读入列线值

uPort=cord_h|0xf0; //输出当前列线值

cord_l=uPort&0xf0; //读入行线值

return(cord_h+cord_l);//键盘最后组合码值

}

}return(0xff); //返回该值

}

//本函数说明:简单的检测CPU IO 口是否好坏。如果坏,则通过串口将错误提示输出到电脑或RS232显示设备。

void InitKey()

{

uPort=0xff;

delay(100);

if (uPort==0xff)

{

uPort=0x00;

delay(100);

if (uPort==0x00)

{

printf("The Key is ok! ");

}

else

{

printf("The Key is Bad!Please check Keypad or mcu! ");

}

}

uPort=0xff;

}

//本函数,将按键数据转换为0-9 A-F ASCII码。

uchar GetKeyCode()

{

key=keyscan();//调用键盘扫描,扫描的端口为PortB 即P1口。如需要更改请参照本页最上面附加说明中的方法更改

switch(key)

{

case 0x7e:PortData=Keycode[0];break;//1 按下相应的键显示相对应的码值

case 0xbe:PortData=Keycode[1];break;//2

case 0xde:PortData=Keycode[2];break;//3

case 0xee:PortData=Keycode[3];break;//4

case 0x7d:PortData=Keycode[4];break;//5

case 0xbd:PortData=Keycode[5];break;//6

case 0xdd:PortData=Keycode[6];break;//7

case 0xed:PortData=Keycode[7];break;//8

case 0x7b:PortData=Keycode[8];break;//9

case 0xbb:PortData=Keycode[9];break;//0

case 0xdb:PortData=Keycode[10];break;//a

case 0xeb:PortData=Keycode[11];break;//b

case 0x77:PortData=Keycode[12];break;//c

case 0xb7:PortData=Keycode[13];break;//d

case 0xd7:PortData=Keycode[14];break;//e

case 0xe7:PortData=Keycode[15];break;//f

}

if ((PortData>=0x30)&(PortData<=0x46))

{

PortA=PortData; //PortA 作为按键码数据显示,不要注释掉。

printf("You Press Key is :%c ",PortData);

}

return(PortData);

}

//本函数为清除按键码,免得在处理完成后,还要重复输入。

void ClearKeyCode()

{

PortData=0xff;

}

以下为KEYSCAN.H文件内容

#include

#include

#ifndef __KEYSCAN_h__

#define __KEYSCAN_h__

#define uchar unsigned char

#define uint unsigned int

#define PortA P0 //这是哥喜欢的方式,便于与其它单片机使用相同规则,谁不喜欢,谁自己改。

#define PortB P1 //这是哥喜欢的方式,便于与其它单片机使用相同规则,谁不喜欢,谁自己改。

#define PortC P2 //这是哥喜欢的方式,便于与其它单片机使用相同规则,谁不喜欢,谁自己改。

#define PortD P3 //这是哥喜欢的方式,便于与其它单片机使用相同规则,谁不喜欢,谁自己改。

#endif

#define uPort PortB //这是哥喜欢的方式,便于与其它单片机使用相同规则,谁不喜欢,谁自己改。

 


本信息由  甘肃先睿工控科技有限责任公司 发表于 西北工控自动化网
注意: 转载或分享 请注明来源:西北工控自动化!

在全屏模式下分享,效果更好!


扫一扫 添加通信录 扫一扫 添加微信号


COPYRIGHT ©2008-2018 XBGHZDH CORPORATION ALL RIGHT RESERVED .
COPYRIGHT ©2008 XBGHZDH ALL RIGHT RESERVED .           

        西北工控自动化 © 版权所有

本网站由:甘肃先睿工控科技有限公司独家赞助


总访问量:343026
当前在线:60