历史上的今天
今天是:2025年10月08日(星期三)
2022年10月08日 | 51单片机STC89C52矩阵键盘之扫描法检测
2022-10-08 来源:csdn
程序源码
/*-----------------------包含头文件区域-------------------------*/
#include /*-----------------------数据类型定义区域-----------------------*/ typedef unsigned char u8; //定义类型unsigned char别名为u8 typedef unsigned int u16; //定义类型unsigned int别名为u16 /*-----------------------用户自定义数据区域---------------------*/ #define FOSC 11059200L //系统时钟 #define Timer_value (65536-(FOSC/12/1000)*1)//定时器值=(定时器溢出值-(系统时钟/12T模式/1000=定时1ms的定时器值))*定时时间ms) //共阳数码管显示字符数组,分别对应的字符为“0123456789ABCDEF-” code u8 LED_Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF,0xFF}; u8 LED_show[8]; //数码管显示的数据数组 u8 key; //获取键值变量 /*-----------------------端口/引脚定义区域----------------------*/ sbit x1=P1^0; //矩阵第1行所接端口 sbit x2=P1^1; //矩阵第2行所接端口 sbit x3=P1^2; //矩阵第3行所接端口 sbit x4=P1^3; //矩阵第4行所接端口 sbit y1=P1^4; //矩阵第1列所接端口 sbit y2=P1^5; //矩阵第2列所接端口 sbit y3=P1^6; //矩阵第3列所接端口 sbit y4=P1^7; //矩阵第4列所接端口 /*-----------------------函数声明区域---------------------------*/ void delay(u16 ms); //延时函数声明 void Timer0_Init(void); //定时器0配置函数声明 void LED_Scan(void); //数码管扫描函数声明 u8 Get_KEY_value(void); //获取键值函数声明 /*-----------------------主函数区域-----------------------------*/ void main() { Timer0_Init(); //定时器0初始化 while(1) //重复执行while循环体的程序 { if(Get_KEY_value()!=0) //返回键值不等于0那就是有键按下 { delay(10); //延时消抖 if(Get_KEY_value()!=0) //再确认按键是否真的按下 { key=Get_KEY_value(); //获取键值 } } else //没有键按下 { key=0;//没有键按下key则为0 } LED_show[0]=LED_Table[key/10]; //第1个数码管显示键值的十位 LED_show[1]=LED_Table[key%10]; //第2个数码管显示键值的个位 } } /*-----------------------定时器0中断函数区域--------------------*/ void Timer0()interrupt 1 { TH0=Timer_value>>8; //重置定时器值的高8位 TL0=Timer_value; //重置定时器值的低8位 LED_Scan(); //数码管扫描 } /*---------------------------------------------------------------- 函数名称:delay() 函数功能:延时 函数形参:ms为延时时间,延时范围0~65535 返 回 值:无 ----------------------------------------------------------------*/ void delay(u16 ms) { u8 i; while(ms--) //循环延时1ms的次数 { for(i=115;i>0;i--); //延时1ms } } /*---------------------------------------------------------------- 函数名称:Timer0_Init() 函数功能:定时器0初始化 函数形参:无 返 回 值:无 ----------------------------------------------------------------*/ void Timer0_Init(void) { TMOD=0x01; //设置定时器0为模式1(16位计数模式) TH0=Timer_value>>8; //设定定时器值的高8位 TL0=Timer_value; //设定定时器值的低8位 TR0=1; //定时器0计数器开始计时 ET0=1; //使能定时器0中断 EA=1; //打开总中断 } /*---------------------------------------------------------------- 函数名称:LED_Scan() 函数功能:数码管扫描 函数形参:无 返 回 值:无 ----------------------------------------------------------------*/ void LED_Scan(void) { static u8 i=0; P0=0xFF; //显示消影(消影电平跟有效电平相反,如果先使能位选再显示段选数据那么消影就是段选,反则消影位选) P2=~(0x01< //使能第(i+1)个数码管位选 P0=LED_show[i]; //显示第(i+1)位数码管段选数据 i=(i+1)%2; //显示2个数码管 } /*---------------------------------------------------------------- 函数名称:Get_KEY_value() 函数功能:获取键值 函数形参:无 返 回 值:无键返回0,键值返回1~16 ----------------------------------------------------------------*/ u8 Get_KEY_value(void) { //检测第一行按键 x1=0; x2=1; x3=1; x4=1; if(y1==0) return 1; else if(y2==0) return 2; else if(y3==0) return 3; else if(y4==0) return 4; //检测第二行按键 x1=1; x2=0; x3=1; x4=1; if(y1==0) return 5; else if(y2==0) return 6; else if(y3==0) return 7; else if(y4==0) return 8; //检测第三行按键 x1=1; x2=1; x3=0; x4=1; if(y1==0) return 9; else if(y2==0) return 10; else if(y3==0) return 11; else if(y4==0) return 12; //检测第四行按键 x1=1; x2=1; x3=1; x4=0; if(y1==0) return 13; else if(y2==0) return 14; else if(y3==0) return 15; else if(y4==0) return 16; return 0;//无键按下返回0 } 仿真电路
史海拾趣
|
怎么判定芯片的真伪? 概述: 通过化学腐蚀及物理显微观察、简单电性能等方法,来检验鉴定器件是否为原半导体厂商的器件。 检验的内容: A、货品外包装、湿度标示卡、器件日期批号等检查确认及记录 B、外观检测,器件的表面状况、印字标准、重 ...… 查看全部问答> |
|
WINCE SDK平台改变后出现的问题: fatal error LNK1112: module machine type \'ARM\' conflicts with target machine type \'SH3\' 这要怎么解决啊???… 查看全部问答> |
|
软件名称:SEFS安全透明加密内核 软件版本:1.0 建议分类:系统安全/文件加密 软件大小:635K 安装平台:Win2000/xp/2003 软件语言:简体中文/繁体中文/英文 软件授权:共享软件 软件主页:http://www.sefs.net 支持邮箱:admin@sefs.ne ...… 查看全部问答> |
|
LPC2141的无刷直流电机控制系统设计 导读: 无刷直流电机是最常用的无刷电机。它易于驱动,速度可调且工作寿命长,适用于各类大小型工业应用,诸如小型马达的控制(如12 V直流无刷电机)。 关键字 LPC2141 ...… 查看全部问答> |
|
Visual Basic设计完成了上位机界面;同时利用51单片机作为下位机微处理器,采集无刷电机运行工作中的电压、电流和转速等基本参数,通过串行通讯口将数据上传至上位机系统中。上位机系统对下位机上传的数据加以分析计算,直观的绘制个参数的变化曲线 ...… 查看全部问答> |
|
请教各位兄弟: 项目中需要fpga zynq x702 的板子,要实现 y=atan((a-b)/(a+b)) 的公式运算,如何处理? a b 分别为有符号整数,(a-b)/(a+b) 为小数 xi ...… 查看全部问答> |




