📄 实验10_行列是键盘.s43
字号:
#include "msp430x44x.h "
;-------------------------------------------------------------
;MSP-Test44x Demo key,LCD
;
; MSP430F449
; -----------------
; /|\| XIN|-
; | | | key
; LCD --|RST XOUT|-
; ---------- | | | |
; | COM0|<---|COM0 P1.0|------>|1 2 3 * |
; | . | . | . . | . |4 5 6 0 |
; | COM3|<---|COM3 . | . |7 8 9 # |
; | S0 |<---|S0 . | . | |
; | . | . | P1.7|------>| |
; | S14|<---|S14 |
;
; Yang Rui
; Lierda, Inc
; NOVEMBER 2003
; Built with IAR Embedded Workbench Version: 1.26B
;--------------------------------------------------------------
flag equ 200h ;标志寄存器
led_disp_data equ 201h ;led 显示缓冲
led_disp_bit equ 202h ;led显示位选
com_byte equ 203h ;行扫描寄存器
buffer equ 204h
key_num equ 205h ;键值查表寄存器
counter1 equ 206h ;行扫描寄存
key_vaule equ 207h ;键值寄存器
key_buff equ 208h ;键盘缓冲
counter equ 209h ;lcd寄存
;---------------------------------------------------------------
;-------------- flag byte defin ---------------------------
;---------------------------------------------------------------
ms equ 01h ;0.5秒标志
key_press equ 02h ;键盘按下标志
flash_busy_bit equ 01h
;---------------------------------------------------------------
;--------------- port defin ----------------------------
;---------------------------------------------------------------
;P1.0 bsl
;P1.1 键盘行扫描输出
;P1.2 键盘行扫描输出
;P1.3 键盘行扫描输出
;P1.4 键盘列扫描输入
;p1.5 键盘列扫描输
;P1.6 键盘列扫描输
;P1.7 键盘列扫描输
;----------------------------------------------------------------
ORG 01100h
;----------------------------------------------------------------
Reset
mov.w #0a00h,SP
StopWDT
mov.w #WDTPW+WDTHOLD,&WDTCTL
mov.b #0ffh,&key_buff
bis.b #0fh,&P1DIR
bis.b #08h,P1OUT
bis.b #04h,P1OUT
bis.b #02h,P1OUT
call #lcd_display_ona ;open lcd
;----------------------------------------------------------------
;----------- 主程序区 ----------------------------
;----------------------------------------------------------------
mainloop
push.b &key_buff
pop.b &key_buff
mov.b #0ffh,r15
delay dec.b r15
jnz delay
call #lcd_display ;lcd display
call #scan_key_deal
jmp mainloop
;----------------------------------------------------------------
;---------------- lcd显示子程序 ------------------------------
;----------------------------------------------------------------
lcd_display
mov.b #LCDM1,R15
mov.b &key_buff,R13
and.b #0fh,R13
mov.b lcd_table(R13),R14
mov.b R14,1(R15)
mov.b R14,0(R15)
mov.b R14,3(R15)
mov.b R14,2(R15)
mov.b R14,5(R15)
mov.b R14,4(R15)
ret
;-----------------------------------------------------------
lcd_display_ona
mov.b #0FCh,&P5SEL ;Enable R(LCD) + COM Lines
mov.b #LCDON+LCD4MUX+LCDP1,&LCDCTL ;STK LCD 4Mux, S0-S19
call #show_clr ;clear LCD
mov.b #BTFRFQ1,&BTCTL
clr R9
ret
;-----------------------------------------------------------
;---------清显示存储区.
;-----------------------------------------------------------
show_clr
mov.b #00h,r15 ; clear display memory
show_clr1
mov.b #00h,LCDMEM(r15)
inc.b r15
cmp.b #0ah,r15
jnz show_clr1
ret
;--------------------------------------------------
;------------- 键盘扫描子程序 ----------------
;--------------------------------------------------
scan_key_deal
mov.b #0fh,P1DIR ;P1.4/5/6/7键盘输入
mov.b #0ffh,&com_byte
bic.b #08h,P1OUT
bic.b #04h,P1OUT
bic.b #02h,P1OUT
NOP
nop
nop
mov.b &P1IN,&buffer
and.b #0f0h,&buffer
cmp.b #0f0h,&buffer
jz ret_end ;没有键盘按下,转键盘扫描结束
bis.b #08h,P1OUT ;有键盘按下,分时逐行扫描
bis.b #04h,P1OUT
bis.b #02h,P1OUT
mov.b #0ffh,&com_byte
nop
nop
clr.b &key_num ;键盘计数器
mov.b #02h,&com_byte
bic.b com_byte,P1OUT
mov.b #03h,&counter1 ;行扫描计数器
setc ;set c=1
scan
bit.b #10h,&P1IN ;检测第一列
jz take_key_vaule ;有键按下,转查找键值
inc.b &key_num ;键盘计数器加1
bit.b #20h,&P1IN ;检测第二列
jz take_key_vaule ;有键按下,转查找键值
inc.b &key_num ;键盘计数器加1
bit.b #40h,&P1IN ;检测第三列
jz take_key_vaule ;有键按下,转查找键值
inc.b &key_num ;键盘计数器加1
bit.b #80h,&P1IN ;检测第四列
jz take_key_vaule ;有键按下,转查找键值
inc.b &key_num ;键盘计数器加1
rlc.b &com_byte ;扫描移位
bic.b com_byte,P1OUT ;下一行输出0
dec.b &counter1
jnz scan
ret_end
bic.b #key_press,&flag ;
mov.b #0ffh,key_vaule
ret
take_key_vaule
bis.b #key_press,&flag
test_key_m1
mov.b P1IN,&buffer ;等待键盘释放
and.b #0f0h,&buffer
cmp.b #0f0h,&buffer
jnz test_key_m1 ;键盘没有弹开(释放),继续检测
mov.b &key_num,R6 ;键盘释放,通过键盘计数器查表,取键值
mov.b key_table(R6),&key_vaule
mov.b key_table(R6),&key_buff
retun_end
ret
;-----------------------------------------------------------------
;------------键盘键值表-------------------------------------------
;-----------------------------------------------------------------
key_table
db 0bh ;*(key_vaule) 00(key_nem)
db 09h ;9 01
db 08h ;8 02
db 07h ;7 03
db 00h ;0 04
db 06h ;6 05
db 05h ;5 06
db 04h ;4 07
db 0ah ;# 08
db 03h ;3 09
db 02h ;2 0a
db 01h ;1 0b
;-----------------------------------------------------------
;-----------lcd显示代码表------------------------------------
;-----------------------------------------------------------
lcd_table
db 7bh ;0
db 12h ;1
db 4fh ;2
db 1fh ;3
db 36h ;4
db 3dh ;5
db 7dh ;6
db 13h ;7
db 7fh ;8
db 3fH ;9
DB 06dH ;e
DB 065H ;f
;------------------------------------------------------------
; Interrupt Vector Table
;-----------------------------------------------------------
RSEG INTVEC ; MSP430 RESET Vector
;-------------------------------------------------------------
DW Reset ;0FFE0h
DW Reset ;0FFE2h
DW Reset ;0FFE4h
DW Reset ;0FFE6h
DW Reset ;0FFE8h
DW Reset ;0FFEAh
DW Reset ;0FFECh
DW Reset ;0FFEEh
DW Reset ;0FFF0h
DW Reset ;0FFF2h
DW Reset ;0FFF4h
DW Reset ;0FFF6h
DW Reset ;0FFF8h
DW Reset ;0FFFAh
DW Reset ;0FFFCh
DW Reset ;0FFFEh
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -