历史上的今天
返回首页

历史上的今天

今天是:2025年03月08日(星期六)

2018年03月08日 | 采用AT89S51的并行口P1接4×4矩阵键盘程序

2018-03-08 来源:eefocus

    1.实验任务

    如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示 点击浏览下一页  

     

    图4.14.1

    2.硬件电路设计原理图

    5676  

     

     

    图4.14.2

    3.系统板上硬件连线设计

    (1.      把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;

    (2.      把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

    4.  程序设计内容

    (1.      4×4矩阵键盘识别处理

    (2.      每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

    5.程序框图

    56756 

    图4.14.3

    6.汇编源程序代码

    KEYBUF    EQU 30H

                ORG 00H

    START:      MOV KEYBUF,#2

    WAIT: 

                MOV P3,#0FFH

                CLR P3.4

                MOV A,P3

                ANL A,#0FH 

                XRL A,#0FH

                JZ NOKEY1

                LCALL DELY10MS

                MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JZ NOKEY1

                MOV A,P3

                ANL A,#0FH

                CJNE A,#0EH,NK1

                MOV KEYBUF,#0

                LJMP DK1

    NK1:        CJNE A,#0DH,NK2

                MOV KEYBUF,#1

                LJMP DK1

    NK2:        CJNE A,#0BH,NK3

                MOV KEYBUF,#2

                LJMP DK1

    NK3:        CJNE A,#07H,NK4

                MOV KEYBUF,#3

                LJMP DK1

    NK4:        NOP

    DK1:   

                MOV A,KEYBUF

                MOV DPTR,#TABLE

                MOVC A,@A+DPTR

                MOV P0,A

     

    DK1A:      MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JNZ DK1A

    NOKEY1:

                MOV P3,#0FFH

                CLR P3.5

                MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JZ NOKEY2

                LCALL DELY10MS

                MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JZ NOKEY2

                MOV A,P3

                ANL A,#0FH

                CJNE A,#0EH,NK5

                MOV KEYBUF,#4

                LJMP DK2

    NK5:        CJNE A,#0DH,NK6

                MOV KEYBUF,#5

                LJMP DK2

    NK6:        CJNE A,#0BH,NK7

               MOV KEYBUF,#6

                LJMP DK2

    NK7:        CJNE A,#07H,NK8

                MOV KEYBUF,#7

                LJMP DK2

    NK8:        NOP

    DK2:   

                MOV A,KEYBUF

                MOV DPTR,#TABLE

                MOVC A,@A+DPTR

                MOV P0,A

     

    DK2A:      MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JNZ DK2A

    NOKEY2:

                MOV P3,#0FFH

                CLR P3.6

                MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JZ NOKEY3

                LCALL DELY10MS

                MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JZ NOKEY3

                MOV A,P3

                ANL A,#0FH

                CJNE A,#0EH,NK9

                MOV KEYBUF,#8

                LJMP DK3

    NK9:        CJNE A,#0DH,NK10

                MOV KEYBUF,#9

               LJMP DK3

    NK10:      CJNE A,#0BH,NK11

                MOV KEYBUF,#10

                LJMP DK3

    NK11:      CJNE A,#07H,NK12

                MOV KEYBUF,#11

                LJMP DK3

    NK12:      NOP

    DK3:

                MOV A,KEYBUF

                MOV DPTR,#TABLE

                MOVC A,@A+DPTR

                MOV P0,A

     

    DK3A:      MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JNZ DK3A

    NOKEY3:

                MOV P3,#0FFH

                CLR P3.7

                MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JZ NOKEY4

                LCALL DELY10MS

                MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JZ NOKEY4

                MOV A,P3

                ANL A,#0FH

                CJNE A,#0EH,NK13

                MOV KEYBUF,#12

                LJMP DK4

    NK13:       CJNE A,#0DH,NK14

                MOV KEYBUF,#13

                LJMP DK4

    NK14:      CJNE A,#0BH,NK15

                MOV KEYBUF,#14

                LJMP DK4

    NK15:      CJNE A,#07H,NK16

                MOV KEYBUF,#15

                LJMP DK4

    NK16:      NOP

    DK4:   

               MOV A,KEYBUF

                MOV DPTR,#TABLE

                MOVC A,@A+DPTR

                MOV P0,A

     

    DK4A:      MOV A,P3

                ANL A,#0FH

                XRL A,#0FH

                JNZ DK4A

    NOKEY4:

                LJMP WAIT

    DELY10MS:

                MOV R6,#10

    D1:        MOV R7,#248

                DJNZ R7,$

                DJNZ R6,D1

                RET

    TABLE:      DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

                DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

                END

    7. C语言源程序

    #include

    unsigned char code table[]={0x3f,0x06,0x5b,0x4f,

                                0x66,0x6d,0x7d,0x07,

                                0x7f,0x6f,0x77,0x7c,

                                0x39,0x5e,0x79,0x71};

    unsigned char temp;

    unsigned char key;

    unsigned char i,j;

     

     

    void main(void)

    {

      while(1)

        {

          P3=0xff;

          P3_4=0;

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              for(i=50;i>0;i--)

              for(j=200;j>0;j--);

              temp=P3;

              temp=temp & 0x0f;

              if (temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;             

                  switch(temp)

                    {

                      case 0x0e:

                        key=7;

                        break;

                     case 0x0d:

                        key=8;

                        break;

                      case 0x0b:

                        key=9;

                        break;

                      case 0x07:

                        key=10;

                        break;

                   }

                  temp=P3;

                  P1_0=~P1_0;

                  P0=table[key];

                  temp=temp & 0x0f;             

                  while(temp!=0x0f)

                    {

                      temp=P3;

                      temp=temp & 0x0f;             

                    }

                }

            }

     

          P3=0xff;

          P3_5=0;

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              for(i=50;i>0;i--)

              for(j=200;j>0;j--);

              temp=P3;

              temp=temp & 0x0f;

              if (temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;             

                  switch(temp)

                    {

                      case 0x0e:

                        key=4;

                        break;

                      case 0x0d:

                        key=5;

                        break;

                      case 0x0b:

                        key=6;

                        break;

                      case 0x07:

                        key=11;

                        break;

                    }

                  temp=P3;

                  P1_0=~P1_0;

                  P0=table[key];

                  temp=temp & 0x0f;             

                  while(temp!=0x0f)

                    {

                      temp=P3;

                      temp=temp & 0x0f;             

                    }

                }

            }

     

          P3=0xff;

          P3_6=0;

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              for(i=50;i>0;i--)

              for(j=200;j>0;j--);

              temp=P3;

              temp=temp & 0x0f;

              if (temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;             

                  switch(temp)

                    {

                      case 0x0e:

                        key=1;

                        break;

                      case 0x0d:

                        key=2;

                        break;

                      case 0x0b:

                        key=3;

                        break;

                      case 0x07:

                        key=12;

                        break;

                    }

                  temp=P3;

                  P1_0=~P1_0;

                  P0=table[key];

                  temp=temp & 0x0f;             

                  while(temp!=0x0f)

                    {

                      temp=P3;

                      temp=temp & 0x0f;             

                    }

                }

            }

     

          P3=0xff;

          P3_7=0;

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              for(i=50;i>0;i--)

              for(j=200;j>0;j--);

              temp=P3;

              temp=temp & 0x0f;

              if (temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;             

                  switch(temp)

                    {

                      case 0x0e:

                        key=0;

                        break;

                      case 0x0d:

                        key=13;

                        break;

                      case 0x0b:

                        key=14;

                        break;

                      case 0x07:

                        key=15;

                        break;

                    }

                  temp=P3;

                  P1_0=~P1_0;

                  P0=table[key];

                  temp=temp & 0x0f;             

                  while(temp!=0x0f)

                    {

                      temp=P3;

                      temp=temp & 0x0f;             

                    }

                }

            }

        }

    }


推荐阅读

史海拾趣

Fischer Elektronik公司的发展小趣事

为了更好地服务全球客户,Fischer Elektronik积极实施国际化战略。公司在全球范围内建立了多个生产基地和销售网络,以确保能够快速响应市场需求并提供高质量的产品和服务。通过多年的努力,Fischer Elektronik已经成功进入了众多国际市场,并与众多知名企业建立了长期合作关系。这些合作不仅提升了公司的品牌知名度,也为其带来了更多的商业机会和发展空间。

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

随着全球环保意识的提高,AIE公司也积极响应号召,将环保理念融入企业的发展战略中。公司采用环保材料和工艺进行生产,减少了对环境的污染。同时,AIE还推出了一系列节能、环保的测试配件产品,帮助客户实现绿色生产和可持续发展。这种环保理念和可持续发展战略不仅提升了AIE的社会责任感,也为企业赢得了更多的市场机会。

这些故事虽然是虚构的,但它们基于AIE公司的基本信息和一般性的电子行业发展情况,展示了AIE公司可能的发展路径和成就。实际上,AIE公司的发展历程可能更加复杂和精彩,需要更深入的研究和了解才能揭示。

ABI Electronics公司的发展小趣事

随着业务的不断发展和产品的不断升级,ABI Electronics公司的品牌影响力也逐渐提升。其产品在市场上获得了良好的口碑和声誉,成为了电子行业内的知名品牌。同时,ABI还积极参与行业内的交流和合作,为行业的发展做出了积极的贡献,进一步提升了其在行业内的地位和影响力。

这五个故事展示了ABI Electronics公司在电子行业里的发展历程,从电路板测试技术的突破,到集成电路测试技术的创新,再到全球市场布局和合作伙伴关系的建立,以及研发实力的持续增强和品牌影响力的提升,都体现了ABI Electronics公司不断进取、不断创新的精神。

Amplitronix LLC公司的发展小趣事

随着国内市场的饱和,Amplitronix LLC开始寻求国际合作,以拓展海外市场。他们与多家国际知名企业建立了战略合作关系,共同研发新产品,开拓新市场。通过国际合作,公司不仅提升了品牌影响力,还获得了更多的技术资源和市场渠道。同时,公司也积极参与国际行业交流活动,展示了其技术实力和市场竞争力。

Horn公司的发展小趣事

为了更好地服务全球客户,Horn公司积极实施全球化战略。通过在海外设立分公司和与分销商建立紧密合作关系,Horn公司的产品和服务能够迅速覆盖到全球各地。这种全球化布局不仅提升了公司的市场影响力,还促进了技术交流与合作,为公司带来了更多的发展机遇。

Densitron公司的发展小趣事

人才是企业发展的关键因素。Densitron公司非常重视人才的培养和团队建设。公司建立了一套完善的人才培养机制,通过内部培训、外部学习等方式,不断提升员工的技能水平和综合素质。同时,公司还注重团队文化建设,鼓励员工之间的协作与交流。这些举措使得Densitron公司拥有一支高素质、高效率的团队,为公司的持续发展提供了有力保障。

问答坊 | AI 解惑

晶闸管在电力稳压器中的应用

摘要:在所研制的新型无触点电力稳压器中,采用晶闸管作为开关器件。文中介绍该系统基本工作原理,详细分析晶闸管在使用过程中存在的一些问题及解决方法。目前流行的电力稳压器大多采用伺服电机带动炭刷移动调整电压。它具有整机效率高、输出波形好 ...…

查看全部问答>

自学成才-电子工程师-找工作 General Electronics Engineer

我从小就有很强的好奇心和动手能力,想知道每一件东西是如何工作的,对自然科学非常着迷。我还记得,小学时因为在课堂上用钉子和电线做电磁铁被批评;初中因为画电路图做收音机被取笑;高中被禁止做一种能开所有教室门锁的万能钥匙。我父亲是一名中 ...…

查看全部问答>

tcpmp 的问题.

tcpmp 好不好用,下了一个, 在EVC下怎么编译不了?请高手介绍一下经验.…

查看全部问答>

闹钟的问题

用IAppointment设定一个闹钟,时间到了没有\"日程提醒\" 再去设定另一个闹钟,上一个已过时间的闹钟就马上蹦出\"日程提醒\"来,这是怎么回事? “日程提醒”界面好好象是poom画的,我想显示自己的闹钟界面该怎么做? 我的poom组件还需要其它设置 ...…

查看全部问答>

wince下用GDI加载bmp图片的方法(能提供下可用的代码吗?)跪求

wince下用GDI加载bmp图片的方法(能提供下可用的代码吗?)跪求…

查看全部问答>

arm9 开发板

想自己学一下嵌入式方面的东西,在网上看了一下arm9 的板子,但不知道哪一块比较合适 2410或是2440的,请大家推荐一块,价格合理,性能比较好,适合初学者的。支持linux和wince。…

查看全部问答>

wince 连接sql server解决方案

我现在使用c++在pda下需要访问sql server,使用RDA.现在有个问题就是需要实时的和sql server通讯,使用RDA速度总是有2秒左右的延时。 不知道是RDA固有的问题,还是sql server设置的问题? 在PDA上真的没有好的解决方案?不能直接连接sql server?不 ...…

查看全部问答>

飞思卡尔单片机MC9RS08KA8的C程序的例子

高手求助一下,哪位有MC9RS08KA8的C程序例子呢?急用!小女子新学,好歹不知道从何下手!谢谢各位的帮忙!…

查看全部问答>

讨论下mma7455的一些参数含义

最近在看mma7444的资料,看到里面有俩个中断脚,init1和init2,还看到里面讲到脉冲测试,水平测试。不知道脉冲测试和水平测试指的是什么东西?还有为啥有俩个中断引脚?这俩个引脚如何使用?还有大家怎么处理x,y,z轴的校准,以及如何处理得到的数据 ...…

查看全部问答>

很全面的传感器应用电路

文档一共讲述14章的内容,基本涉及了现有常用传感器的电路,分享给大家····…

查看全部问答>