历史上的今天

今天是:2024年11月13日(星期三)

2019年11月13日 | PIC单片机开发板之矩阵键盘扫描(if()else嵌套方式)

发布者:烟雨江湖 来源: 51hei关键字:PIC单片机  矩阵键盘  扫描 手机看文章 扫描二维码
随时随地手机看文章

 /*
为自已写的矩阵键盘检测+数码管显示+蜂鸣器响
采用if().....else嵌套方式;编译通过,却后二列显示不出来(你找出来了吗?一个不算问题的问题)
*/
//----------------------------------------------------------------

#include

#define uint unsigned int

#define uchar unsigned char

__CONFIG(0x3B31);

const unsigned char table[] = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //数码管数组

//--------------------变量定义------------------------------------

uint keynum,keytem,num;  //定义变量,//keynum按键端口读回值,keytem为松手检测值(以示区分),num数码管 

//--------------------函数调用 声明-------------------------------

void init();    //初始化函数

void keyscan();    //矩阵键盘扫描

void didi(uchar dinum);  //蜂鸣器

void disp();  //数码管显示

//-------------------主函数---------------------------------------

void delay(x)  //延时函数,几乎每个程序都要用到,所以放在了主函数分界线内

{

uchar a,b;

for (a=x;a>0;a--)

for(b=110;b>0;b--);

}


void main()

{

init();  //初始化

while(1)

{

keyscan(); //矩阵键盘扫描

disp();  //数码管显示

}

}

//------------初始化函数-------------------------------------------

void init() 

{

TRISA=0;PORTA=0x02; //38译码器


TRISB=1;                       //矩阵键盘


TRISC=0;PORTC=0x01;; //38使能

TRISD=0;PORTD=0x00;  //LED灯(数码管)

TRISE=0;PORTE=0x00;  //蜂鸣器

}

//----------要调用的函数--------------------------------------------

void keyscan()

{                           //第一列扫描


PORTB=0xef;     //送出RB4=1110  1111

keynum=PORTB;    


keynum=keynum&0x0f; 


if(keynum!=0xef)   


{

  delay(5);   


  keynum=PORTB;   


  keynum=keynum&0x0f;

  if(keynum!=0x0f)  


  {

   keytem=keynum; 


   didi(1);

   while(keytem!=0x0f)


    {

    keytem=PORTB;

    keytem=keytem&0x0f; 


    }

  keynum=keynum|0xe0;  


  }


else       //第二列扫描

  {

  PORTB=0xdf;     


  keynum=PORTB;    


  keynum=keynum&0x0f; 


  if(keynum!=0xdf)  


   {

   delay(5);  


   keynum=PORTB;  


   keynum=keynum&0x0f;

   if(keynum!=0x0f)  


    {

    keytem=keynum;  


    didi(1);

    while(keytem!=0x0f) 


     {

     keytem=PORTB;

     keytem=keytem&0x0f;


     }

   keynum=keynum|0xd0;  


    }

   }

  else       


     {

   PORTB=0xbf;     


   keynum=PORTB;    


   keynum=keynum&0x0f; 


   if(keynum!=0xbf)  


   {

    delay(5);  


    keynum=PORTB;   


    keynum=keynum&0x0f;

    if(keynum!=0x0f)


     {

     keytem=keynum;  


     didi(1);

     while(keytem!=0x0f)


      {

      keytem=PORTB;

      keytem=keytem&0x0f;


      }

    keynum=keynum|0xb0;  


     }

    

    else       //第四列扫描

     {

     PORTB=0x7f;   


     keynum=PORTB;   


     keynum=keynum&0x0f;


     if(keynum!=0x7f)


      {

      delay(5);    


      keynum=PORTB;  


      keynum=keynum&0x0f;

      if(keynum!=0x0f) 


       {

       keytem=keynum;  


       didi(1);

       while(keytem!=0x0f) 


        {

        keytem=PORTB;

        keytem=keytem&0x0f;


        }

      keynum=keynum|0x70;   


       }

      }

     } //////// 


   }

  }

}

  }

}


void didi(uchar dinum)

{

uchar di_num;

for(di_num=dinum;di_num>0;di_num--)

{

RE0=1;

delay(100);

RE0=0;

delay(50);

}

}


void disp()

