您好,欢迎光临本网站![请登录][注册会员]  
文件名称: C语言实现单片机的键盘程序
  所属分类: C
  开发工具:
  文件大小: 149byte
  下载次数: 0
  上传时间: 2011-06-09
  提 供 者: melo*****
 详细说明: c语言实现单片机的键盘程序 #include "SST89x5x4.H" #include #define uchar unsigned char #define uint unsigned int #define _Nop() _nop_() unsigned char code Key_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff, 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void Key_Init(void); unsigned char GetScanKey(void); unsigned char GetKey(void); void LCD_Init(void); void LCD_Init2(void); //void WriteW(uint a); void CheckBF(void); unsigned char Key_ASC2(unsigned char); void WritD(unsigned char); void Delay_ns(int i); vo id Delay_ms(int ms); unsigned char key; unsigned char key_asc2; unsigned char bKeyUp_Flag; uchar xdata *ptr; //函数功能描述:键盘初始化,将标志位置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; i<0x10; i<<=1) //i的低4位为行数位,行依次检测 循环4次 { ptr=0x8fff; //数码管位选地址 * ptr =i; temp = * ptr; //取键盘IO口的值 temp &= 0x0f; //屏蔽高四位 if (temp!=0x00) //是否有有效键值 { key = i<<4; //取行数位的值并将其放入返回值高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[key>>4]; //见说明 /*行值有效位(键盘的4个行SEL返回的值含有的有效位"1")有且只有一位 键值才有效 否则返回无效键值*/ if (temp==0xff) { key=0xff; return key; } temp=Key_Value_Table[key&0x0f]; /*列值有效位(键盘的4个列RL返回的值含有的有效位"1")有且只有一位 键值才有效 否则返回无效键值*/ if (temp==0xff) { key=0xff; return key; } key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];//行对应的中间值的四倍与列对应的中间值之和即为按键编号0~15 /*行列组合后的值大于15无效*/ if (key>15) { key=0xff; return key; } bKeyUp_Flag=0; return key; } } /*三、LCD模块: 详细资料请字符点阵说明书.pdf 器件资料请参考"字符点阵说明书.pdf"中有关EDM1602部分;*/ //函数功能描述:检查忙标志位BF; void CheckBF(void) { int i; while(1) { ptr=0xAFF1;//RS=0,R/W=1 i=*ptr; i &= 0x80; if(i==0) break; } } //函数功能描述:向1602指令寄存器写指令; void WriteW(uint a) { ptr=0xAFF0; //RS=0,R/W=0 *ptr=a; } //函数功能描述:LCD初始化; void LCD_Init(void) { CheckBF(); WriteW(0x38); CheckBF(); WriteW(0x01); CheckBF(); WriteW(0x06); CheckBF(); WriteW(0x0F); CheckBF(); WriteW(0x80); } //函数功能描述:十六进制码转换为ascii码; unsigned char code ASC2_Value_Table[16]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46 }; unsigned char Key_ASC2(unsigned char key) { unsigned char key_asc2; key_asc2=ASC2_Value_Table[key]; return key_asc2; } //函数功能描述:换行后的初始化; void LCD_Init2(void) { CheckBF(); WriteW(0x0F); CheckBF(); WriteW(0xC0); } //函数功能描述:显示字符; void WritD(unsigned char key_asc2) { CheckBF(); ptr=0xAF02; *ptr=key_asc2; } //延迟函数 void Delay_ns(int i) { while(i--) { _Nop(); _Nop(); } } void Delay_ms(int ms) { uint i; while(ms--) { for(i = 0; i<250; i++) { _Nop(); _Nop(); _Nop(); _Nop(); } } } void main() { unsigned char key; Key_Init(); LCD_Init(); while(1) { key=GetKey(); if (key==0xFF) continue; else { key=Key_ASC2(key); WriteW(0x01); WritD(key); } } } ...展开收缩
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: 键盘程序
 输入关键字,在本站1000多万海量源码库中尽情搜索: