历史上的今天
返回首页

历史上的今天

今天是: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

}


仿真电路

在这里插入图片描述

推荐阅读

史海拾趣

Crystal Semiconductor Corp公司的发展小趣事

在快速发展的同时,Crystal Semiconductor Corp也注重可持续发展。公司积极推行环保理念,采用环保材料和工艺生产产品。同时,公司还加大了对教育和公益事业的投入,培养了一批批优秀的半导体人才。展望未来,Crystal Semiconductor Corp将继续秉承创新、务实、高效的理念,不断推动半导体行业的发展。

请注意,这些故事是虚构的,旨在展示一个半导体公司可能经历的发展阶段和挑战。如果您需要关于Crystal Semiconductor Corp的真实故事,建议您查阅相关公司资料或新闻报道。

COTO TECHNOLOGY公司的发展小趣事

进入上世纪六十年代,COTO TECHNOLOGY迎来了一个重大的转折点。公司开始探索线圈绕组以外的领域,通过引入簧片继电器,成功扩展了产品线。这一创新举措不仅丰富了公司的产品种类,更重要的是,它为公司打开了新的市场领域。到了七十年代,COTO更是凭借开发出的首款获得专利的低热电动势簧片继电器,一跃成为业界领先的干簧继电器制造商。

协顺电子(Finecables)公司的发展小趣事

随着公司业务的不断拓展,协顺电子逐渐意识到品质和创新的重要性。公司投入大量资金引进先进的生产设备和技术人才,同时加强内部管理和质量控制。此外,协顺电子还积极与国内外知名企业和研究机构合作,共同研发新产品和新技术。这些举措使得公司的产品质量和技术水平得到了显著提升,也赢得了客户的广泛赞誉。

Cressall Power Resistors公司的发展小趣事

随着国内市场的饱和,Cressall开始将目光投向国际市场。公司积极参与国际电子行业的展会和交流活动,与国际同行建立了广泛的联系。通过与国外企业的合作,Cressall不仅引进了先进的技术和管理经验,还成功打开了多个海外市场。同时,公司还加强了与国际知名企业的战略合作,共同开发新产品,进一步提升了公司的国际竞争力。

EM Devices Corporation公司的发展小趣事

在产品研发取得突破的同时,EM Devices Corporation也积极拓展市场,寻求与国际企业的合作。公司参加了多个国际电子展,展示了自己的产品和技术实力。通过与国外企业的交流与合作,公司不仅获得了更多的市场机会,还学习到了先进的生产和管理经验。这些经验为公司后续的发展奠定了坚实的基础。

Central Semiconductor公司的发展小趣事

随着全球电子市场的不断扩大和竞争的加剧,Central Semiconductor积极实施全球化战略,拓展国际市场。公司在全球范围内建立了完善的销售网络和供应链体系,以确保产品能够及时、准确地到达客户手中。

同时,Central还不断开拓新的业务领域,如汽车电子、工业控制、医疗电子等。通过不断的技术创新和市场拓展,Central逐渐在多个领域取得了显著的业绩和市场份额。

这五个故事分别从不同的角度展示了Central Semiconductor在电子行业中的发展历程和成就。无论是坚守与转型、创新开发、对停产产品的支持、裸片产品的开发还是全球化布局与业务拓展,Central都展现出了其敏锐的市场洞察力和强大的市场竞争力。这些故事不仅是对Central发展历史的回顾,也是对其未来发展的展望和期许。

问答坊 | AI 解惑

如何鉴别芯片真假,cecclab为你解答

怎么判定芯片的真伪? 概述: 通过化学腐蚀及物理显微观察、简单电性能等方法,来检验鉴定器件是否为原半导体厂商的器件。 检验的内容: A、货品外包装、湿度标示卡、器件日期批号等检查确认及记录 B、外观检测,器件的表面状况、印字标准、重 ...…

查看全部问答>

WINCE SDK平台改变后出现的问题!求助!

WINCE SDK平台改变后出现的问题: fatal error LNK1112: module machine type \'ARM\' conflicts with target machine type \'SH3\' 这要怎么解决啊???…

查看全部问答>

串口读取数据过滤

在用ddk做驱动时,在对 IRP_MJ_READ截获后 然后改变指向的buffer中的数据 最总发现用串口调试助手读取数据时并没有改变串口读到数据的内容, 请问应该怎样做能够从底层改变收到数据,最终使用串口调试助手时显示的是我修改的数据…

查看全部问答>

求驱动函数

菜鸟请高手指点 有三个设备A、B、C A是最底层,然后挂载B到A上面,也就是原来设备栈的顺序是 A--B (由底到顶) 现在我想在A,B的设备栈里面加入C,但是我不希望设备栈的顺序是 A--B--C(由底到顶) ,而是希望希望设备栈的顺序 是 A--C--B(由底到顶) ...…

查看全部问答>

SEFS安全透明加密内核

软件名称:SEFS安全透明加密内核 软件版本:1.0 建议分类:系统安全/文件加密 软件大小:635K 安装平台:Win2000/xp/2003 软件语言:简体中文/繁体中文/英文 软件授权:共享软件 软件主页:http://www.sefs.net 支持邮箱:admin@sefs.ne ...…

查看全部问答>

LPC2141的无刷直流电机控制系统设计

LPC2141的无刷直流电机控制系统设计 导读: 无刷直流电机是最常用的无刷电机。它易于驱动,速度可调且工作寿命长,适用于各类大小型工业应用,诸如小型马达的控制(如12 V直流无刷电机)。 关键字 LPC2141   ...…

查看全部问答>

vb上位机 51单片机下位机 编程

Visual Basic设计完成了上位机界面;同时利用51单片机作为下位机微处理器,采集无刷电机运行工作中的电压、电流和转速等基本参数,通过串行通讯口将数据上传至上位机系统中。上位机系统对下位机上传的数据加以分析计算,直观的绘制个参数的变化曲线 ...…

查看全部问答>

C2000/MSP430/电源的在线学习不能用了!!!!

C2000/MSP430/电源的在线学习不能用了!!!! 求关注,你们那里有这个现象没?…

查看全部问答>

电子工程师(开发)

电子专业本科以上学历,长期(至少五年以上)从事电子产品开发,能独立设计单片机软件、硬件,能独立完成产品研发,拥有丰富的开发和工艺经验。待遇从优。 五年以下工作经验者勿投 工资:3000-8000元。 福州名品电子科技有限公司现位于福州市科 ...…

查看全部问答>

xilinx FPGA 中的浮点运算的问题

请教各位兄弟:         项目中需要fpga zynq x702 的板子,要实现 y=atan((a-b)/(a+b)) 的公式运算,如何处理?        a b 分别为有符号整数,(a-b)/(a+b) 为小数    xi ...…

查看全部问答>