{

switch(keynum)

{

case 0xee:PORTD=table[1];break;

case 0xed:PORTD=table[2];break;

case 0xeb:PORTD=table[3];break;

case 0xe7:PORTD=table[4];break;

case 0xde:PORTD=table[5];break;

case 0xdd:PORTD=table[6];break;

case 0xdb:PORTD=table[7];break;

case 0xd7:PORTD=table[8];break;

case 0xbe:PORTD=table[9];break;

case 0xbd:PORTD=table[10];break;

case 0xbb:PORTD=table[11];break;

case 0xb7:PORTD=table[12];break;

case 0x7e:PORTD=table[13];break;

case 0x7d:PORTD=table[14];break;

case 0x7b:PORTD=table[15];break;

case 0x77:PORTD=table[0];break;

}


关键字:PIC单片机  矩阵键盘  扫描 引用地址:PIC单片机开发板之矩阵键盘扫描(if()else嵌套方式)

上一篇:PIC单片机的常见问题
下一篇:单片机C语言的位操作

推荐阅读

        新浪数码讯 11月13日上午消息,在“双11”的第十年,这个中国的人造节日也正在被外媒关注,尤其是苹果这样的全球品牌。在昨天的活动之后,阿里巴巴今天发布了在其双11购物活动中特定品牌的人气数据,苹果公司名列榜首。  国外媒体9to5mac的关注点就在他们经常报道的苹果公司及其相关产品领域,根据他们的说法,这个原本是“光棍节”的...
使用cnnt 对脉冲计数,TMR1对上升沿计时,TMR2对下降沿计时,TMR1设定为100MS的定时器,TMR2 设定为40MS的定时器。 脉冲周期 为50HZ到300HZ的变化,脉冲宽度为2MS到20MS的变化,检测脉冲的个数以及宽度。 按下RA0(UP)电机正转,开始对RA2外部脉冲计数判断宽度。cnnt=380时。停止电机转动按下RA5(DN)电机反转,开始对RA2外部脉冲...
LG电子宣布开发一种AR解决方案,支持各种显示器,如平视显示器(HUD)和中央信息显示器(CID),用于汽车应用。AR解决方案通过使用计算机生成的视觉图形增强真实世界,显示情景关键信息,如ADAS警报、导航提示、兴趣点(POI)或行人检测。它还支持完全可定制的AR用户界面建模,而无需复杂的编码来增强用户体验(UX)。这是与Candera GmbH合作的成果。LG的...
广告摘要声明广告【文/石头】近日,秦川机床发布公告,公司拟在西咸新区投资建设秦创原·秦川集团高档工业母机创新基地项目,计划投资总额约为10亿元。公告显示,本次投建工业母机创新基地项目主要研发和生产高端五轴加工中心、高端通用数控系统、精密测量仪器、智能机床、数字化制造中心及系统集成相关产品等。秦川机床称,项目符合国家产业政策和公司整...

史海拾趣

问答坊 | AI 解惑

仪陇153单片机实现灯的渐亮控制,请帮我看下出了什么问题?

以下是我编的用em78p153单片机控制led灯渐亮程序,没有发现有什么错误的地方,软件仿真过了。可是烧录后用万用表接p5口发现表的指针在3-4v间摆个不停。实在找不出软件有什么问题了。 会不会是153的ic不适合用于这样的控制啊?头疼。 R17 EQ ...…

查看全部问答∨

ASIC Verification Engineer

ASIC Verification Engineer LSI上海研发中心高薪诚聘通讯存储领域人才,薪水待遇优厚,部分人员有出国培训机会。(部门内部推荐,成功机会更大) 有意者请将中英文简历发送至:asic_tapeout@hotmail.com ASIC Verification Engineer DESCRIPTION ...…

查看全部问答∨

有人用过EP9307-II的板子吗?

如题,刚开始学,想请教一下。…

查看全部问答∨

WinCE下取得硬件唯一标识

首先问一下,硬件唯一标识是不是就是指IMEI号。 如果硬件唯一标识是指IMEI号,那么在WinCE5.0下如何取得呢,我找了资料了,很多人说用“lineGetGeneralInfo”这个方法,但是我在WinCE5.0上试了,首先WinCE5.0的SDK中没有CellCore.lib,我下载了WM ...…

查看全部问答∨

MSP430USB仿真器制作全套资料

在网上看见的,赶紧转发过来,以前一直想自己做一个,后来一连上了好几个项目,没有时间来玩了,其实工作了的朋友可以找利尔达买,透露个小秘密他们是可以讲价的,喊价400,买一送一,实际上和淘宝上价格差不多了,但是他们有技术支持和服务的,比 ...…

查看全部问答∨

请教版主:STM32的USB启动时序

使用芯片:STM32F103 我看参考手册的驱动部分要求需要等待一定时间,但是库代码没加延时(见以下红色部分)。我算了下我的系统不满足这个延时,但USB模块启动无异常,是不是根据自己时钟加上一个满足规格的延时更稳定一点? 谢谢版主指点! ...…

查看全部问答∨

DSP的地址线和数据线有相应的寄存器吗?

DSP的地址线和数据线有相应的寄存器吗?如果没有,那么怎么写数据呢? 另外,我在一本书上见到用DSP的低8位数据线连接LCD的数据线,用DSp的8-12位做LCD的控制线,不明白该怎样控制,是何道理,各位高手帮我解决一下吧,我是初学者,这些问题困扰我 ...…

查看全部问答∨

谁有IIC通信成功的程序

谁有IIC通信成功的程序,借我看看…

查看全部问答∨

这是什么元件?

这是什么元件? [ 本帖最后由 王阿东 于 2012-5-3 20:10 编辑 ]…

查看全部问答∨

感觉 【stm32/stm8】这块越来越垃圾

不知道为什么,感觉 【stm32/stm8】这块越来越垃圾 唉。。。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved