📄 option.asm
字号:
;************************************************
;Project Name : option
;Create Date : 2007-01-24 16:10
;Version : V1.0
;************************************************
.CHIP R65C02
.LINKLIST
.SYMBOLS
.LIST ON
.DEBUG ASM
;************************************************
.INCLUDE SD5215A.h
;************************************************
;define bits
bit0: EQU 00000001b
bit1: EQU 00000010b
bit2: EQU 00000100b
bit3: EQU 00001000b
bit4: EQU 00010000b
bit5: EQU 00100000b
bit6: EQU 01000000b
bit7: EQU 10000000b
;iob bit6/7 status led
equal: EQU bit7
no_equal: EQU bit6
;define ram ;定义RAM
delayram: EQU 30h
cnt0: EQU 31h
cnt1: EQU 32h
cnt2: EQU 33h
cnt3: EQU 34h
cnt4: EQU 35h
cnt5: EQU 36h
cnt: EQU 37h
flag_iob: EQU 38h
flag_iob_old: EQU 39h
temp1: EQU 3ah
temp2: EQU 3bh
key_temp: EQU 3ch
flag_temp: EQU 3dh
key_num: EQU 3eh
keyvalue: EQU 40h
keyvalue_temp: EQU 41h
; key_num: EQU 42h
;************************************************
.PAGE0
.ORG 00h
nop
nop
;************************************************
.CODE
.ORG A000h
Reset: ;初始设置
sei
ldx #74h
txs
stz IRQEVT
stz IOADIR
lda #0ffh
stz IOAOPD
lda #0ffh
sta IOBDIR
sta IOB
stz IOBOPD
lda #ffh
sta IOBPLH
lda #00001010b
sta MCLK
ldx #0
setram: ;设置RAM为0FF
stz IRQEVT
lda #0ffh
sta 100h,x
inx
cpx #70h
bcc setram
ldx #0
L_ClearRAM?: ;把RAM清0
stz IRQEVT
stz 100h,X
inx
cpx #70h
bcc L_ClearRAM?
jsr scan_option
lda flag_iob
sta flag_iob_old
;************************************************
main:
sei
stz IRQEVT
jsr display_led
jsr scan_key
lda key_num
bne main
jsr scan_option
jmp main
;************************************************
; lda key_num
; beq main_led
; lda #00111111b
; and IOB
; sta IOB
; jmp main
;
;main_led:
; lda #11000000b
; ora IOB
; sta IOB
; jmp main
;************************************************
display_led:
stz IRQEVT
lda flag_iob
eor flag_iob_old
bne display_no_equal
; SMBn IOB,no_equal
; RMBn IOB,equal
lda #no_equal
ora IOB
and #.not.equal
sta IOB
rts
; jmp main
display_no_equal:
; RMBn IOB,no_equal
; SMBn IOB,equal
lda #equal
ora IOB
and #.not.no_equal
sta IOB
rts
; jmp main
;************************************************
scan_key:
stz IRQEVT
; lda keyvalue ; 3
; sta keyvalue_temp ; 3
stz key_num
stz key_temp
lda #0ffh
sta IOAOPD
lda #00h
sta IOBOPD
; lda #10000000b
; ora IOB
; sta IOB
; lda #11000000b
; and IOB
; sta IOB
stz IOADIR ; 端口A为输入
stz IOAPLH ; 有上拉电阻
lda #11111111b ; 端口B为输出
sta IOBDIR
; 读取端口A的值,判断是否有键按下
lda #11000000B ; 2
and IOB ; 3,保留LED和SCL状态
sta IOB ; 3
jsr delay100us
lda IOAPAD ; 3,读取端口A的引脚状态
eor #0FFH ; 3
bne scan_again ; 2,检测是否有按键按下,没有则退出扫描
scan_exit:
; stz keyvalue
stz key_num
jmp scan_key_end
; rts
scan_again:
; 延时2.5ms,防止按键抖动
lda #25
sta temp1
jsr delay100us ; (11*4+7)*196+23=10023个指令(2500.5us)
; 读取端口A的值,判断是否有键按下
lda #11000000B ; 2
and IOB ; 3,保留LED状态
sta IOB ; 3
lda #1
sta temp1
jsr delay100us
lda IOAPAD ; 3,读取端口A的引脚状态
eor #0FFH ; 3
beq scan_exit ; 为0跳转scan_exit
scan_study:
lda #00111111b
ora IOB
sta IOB
lda #1
sta temp1
jsr delay100us
lda IOAPAD ; 读取端口A的引脚状态
eor #0FFH
beq scan_b0
sta key_temp
scan_study_loop: ;
asl a
bcc scan_study_loop1
inc key_num
scan_study_loop1:
bne scan_study_loop
nop
lda key_num
cmp #2
bcc scan_b0
jmp scan_key_end
scan_b0: ; 键盘程序
lda #11000001b
sta IOBDIR
sta IOBPLH
lda #11111110b
and IOB
sta IOB
lda IOAPAD
eor #0FFH
beq scan_b1
sta temp2
and key_temp
cmp key_temp
bne scan_b0_loop
eor #0ffh
and temp2
scan_b0_loop:
asl a
bcc scan_b0_loop1
inc key_num
scan_b0_loop1:
bne scan_b0_loop
nop
lda key_num
cmp #2
bcc scan_b1
jmp scan_key_end
scan_b1:
lda #11000010b
sta IOBDIR
sta IOBPLH
lda #11111101b
and IOB
ora #00000001b
sta IOB
lda IOAPAD
eor #0FFH
beq scan_b2
sta temp2
and key_temp
cmp key_temp
bne scan_b1_loop
eor #0ffh
and temp2
scan_b1_loop:
asl a
bcc scan_b1_loop1
inc key_num
scan_b1_loop1:
bne scan_b1_loop
nop
lda key_num
cmp #2
bcc scan_b2
jmp scan_key_end
scan_b2:
lda #11000100b
sta IOBDIR
sta IOBPLH
lda #11111011b
and IOB
ora #00000011b
sta IOB
lda IOAPAD
eor #0FFH
beq scan_b3
sta temp2
and key_temp
cmp key_temp
bne scan_b2_loop
eor #0ffh
and temp2
scan_b2_loop:
asl a
bcc scan_b2_loop1
inc key_num
scan_b2_loop1:
bne scan_b2_loop
nop
lda key_num
cmp #2
bcc scan_b3
jmp scan_key_end
scan_b3:
lda #11001000b
sta IOBDIR
sta IOBPLH
lda #11110111b
and IOB
ora #00000111b
sta IOB
lda IOAPAD
eor #0FFH
beq scan_b4
sta temp2
and key_temp
cmp key_temp
bne scan_b3_loop
eor #0ffh
and temp2
scan_b3_loop:
asl a
bcc scan_b3_loop1
inc key_num
scan_b3_loop1:
bne scan_b3_loop
nop
lda key_num
cmp #2
bcc scan_b4
jmp scan_key_end
scan_b4:
lda #11010000b
sta IOBDIR
sta IOBPLH
lda #11101111b
and IOB
ora #00001111b
sta IOB
lda IOAPAD
eor #0FFH
beq scan_b5
sta temp2
and key_temp
cmp key_temp
bne scan_b4_loop
eor #0ffh
and temp2
scan_b4_loop:
asl a
bcc scan_b4_loop1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -