stc89c51单片机矩阵键盘扫描

发布者:HeavenlySunset最新更新时间:2018-06-22 来源: eefocus关键字:stc89c51  单片机  矩阵键盘扫描 手机看文章 扫描二维码
随时随地手机看文章
  1. #include  

  2. #include  

  3.   

  4. #define GPIO_KEY P0  

  5. #define GPIO_LED P1  

  6. unsigned char KeyValue;//存储键值  

  7. unsigned char code DIG_CODE[]={  

  8. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,  

  9. 0x7F,0x6F};  

  10.   

  11. void Delay10ms();//延时10ms  

  12. void KeyDown();//监测按键函数  

  13.   

  14. void main(void)  

  15. {  

  16.  while(1)  

  17.  {  

  18.   KeyDown();  

  19.   GPIO_LED=~DIG_CODE[KeyValue];  

  20.  }  

  21. }  

  22.   

  23. void Delay10ms()  

  24. {  

  25.         unsigned char i,j,k;  

  26.         for(i=5;i>0;i--)  

  27.         for(j=4;j>0;j--)  

  28.         for(k=248;k>0;k--);  

  29. }  

  30.   

  31.   

  32. void KeyDown(void)//扫描键盘代码  

  33. {  

  34.  char a=0;  

  35.  GPIO_KEY=0x0f;  

  36.  if(GPIO_KEY!=0x0f)//读取按键是否按下  

  37.  {  

  38.   Delay10ms();//延时10ms进行消抖  

  39.   if(GPIO_KEY!=0x0f)//在此监测按键是否按下  

  40.    {  

  41.     GPIO_KEY=0x0f;//测试列  

  42.     switch(GPIO_KEY)  

  43.     {  

  44.      case(0x07): KeyValue=0;break;  

  45.      case(0x0b): KeyValue=1;break;  

  46.      case(0x0d): KeyValue=2;break;  

  47.      case(0x0e): KeyValue=3;break;  

  48.     }  

  49.     //测试行                                 

  50.     GPIO_KEY=0xf0;  

  51.     switch(GPIO_KEY)  

  52.     {  

  53.      case(0x70): KeyValue=KeyValue;break;  

  54.      case(0xb0): KeyValue=KeyValue+4;break;  

  55.      case(0xd0): KeyValue=KeyValue+8;break;  

  56.      case(0xe0): KeyValue=KeyValue+12;break;  

  57.     }  

  58.     while((a<50)&&(GPIO_KEY!=0xf0))//按键松手测试  

  59.     {  

  60.      Delay10ms();  

  61.      a++;  

  62.     }  

  63.    }  

  64.  }  

  65. }  

解释:这里使用的方法是十字交叉法,就是一横一纵确定一个交叉点,当然方法不止一种。

关键字:stc89c51  单片机  矩阵键盘扫描 引用地址:stc89c51单片机矩阵键盘扫描

上一篇:51单片机外设之——按键的检测(带有标志位的按键识别法)
下一篇:51单片机之矩阵按键

推荐阅读最新更新时间:2024-03-16 16:06

基于32位单片机MC68HC376的高可靠性系统设计
引言 随着工业技术的不断发展,对单片机控制的要求也越来越高,需要单片机具备更高的反应速度和更强的数据处理能力,各种高性能的新型单片机得到了迅猛的发展和应用。单片机上主要是高速的数字信号,弱信号很容易受到外界的电磁干扰,同时,单片机系统也会发生掉电、死循环等问题。在工业控制场合,一旦控制发生错误,将会造成难以估计的损失。因此,如何提高控制的可靠性是长期以来的一个重要问题。本文介绍了应用32位高性能单片机MC68HC376的一种实际开发方案,同时重点讨论了提高系统可靠性的设计和实现方法。 MC68HC376是Motorola公司推出的一种新型的32位高性能单片机,具有极强的数据处理、逻辑运算和信息存储能力,且支持BDM(Backgr
[单片机]
51单片机|8个按键控制8个LED灯实现8种功能
任务描述: S1:LED灯全亮; S2:D1、D3、D5、D7亮,然后D2、D4、D6、D8再亮; S3:D5、D6、D7、D8亮; S4:D1、D2、D3、D4亮; S5:D2、D4、D6、D8亮; S6:D1、D3、D5、D7亮; S7:D3、D4、D7、D8亮; S8:D1、D2、D5、D6亮。 硬件电路图: 程序: #include reg51.h void delay(unsigned char i); void main() { unsigned char ledctr; P3=0xff; while(1) { ledctr=P3; switch(ledctr) { case 0xff:P1
[单片机]
51单片机dds 低频函数信号发生器Proteus仿真程序
单片机源程序如下: #include reg52.h #include lcd1602.h #include delay.h #include pltable.h #include key.h #include adc0832.h void timer0() interrupt 1 { TH0=THtemp; TL0=TLtemp; if(waveform==0) sine_out(); else if(waveform==1) triangle_out(); else if(waveform==2) square_out(); }
[单片机]
51<font color='red'>单片机</font>dds 低频函数信号发生器Proteus仿真程序
基于单片机SH79F168的航模无刷直流电机控制方案
  1 概述   无位置传感器的无刷直流电机(Brushless Direct Current Motor, BLDCM)由于其快速、可靠性高、体积小、重量轻等特点,在航模领域得到了广泛的应用。但是与有刷电机和有位置传感器的无刷直流电机相比,其控制算法要复杂得多。加上航模设计中对重量和体积的要求非常严格,因此要求硬件电路尽可能简单,更增加了软件的难度。   本文提出了一种基于中颖8位单片机SH79F168的控制方案,借助于该芯片片内集成的针对电机控制的功能模块,只需很少的外围电路即可搭建控制系统,实现基于反电动势法的无位置传感器BLDC控制,在保证稳定性和可靠性的基础上大大降低了系统成本。而且该芯片与传统8051完全兼容,易于
[单片机]
基于<font color='red'>单片机</font>SH79F168的航模无刷直流电机控制方案
KEIL单片机C语言精确延时值的计算
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。 共有三条延时函数说明如下: 函数调用分两级:一级是小于10US的延时,二级是大于10US的延时 // //----------微秒级延时--------- 延时时间=(3+5*X)/12 提示(单位us, X不能大于255) // { uchar data i; for(;Ms 0;Ms--) for(i=
[单片机]
国芯科技:新一代汽车电子域控制MCU产品内测成功
国芯科技11月3日公告,公司研发的新一代汽车电子域控制MCU产品“CCFC2016BC”于近日在公司内部测试中获得成功。 图源:官方 汽车电子域控制芯片产品CCFC2016BC是基于公司自主 PowerPC架构C*Core CPU内核研发的新一代汽车电子域控制芯片,是在已有 CCFC2012BC芯片基础上根据客户需求对功能的进一步增强和完善。
[汽车电子]
国芯科技:新一代汽车电子域控制<font color='red'>MCU</font>产品内测成功
51单片机开发中一些常用代码块
数码管中的16个字符 uchar code table ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; 延时函数(使用之前先声明一遍) void delay(uint); void delay(uint z) { uint x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } 点亮第一个二级管 #include reg52.h //点亮第一个发光二级管 sbit D1=P1^0;//P1是P1口,P1^0代表D1,D1为自己命名的变量 m
[单片机]
51单片机的4×4键盘识别与74LS164驱动数码显示
;P1口外接4×4键盘,输出使用74LS164驱动一位数码显示器。 ;当按下任一键时,在数码显示器上显示键值。 ;程序用汇编语言编写,用PROTEUS仿真调试的画面如下: ;程序如下: ORG 0000H LJMP START ORG 0030H START: MOV P1, #255 MOV 60H, #16 MAIN: CALL DISPLAY ;SJMP $ M_LOOP: CALL K_SCAN ;扫描程序 JB ACC.4, M_LOOP LJMP MAIN ;--------------------------------------- DISPLAY: MOV
[单片机]
51<font color='red'>单片机</font>的4×4键盘识别与74LS164驱动数码显示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved