- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机经验总结5---机模块驱动程序参考.doc
单片机经验总结5
一、引用外部头文件:
#include SST89x5x4.H
该头文件定义了SST89x5x4系列芯片所用到的关键变量,包括端口、各个寄存器等。
#include INTRINS.H
该头文件定义了C51单片机的几个关键操作。
这两个头文件可在“……\Keil\C51\INC”文件夹中找到。
二、按键模块:
void Key_Init(void);
unsigned char GetScanKey(void);
unsigned char GetKey(void);
函数功能描述:键盘初始化,将标志位置1;
void Key_Init(void)
{
bKeyUp_Flag=1;//标志(全局变量)位置1
}
函数功能描述:键盘扫描函数,得到键的行列位置;
unsigned char GetScanKey(void)
{
unsigned char key, i, temp;
unsigned char xdata * ptr;
key=0xff;
for (i=1; i0x10; i=1) //i的低4位为行数位,行依次检测 循环4次
{
ptr=0x8fff;
* ptr =i;
temp = * ptr; //取键盘IO口的值
temp = 0x0f; //屏蔽高四位
if (temp!=0x00) //是否有有效键值
{
key = i4; //取行数位的值并将其放入返回值高4位
key|=temp; //列数位的值放入返回值低4位
break;
}
}
return key; //返回行位(高四)和列位(低四)
}
函数功能描述:取键值,长按无效;
unsigned char code Key_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,
0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
说明:计算因子,定义在函数外部。此数组在计算键值的中间过程起作用。比如右下方键按下(行列值为0x88),通过查找数组得到行对应的中间值0x03,列对应的中间值0x03。
unsigned char GetKey(void)
{
unsigned char key, temp;
if (!bKeyUp_Flag) //判断标志,是0执行
/*按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,长按键无效返回无效值,直至按键无效返回无效按键值,置1标志位。按键输入恢复有效。屏蔽这部分则长按键有效*/
{
key=GetScanKey();
if (key==0xff) //没有按键,置标志位
bKeyUp_Flag=1;
else //保持按键
return 0xff; //因为0xff大于15,故为无效键值,实现长按键无效
}
key=GetScanKey();
if (key==0xff) //没有按键
return key;
else //有按键有效
temp=key; //取键值
Delay_ms(20); //延时20ms 消抖
key=GetScanKey(); //键盘扫描
if(key!=temp) //判断两次键值是否相同,排除干扰信号影响 确认有效信号
{
key=0xff;
return key;
}
else //取键值
{
/*这部分主要作用是软件抗干扰*/
temp=Key_Value_Table[key4]; //见说明
/*行值有效位(键盘的4个行SEL返回的值含有的有效位1)有且只有一位 键值才有效 否则返回无效键值*/
if (temp==0xff)
{
key=0xff;
return key;
}
temp=Key_Value_Table[key0x0f];
/*列值有效位(键盘的4个列RL返回的值含有的有效位1)有且只有一位 键值才有效 否则返回无效键值*/
if (temp==0xff)
{
key=0xff;
return key;
}
key=Key_Value_Table[key4]*4+Key_Value_Table[key0x0f];//行对应的中间值的
文档评论(0)