资源描述:
《单片机经验总结5---机模块驱动程序参考》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、单片机经验总结5一、引用外部头文件:#include"SST89x5x4.H"该头文件定义了SST89x5x4系列芯片所用到的关键变量,包括端口、各个寄存器等。#include该头文件定义了C51单片机的几个关键操作。这两个头文件可在“……KeilC51INC”文件夹中找到。二、按键模块:voidKey_Init(void);unsignedcharGetScanKey(void);unsignedcharGetKey(void);函数功能描述:键盘初始化,将标志位置1;voidKey_In
2、it(void){bKeyUp_Flag=1;//标志(全局变量)位置1}函数功能描述:键盘扫描函数,得到键的行列位置;unsignedcharGetScanKey(void){unsignedcharkey,i,temp;unsignedcharxdata*ptr;key=0xff;for(i=1;i<0x10;i<<=1)//i的低4位为行数位,行依次检测循环4次{ptr=0x8fff;*ptr=i;temp=*ptr;//取键盘IO口的值temp&=0x0f;//屏蔽高四位if(temp!=0x00)//是否有有
3、效键值{key=i<<4;//取行数位的值并将其放入返回值高4位key
4、=temp;//列数位的值放入返回值低4位break;}}returnkey;//返回行位(高四)和列位(低四)}函数功能描述:取键值,长按无效;unsignedcharcodeKey_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff};说明:计算因子,定义在函数外部。此数组在计算键值的中间过程起作用。比如
5、右下方键按下(行列值为0x88),通过查找数组得到行对应的中间值0x03,列对应的中间值0x03。unsignedcharGetKey(void){unsignedcharkey,temp;if(!bKeyUp_Flag)//判断标志,是0执行/*按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,长按键无效返回无效值,直至按键无效返回无效按键值,置"1"标志位。按键输入恢复有效。屏蔽这部分则长按键有效*/{key=GetScanKey();if(key==0xff)//没有按键,置标志位bKeyUp
6、_Flag=1;else//保持按键return0xff;//因为0xff大于15,故为无效键值,实现长按键无效}key=GetScanKey();if(key==0xff)//没有按键returnkey;else//有按键有效temp=key;//取键值Delay_ms(20);//延时20ms消抖key=GetScanKey();//键盘扫描if(key!=temp)//判断两次键值是否相同,排除干扰信号影响确认有效信号{key=0xff;returnkey;}else//取键值{/*这部分主要作用是软件抗干扰*/
7、temp=Key_Value_Table[key>>4];//见说明/*行值有效位(键盘的4个行SEL返回的值含有的有效位"1")有且只有一位键值才有效否则返回无效键值*/if(temp==0xff){key=0xff;returnkey;}temp=Key_Value_Table[key&0x0f];/*列值有效位(键盘的4个列RL返回的值含有的有效位"1")有且只有一位键值才有效否则返回无效键值*/if(temp==0xff){key=0xff;returnkey;}key=Key_Value_Table[key>
8、>4]*4+Key_Value_Table[key&0x0f];//行对应的中间值的四倍与列对应的中间值之和即为按键编号0~15/*行列组合后的值大于15无效*/if(key>15){key=0xff;returnkey;}bKeyUp_Flag=0;returnkey;}}三、LCD模块:详细资料请字符点阵说明书.pdf器件资料请参考“字符点阵说明书.pdf”中有关EDM1602部分;voidLCD_Init(void);voidLCD_Init2(void);voidWriteW(uinta);voidCheckB
9、F(void);unsignedcharKey_ASC2(unsignedchar);voidWritD(unsignedchar);函数功能描述:检查忙标志位BF;voidCheckBF(void){uinti;while(1){ptr=0xAFF1;//RS=0,R/W=1i=*ptr;i&=0x80;if(i==0)brea