C语言实现单片机的键盘程序
c语言实现单片机的键盘程序 #include "SST89x5x4.H" #include <INTRINS.H> #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); void 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); } } }
- wangwanfeiyu2013-10-05简单易懂,个人觉得还是挺有用的
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端开发-什么是前端开发-关于前端开发的一些相关介绍
- Sora AI-关于文生视频的使用场景说明
- suno AI文生视频的相关教程和介绍使用
- 什么是后端开发-关于后端开发的一些小介绍分享
- Jurassic Pack Vol. II Dinosaurs 侏罗纪包卷恐龙二号Unity游戏模型资源unitypackage
- Jurassic Pack Vol. III Dinosaurs 侏罗纪包卷恐龙三号Unity游戏模型资源unitypackag
- Ultimate Seating Controller 终极座椅控制器Unity游戏开发插件资源unitypackage
- 什么是人工智能-关于人工智能的相关介绍说明
- Figma Converter for Unity适用Unity的Figma转换器Unity游戏开发插件unitypackage
- Creepy Animatronic Anims 令人毛骨悚然的电子动画Unity游戏动画插件资源unitypackage