⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex3-3.asm

📁 《51单片机应用开发案例精选配套源代码
💻 ASM
字号:
;--------------程序信息-----------------
;文件名   : ex3-3.asm
;版本     : 1.0
;作者     :
;修改时间 :

;--------------程序说明------------------
;CHAP 3.3 扫描方式键盘输入实例

;-----------常量和变量声明---------------
		KEYIN EQU P1;

;--------------预定义--------------------

               ORG 0000H
               LJMP START

;------------中断入口地址分配------------
               ;ORG 0003H
               ;LJMP INT0PRG
               ;ORG 000BH
               ;LJMP INT1PRG
               ;ORG 0013H;
               ;LJMP
               ;ORG 0030H

START:
;--------------初始化子程序--------------
     MOV SP,60H;
;--------------主程序--------------------
MAIN:
        LCALL KEYBOARD;
LJMP MAIN


;----------------子程序------------------

;---------------------------------
;    行列式键盘扫描方式子程序部分
;---------------------------------
KEYBOARD:
        MOV R0,#00H;         r0寄存器保存键值,初始化清零
        MOV KEYIN,#0FH;     所有列置高电平
        MOV A,KEYIN;         读取行值
        MOV R0,A;             保存这次的行值
        LCALL DEYLAY10MS;   延时去抖
        MOV KEYIN,#0FH;      再读行值
        MOV A,KEYIN;
;CJNE A,R0,KEYBOARD;          比较去抖前后,相同则认为有键按下,否则重新读键值
CJNE A,#0FH,HAVEKEY;
        LJMP KEYBOARD;      
HAVEKEY:
        MOV KEYIN,#08H;      第一列置高电平扫描
        MOV A,KEYIN;         读出扫描的行值
        CJNE A,#08H,COL1;    判断按键是否在第一列
        LJMP COL2;           否,则跳转扫描下一列
COL1:  MOV R1,#00H;          是,则记下列数
JMP KEYBOARDEND;             跳转到键值处理部分
COL2:   CJNE A,#04H,COL22;   同上,判断按键是否在第二列
        LJMP COL3;
COL22:  MOV R1,#01H;         是,记下列数,第二列
JMP KEYBOARDEND;
COL3:   CJNE A,#02H,COL33;
        LJMP COL4;
COL33:  MOV R1,#02H;         记下列数,第三列
JMP KEYBOARDEND;
COL4:   CJNE A,#01H,COL44;
        LJMP KEYBOARD;
COL44:  MOV R1,#01H         ;第四列
        JMP KEYBOARDEND;
KEYBOARDEND:               ;键值处理程序块
        MOV A,R0;             
        LCALL COLSCAN;      判断按键在第几行,R0返回行基数
        MOV R0,A;             R1保存列数,R0保存行基数
        ADD A,R1;             则 键值=R1+R0
        MOV R0,A;
        RET;
;---------------------------------
;    行扫描方式识别子程序部分
;    R0返回行增加的键值基数     
;    具体是第一行R0<=0第三行R0<=8 第二行R0<=4第四行R0<=12
;---------------------------------
COLSCAN: MOV A,R0;           
        JNB ACC.4,ROW2;       判断是否是第一行
        MOV R0,#00H;          是,则R0=0保存行基数
        JMP COLSCANEND;     否,则跳转判断下一行
ROW2:  JNB ACC.5,ROW3;
        MOV R0,#04H;
        JMP COLSCANEND;
ROW3:  JNB ACC.6,ROW4;
        MOV R0,#08H;
        JMP COLSCANEND;
ROW4:  JNB ACC.7,COLSCANEND;
        MOV R0,#0CH;
        JMP COLSCANEND;
COLSCANEND: 
        RET;

;--------------中断子程序----------------

;---------------延时子程序---------------
DEYLAY10MS:  MOV R6,#40H;
DELAY0:     MOV R7,#248H;
            DJNZ R7,$;
            DJNZ R6,DELAY0;
            RET;


END

;---------------注意事项-----------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -