51单片机汇编学习例程(17)——KeyPad4X4篇[通俗易懂]

51单片机汇编学习例程(17)——KeyPad4X4篇[通俗易懂]​ASM17_KeyPad4X4:矩阵键盘,LCD1602显示按键值。(注意代码显示不全,最下面有Keil源码和Proteus工程)/*********************************************************************************@fileKeyPad.asm*@authorAlex——小白*@versionV1.0*@date2019.9.1*@brie.

大家好,又见面了,我是你们的朋友全栈君。

​ASM17_KeyPad4X4:矩阵键盘,LCD1602显示按键值。

(注意代码显示不全,最下面有Keil源码和Proteus工程)

51单片机汇编学习例程(17)——KeyPad4X4篇[通俗易懂]

仿真视频

/**
******************************************************************************
*   @file      KeyPad.asm
*   @author    Alex——小白
*   @version   V1.0
*   @date      2019.9.1
*   @brief     4X4矩阵键盘,LCD1602显示按键值
*  @store     有家Proteus仿真店子
*  @Link      https://shop484534014.taobao.com/
*  @Email     844545015@qq.com
******************************************************************************
*   @attention  All Rights Reserved  
**/
​
    KeyVal   EQU   30H      ;按键值
​
    LcdRs   EQU    P2.0    ;LCD1602引脚定义  
    LcdRw   EQU    P2.1
    LcdEn   EQU    P2.2
​
    ORG     0000H        ;程序执行的起始地址        
    LJMP    Main        ;跳转到main函数
    
    ORG     0100H        ;程序跳转到0100H开始执行
  Main:              ;最简单的按键赋值(8个按键)
    MOV   KeyVal,#0FFH
    LCALL   LCD_INIT      ;初始化GUI
    MOV   A,#080H
    LCALL  LCD_WCMD  
  While:
    LCALL  KeyPad    
    MOV   A,KeyVal
    CJNE   A,#0FFH,NEXT
    SJMP  While
  NEXT:    
    LCALL  LCD_WDAT
    MOV   KeyVal,#0FFH
    SJMP  While        ;While循环
​
  KeyPad:
    MOV   P1,#0FFH      ;默认高电平  
    CLR   P1.4        ;P14=0,查看第1列是否有按键触发
    MOV   A,P1        ;A=P1
    ANL   A,#0FH        ;A&0FH与
    XRL   A,#0FH        ;A^0FH异或,判断低4位是否有按键
    JZ     Col1        ;第1列,否则跳第2列
    LCALL   Delay        ;消抖后,再次检测
    MOV   A,P1        ;A=P1,再次判断是否有按键触发
    ANL   A,#0FH        ;A&0FH与
    XRL   A,#0FH        ;A^0FH异或    
    JZ     Col1
    MOV   A,P1
    ANL   A,#0FH
    CJNE   A,#0EH,Row1
    JNB    P1.0,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'1'
  Row1:  
    CJNE   A,#0DH,Row2
    JNB    P1.1,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'4'
    LJMP   Over
  Row2:  
    CJNE   A,#0BH,Row3 
    JNB    P1.2,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'7'
    LJMP   Over
  Row3:  
    CJNE   A,#07H,Col1 
    JNB    P1.3,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'0'
​
  Col1:
    MOV   P1,#0FFH      ;默认高电平  
    CLR   P1.5        ;P15=0,查看第2列是否有按键触发
    MOV   A,P1        ;A=P1
    JZ     Col2        ;第2列,否则跳第3列
    LCALL   Delay        ;消抖后,再次检测
    MOV   A,P1        ;A=P1,再次判断是否有按键触发
    ANL   A,#0FH        ;A&0FH与
    XRL   A,#0FH        ;A^0FH异或    
    JZ     Col2
    MOV   A,P1
    ANL   A,#0FH
    CJNE   A,#0EH,Row4
    JNB    P1.0,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'2'
​
  Row4:  
    CJNE   A,#0DH,Row5 
    JNB    P1.1,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'5'
  Row5:  
    CJNE   A,#0BH,Row6 
    JNB    P1.2,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'8'
​
  Row6:  
    CJNE   A,#07H,Col2 
    JNB    P1.3,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'C'
    
  Col2:
    MOV   P1,#0FFH      ;默认高电平  
    CLR   P1.6        ;P16=0,查看第3列是否有按键触发
    MOV   A,P1        ;A=P1
    ANL   A,#0FH        ;A&0FH与
    XRL   A,#0FH        ;A^0FH异或
    JZ     Col3        ;第3列,否则跳第4列
    LCALL   Delay        ;消抖后,再次检测
    MOV   A,P1        ;A=P1,再次判断是否有按键触发
    ANL   A,#0FH        ;A&0FH与
    XRL   A,#0FH        ;A^0FH异或    
    JZ     Col3
    MOV   A,P1
    ANL   A,#0FH
    CJNE   A,#0EH,Row7
    JNB    P1.0,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'3'
    LJMP   Over
  Row7:  
    CJNE   A,#0DH,Row8 
    JNB    P1.1,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'6'
    LJMP   Over
  Row8:  
    CJNE   A,#0BH,Row9 
    JNB    P1.2,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'9'
    LJMP   Over
  Row9:  
    CJNE   A,#07H,Col3 
    JNB    P1.3,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'='
    LJMP   Over
​
  Col3:
    MOV   P1,#0FFH      ;默认高电平  
    CLR   P1.7        ;P16=0,查看第3列是否有按键触发
    MOV   A,P1        ;A=P1
    ANL   A,#0FH        ;A&0FH与
    XRL   A,#0FH        ;A^0FH异或
    JZ     Over        ;结束
    LCALL   Delay        ;消抖后,再次检测
    MOV   A,P1        ;A=P1,再次判断是否有按键触发
    ANL   A,#0FH        ;A&0FH与
    XRL   A,#0FH        ;A^0FH异或    
    JZ     Over
    MOV   A,P1
    ANL   A,#0FH
    CJNE   A,#0EH,Row10
    JNB    P1.0,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'+'
​
  Row10:  
    CJNE   A,#0DH,Row11 
    JNB    P1.1,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'-'
​
  Row11:  
    CJNE   A,#0BH,Row12 
    JNB    P1.2,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'*'
  Row12:  
    CJNE   A,#07H,Over 
    JNB    P1.3,$        ;长按检测,若有则一直死循环
    MOV   KeyVal,#'/'
  Over:
    RET
​
​
  LCD_INIT:            ;初始化LCD1602
    LCALL  Delay        ;设置8线,5*7等
    MOV    A,#38H
    LCALL  LCD_WCMD
    LCALL  Delay
    MOV    A,#06H
    LCALL  LCD_WCMD
    LCALL  Delay
    MOV    A,#0CH
    LCALL  LCD_WCMD
    LCALL  Delay
    MOV    A,#01H
    LCALL  LCD_WCMD
    LCALL  Delay
    MOV     A,#80H        ;显示初始化数组TABLE_INIT,最下面可随意更改        
    LCALL  LCD_WCMD
    MOV    R0,#00H
    MOV    DPTR,#TABLE_INIT
  init0:              ;显示 "  LCD Initial   "
    MOV    A,R0  
    MOVC  A,@A+DPTR
    LCALL  LCD_WDAT
    NOP
    INC    R0
    CJNE  R0,#16,init0
    
    MOV     A,#0C0H        ;显示初始化数组TABLE_KeyPad
    LCALL  LCD_WCMD
    MOV    R0,#00H
    MOV    DPTR,#TABLE_KeyPad
  init1:              ;显示 "    KeyPad      "
    MOV    A,R0  
    MOVC  A,@A+DPTR
    LCALL  LCD_WDAT
    NOP
    INC    R0
    CJNE  R0,#16,init1  
​
    LCALL  Delay1s
    LCALL  Delay1s
    
    MOV    A,#01H        ;清屏
    LCALL  LCD_WCMD    
    RET
​
  LCD_WCMD:            ;LCD1602写指令,具体可见LCD中解释
    LCALL   LCD_Wait
    CLR     LcdEn
    CLR     LcdRs
    CLR     LcdRw
​
    NOP
    SETB    LcdEn
    NOP
    MOV     P0,A
    NOP                                            
    CLR     LcdEn
    NOP 
​
    RET
​
  LCD_WDAT:            ;LCD1602写数据
    LCALL   LCD_Wait
    CLR     LcdEn
    SETB    LcdRs
    CLR     LcdRw
    NOP
    SETB    LcdEn
    NOP  
    MOV     P0,A  
    NOP                                             
    CLR     LcdEn
    RET    
