PIC16F877A控制4*4键盘的汇编语言
时间: 2023-10-14 18:06:38 浏览: 54
以下是使用PIC16F877A控制4*4键盘的汇编语言代码,可以实现按键扫描和检测功能:
```assembly
;*******************************************************************************
; 4*4键盘扫描程序
;*******************************************************************************
;配置P0-P3为输出引脚,用于控制4行
;配置P4-P7为输入引脚,用于检测4列上按键状态
;扫描方式为:按下某个键,相应的列电平会变为低电平
; 检测到低电平后,确定对应的行和列,得到按键值
;*******************************************************************************
ORG 0000h
;初始化程序
INIT:
MOVLW 0x00 ;配置为输出模式
TRIS PORTB ;将PORTB设置为输出端口,用于控制行
MOVLW 0xFF ;配置为输入模式
TRIS PORTD ;将PORTD设置为输入端口,用于检测列
CLRF PORTB ;将PORTB全部输出高电平
GOTO MAIN ;跳转到主程序
;主程序
MAIN:
MOVLW 0x01 ;先将第一行输出低电平
MOVWF PORTB
CALL DELAY ;延时一段时间,等待行电平稳定
BTFSS PIND, 4 ;检测第一列
GOTO KEY11 ;如果是第一列,跳转到KEY11处理
BTFSS PIND, 5 ;检测第二列
GOTO KEY12 ;如果是第二列,跳转到KEY12处理
BTFSS PIND, 6 ;检测第三列
GOTO KEY13 ;如果是第三列,跳转到KEY13处理
BTFSS PIND, 7 ;检测第四列
GOTO KEY14 ;如果是第四列,跳转到KEY14处理
MOVLW 0x02 ;将第二行输出低电平
MOVWF PORTB
CALL DELAY ;延时一段时间,等待行电平稳定
BTFSS PIND, 4 ;检测第一列
GOTO KEY21 ;如果是第一列,跳转到KEY21处理
BTFSS PIND, 5 ;检测第二列
GOTO KEY22 ;如果是第二列,跳转到KEY22处理
BTFSS PIND, 6 ;检测第三列
GOTO KEY23 ;如果是第三列,跳转到KEY23处理
BTFSS PIND, 7 ;检测第四列
GOTO KEY24 ;如果是第四列,跳转到KEY24处理
MOVLW 0x04 ;将第三行输出低电平
MOVWF PORTB
CALL DELAY ;延时一段时间,等待行电平稳定
BTFSS PIND, 4 ;检测第一列
GOTO KEY31 ;如果是第一列,跳转到KEY31处理
BTFSS PIND, 5 ;检测第二列
GOTO KEY32 ;如果是第二列,跳转到KEY32处理
BTFSS PIND, 6 ;检测第三列
GOTO KEY33 ;如果是第三列,跳转到KEY33处理
BTFSS PIND, 7 ;检测第四列
GOTO KEY34 ;如果是第四列,跳转到KEY34处理
MOVLW 0x08 ;将第四行输出低电平
MOVWF PORTB
CALL DELAY ;延时一段时间,等待行电平稳定
BTFSS PIND, 4 ;检测第一列
GOTO KEY41 ;如果是第一列,跳转到KEY41处理
BTFSS PIND, 5 ;检测第二列
GOTO KEY42 ;如果是第二列,跳转到KEY42处理
BTFSS PIND, 6 ;检测第三列
GOTO KEY43 ;如果是第三列,跳转到KEY43处理
BTFSS PIND, 7 ;检测第四列
GOTO KEY44 ;如果是第四列,跳转到KEY44处理
GOTO MAIN ;循环执行主程序
;按键处理程序
KEY11:
MOVLW '1' ;将按键值'1'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY12:
MOVLW '2' ;将按键值'2'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY13:
MOVLW '3' ;将按键值'3'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY14:
MOVLW 'A' ;将按键值'A'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY21:
MOVLW '4' ;将按键值'4'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY22:
MOVLW '5' ;将按键值'5'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY23:
MOVLW '6' ;将按键值'6'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY24:
MOVLW 'B' ;将按键值'B'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY31:
MOVLW '7' ;将按键值'7'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY32:
MOVLW '8' ;将按键值'8'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY33:
MOVLW '9' ;将按键值'9'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY34:
MOVLW 'C' ;将按键值'C'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY41:
MOVLW '*' ;将按键值'*'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY42:
MOVLW '0' ;将按键值'0'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY43:
MOVLW '#' ;将按键值'#'存入W
GOTO ENDKEY ;跳转到ENDKEY
KEY44:
MOVLW 'D' ;将按键值'D'存入W
GOTO ENDKEY ;跳转到ENDKEY
;按键处理结束
ENDKEY:
MOVWF PORTC ;将按键值存入PORTC,用于输出
CALL DELAY ;延时一段时间,等待按键稳定
CLRF PORTC ;清空PORTC,准备下一次输入
GOTO MAIN ;跳转到主程序
;延时程序
DELAY:
MOVLW 0xFF ;循环计数值
DELAY1:
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
NOP ;空操作
DECFSZ W, F ;循环计数器减1
GOTO DELAY1 ;继续循环
RETURN ;返回
```
此代码仅供参考,具体实现方式可能会因硬件连接方式和需要实现的功能而有所变化。