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

📄 key.asm

📁 简单的单片机程序
💻 ASM
字号:

	org 0000h
	ajmp start
	org 0003h
	reti
	org 000bh
	reti
	org 0013h
	reti
	org 001bh
	reti
	org 0023h
	reti
        org 0030h
        
 start: CLR p3.5
MAIN:       
  
       MOV SP,#70H
       nop    	
       ;mov 40h,#50h
 ss:   nop
       aCALL p1_off
       NOP
       aCALL DELAY
 
 S2:   NOP
       NOP
       acall KEY
       ;aCALL KEY1
       nop
       ;mov 30h,a
       ACALL DISP
       nop
       AJMP S2
       
       
 DELAY:MOV R7,#0aH; time delay
 TM:   MOV R6,#0FFH
 TM6:  DJNZ R6,TM6
       DJNZ R7,TM
       NOP
       NOP
       RET
	
;*************************************************************************************
;键盘扫描
 KEY:  CLR P3.5
       MOV  P1,#0F0H	;令所有行为低电平
       MOV  R7,#0FFH 	;设置计数常数
 KEY1: DJNZ R7,KEY1	;延时
       MOV A,P1		;读取P1口的列值
       CPL A		;求反后,有高电平就有键按下
       ANL A,#0F0H	;判别有键值按下吗?
       JZ EKEY		;无键按下时退出
       LCALL DELAY	 ;延时20 ms去抖动
  SKEY:MOV A,#00		 ;下面进行行扫描,1行1行扫
       MOV R0,A		;R0作为行计数器,开始为0
       MOV R1,A 		;R1作为列计数器,开始为0
       MOV R3,#0FEH 	;R3为行扫描字暂存, 低4位为行扫描字(P1.0=0)
 SKEY2:MOV A,R3
       MOV P1,A         	;输出行扫描字,高4位全1
       NOP
       NOP
       NOP                     ;3个NOP操作使P1口输出稳定
       MOV A,P1	;读列值
       MOV R1,A 	;暂存列值
       CPL A		;高电平则有键闭合
       ANL A,#0F0H	;取列值
  S123:JNZ SKEY3	;有键按下转SKEY3,;无键按下时进行一行扫描
       INC R0 		;行计数器加1
       SETB C		;准备将行扫描左移1位,形成下一行扫描字,C=1保证输出行扫描字中高4位全为1,为列输入作准备, 低4位中只有1位为0
       MOV A,R3           	;R3带进位C左移1位
       RLC A
       MOV R3,A           	;形成下一行扫描字→R3
       MOV A,R0
       CJNE A,#04H,SKEY2	;最后一行扫(4次)完了吗?
  EKEY:RET
;列号译码
 SKEY3:MOV A,R1
       JNB ACC.4,SKEY5
       JNB ACC.5,SKEY6
       JNB ACC.6,SKEY7
       JNB ACC.7,SKEY8
       AJMP EKEY
 SKEY5:MOV A,#00H
       MOV R2,A 		;存0列号
       AJMP DKEY
 SKEY6:MOV A,#01H
       MOV R2,A		;存1列号
       AJMP DKEY
 SKEY7:MOV A,#02H
       MOV R2,A 		;存2列号
       AJMP DKEY
 SKEY8:MOV A,#03H
       MOV R2,A		;存3列号
       AJMP DKEY
;键位置译码
 DKEY: MOV A,R0		;取行号
       ACALL DECODE
       AJMP EKEY
;键值(键号)译码
DECODE:MOV A,R0 		;取行号送A
       MOV B,#04H		;每一行按键个数
       MUL AB		;行号×按键数
       ADD A,R2 		;行号×按键数+列号=键值(号),在A中
       MOV 30H,A
       RET


;******************************************************************************************
;显示子程序
led_asc:
                db 11111100B;0
                db 01100000B;1
                db 11011010B;2
                db 11110010B;3
                db 01100110B;4
                db 10110110B;5
                db 10111110B;6
                db 11100000B;7
                db 11111110B;8
                db 11110110B;9
                DB   11101110B;a=>A
                DB   00111110B;B=>B
                DB   10011100B;C=>C
                DB   01111010B;D=>D
                DB   10011110B;E=>E
                DB   10001110B;F=>F
                DB   01101110B;H=>10H
                DB   00011100B;L=>11H
                DB   11101100B;N=>12H
                db   00101010b;n=>13h
                db   11111100b;O=>14h
                dB   00111010B;o=>15H
                DB   11001110B;P=>16H
                DB   11100110B;Q=>17H
                DB   00001010B;r=>18H
                DB   10110110B;S=>19H
                DB   01111100B;U=>1AH
                DB   00111000B;u=>1BH
                DB   00000000B;BLACK=>1CH
                DB   11111111B;8.=>1DH
		db   00000010b;-=>1Eh
		db   00011110b;t=>1Fh
                db 11111101B;0.=>20h
                db 01100001B;1.
                db 11011011B;2.
                db 11110011B;3.
                db 01100111B;4.
                db 10110111B;5.
                db 10111111B;6.
                db 11100001B;7.
                db 11111111B;8.
                db 11110111B;9.=>29h
                DB 10000000B;;;;; RGY ,R=1 >2AH a= ren, b=green, c=yellow
                DB 01000000B;     G=1 ,>2BH
                DB 10100000B;;;;; RGY ,RY=1> 2CH
                DB 01100000B;     GR=1, >2DH     
		db 00000000b;y=>2Eh ;NO DIS
		
	;********************
p1_off:	        mov a,#0FFh 
		mov p1,a
		ret

sbuf_out:	mov sbuf,a
		nop
		nop
		nop
		nop
		ret
       ;**********************
DISP:           
               	setb p3.5;开显示
		mov a,#0
		call p1_off
		call sbuf_out
		mov dptr,#led_asc
		
	        mov r5,#11011111b; 
	 
led_bit:
		mov a,30h
		movc a,@a+dptr
		call sbuf_out
		
		mov a,r5
		mov p1,a
        ;***************************
		mov a,#64h; old 020h
	ler1:
		dec a
		jnz ler1
                
		ret

;*********************************************************************************

END				

⌨️ 快捷键说明

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