​
  Delay:              ;t=t1*20=10ms,修改R6的值即可更改时间(不精准)
    MOV    R6, #20        ;20
  D1:            
    MOV    R7, #0FAH      ;t1=250*2=500
  D2:    
    DJNZ  R7, D2        ;R7=250自减,直到为0跳出循环,双周期
    DJNZ  R6, D1        ;R6=020自减,直到为0跳出循环,双周期
    RET
​
  Delay1s:            ;t=t1*10=5ms,修改R6的值即可更改时间(不精准)
    MOV    R5, #08H      ;单周期,8次
  D3:                ;t1=t2*250=500*250=125000
    MOV    R6, #0FAH    
  D4:            
    MOV    R7, #0FAH      ;t2=250*2=500
  D5:    
    DJNZ  R7, D5        ;R7=250自减,直到为0跳出循环,双周期
    DJNZ  R6, D4        ;R6=250自减,直到为0跳出循环,双周期
    DJNZ  R5, D3        ;R5=100自减,直到为0跳出循环,双周期
    RET  
​
  TABLE_INIT:
    DB "  LCD Initial   "
  TABLE_KeyPad:
    DB "    KeyPad      "
​
  END  

如需下载Proteus仿真文件和Keil工程,请关注公众号:

Proteus仿真店子

(若需Proteus和keil安装包,后台回复:安装包;若需Proteus教学视频,后台回复:Proteus视频;若需其它设计,后台回复:51汇编设计

51单片机汇编学习例程(17)——KeyPad4X4篇[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144997.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SOP是什么?SOP的作用是什么?如何编写SOP?

    SOP是什么?SOP的作用是什么?如何编写SOP?SOP是由StandardOperationProcedure这三个英文单词的首个字母组合而成。也就是以统一化的标准将操作流程的步骤和要求罗列出来,用于指导和规范日常工作。SOP的核心,就是把特定流程的关键问题细化及量化。SOP是以文件的方式归纳总结操作人员在实际生产过程中的具体操作步骤和应当要注意的事项,它是车间现场操作人员的作业指导模板,也是质量检验人员用于检测指导工作的依据。SOP的作用:1、把企业长期累积的经验技术记录归纳,汇总成简单易懂的标准化文件,即使出现操作人员变动也不会使已有的技

    2022年5月9日
    56
  • Markdown中Latex 数学公式基本语法

    Markdown中Latex 数学公式基本语法Markdown中Latex数学公式基本语法公式排版分为两种排版:-行内公式:用\或者$包裹公式-独立公式:用\$包裹公式。例如:$\sum_{i=0}^{n}i^2$表示∑ni=0i2\sum_{i=0}^{n}i^2$$\sum_{i=0}^{n}i^2$$表示∑i=0ni2\sum_{i=0}^{n}i^2一下

    2022年6月16日
    20
  • L1-046 整除(模拟除法)

    L1-046 整除(模拟除法)原题链接这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 ——

    2022年8月9日
    2
  • C语言中break和continue的用法「建议收藏」

    C语言中break和continue的用法「建议收藏」switch选择switch(表达式){ case常量表达式1:语句1; case常量表达式1:语句1; default:语句3;}所有case后面的表达式只能是:枚举常量、数值变量、字符常量、常变量#include<stdio.h>intmain(void){ intval; printf(“请输入您想进入的层数:”); sca…

    2022年6月6日
    27
  • java开发面试题(40个常问面试题含答案,亲测有效)「建议收藏」

    java开发面试题(40个常问面试题含答案,亲测有效)「建议收藏」连接数据库的配置和操作加载JDBC驱动程序提供JDBC连接的URL创建数据库的连接需要向java.sql.DriverManager请求并获得Connection对象创建一个Statement对象执行SQL语句关闭JDBC对象创建对象的四种方式?1.使用new关键字创建对象2.通过反射的方式3.通过clone的方式j4.通过反序列化的方式接口与抽象类的区别?一个类只能继承一个抽象类,但可以实现多个接口抽象类可以有构造器,但接口不能有构造器抽象类中可以包含非抽象的普通方法,接口

    2022年7月7日
    23
  • 第五章:redis持久化,包括rdb和aof两种方式[通俗易懂]

    第五章:redis持久化,包括rdb和aof两种方式[通俗易懂]第五章:redis持久化,包括rdb和aof两种方式

    2022年4月23日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号