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

📄 option.asm

📁 万能遥控器原代码!技术非常成熟
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;************************************************
;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 + -