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

📄 6t.asm

📁 非常实用的电子单片机设计程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;                 *************************************
;                 *        (SEND.ASM)               *
;                 *       十五路遥控发送控制器        *
;                 *              2001.7.18            *
;                 *************************************
;
;**********************************************************************
;*                                                                    *
;*           KEYX0  P1.0    1             40    VCC                   *
;*           KEYX1  P1.1    2             39    P0.0  KEYY0           *
;*           KEYX2  P1.2    3             38    P0.1  KEYY1           *
;*           KEYX3  P1.3    4             37    P0.2  KEYY2           *
;*                  P1.4    5             36    P0.3  KEYY3           *
;*                  P1.5    6             35    P0.4  KEYY4           *
;*                  P1.6    7             34    P0.5  KEYY5           *
;*                  P1.7    8             33    P0.6  KEYY6           *
;*                  RST     9             32    P0.7  KEYY7           *
;*           	    P3.0    10   MCS-51   31    EA    VDD             *
;*                  P3.1    11            30    ALE                   *
;*                  P3.2    12            29    PSEN                  *
;*                  P3.3    13            28    P2.7                  *
;*                  P3.4    14            27    P2.6                  *
;*   REMOTEOUT T1   P3.5    15            26    P2.5                  *
;*                  P3.6    16            25    P2.4                  *
;*                  P3.7    17            24    P2.3                  *
;*                 XTAL2    18            23    P2.2                  *
;*                 XTAL1    19            22    P2.1                  *
;*                   VSS    20            21    P2.0                  *
;*                                                                    *
;*                                                                    *
;**********************************************************************
;
;
;
;伪定义
        KEYX0           EQU     P1.0    ;P1.0 -- P1.3位键盘行扫描
        KEYX1           EQU     P1.1    ;本系统采用4 * 8 键盘阵列
        KEYX2           EQU     P1.2
        KEYX3           EQU     P1.3
        KEYY            EQU     P0      ;P0 口键盘列扫描
;
;
;
;
;*************************************
;*                                   *
;*      主程序和中断程序入口         *
;*                                   *
;*************************************
		ORG     0000H 		   	;程序执行开始地址
		AJMP    START               	;跳至START执行
		ORG     0003H      		;外中断0中断入口地址
         	RETI    	               	;中断返回(不开中断)
		ORG     000BH     		;定时器T0中断入口地址
		RETI              	        ;中断返回(不开中断)
                ORG     0013H  			;外中断1中断入口地址
        	RETI              	        ;中断返回(不开中断)
		ORG     001BH     		;定时器T1中断入口地址
		LJMP    INTT1     	        ;跳至INTT1中断服务程序
		ORG     0023H     		;串行口中断入口地址
		RETI              	        ;中断返回(不开中断)
		ORG     002BH     		;定时器T2中断入口地址
		RETI              	        ;中断返回(不开中断)
;
;*************************************
;*                                   *
;*       初 始 化 程 序              *
;*                                   *
;*************************************
CLEARMEMIO:     CLR	A			;A清0
		DEC	A			;A为#0FFH
		MOV     P0,A			;P0-P3口置1
                MOV     P1,A			;
                MOV     P2,A			;
                MOV     P3,A			;
                CLR     P3.5			;关遥控输出
CLEARMEM:       MOV     SP,#70H         	;设堆栈基址为70H
                MOV     IE,#00H          	;关所有中断
                MOV     IP,#01H			;设优先级
                MOV     TMOD,#22H		;8位自动重装初值模式
                MOV     TH1,#0F3H		;定时为13微秒初值
                MOV     TL1,#0F3H		;
                SETB    EA			;开总中断允许
		RET				;返回
;
;
;
;
;*************************************
;*                                   *
;*	       主  程  序                *
;*                                   *
;*************************************
START:          LCALL   CLEARMEMIO      	;调用初始化子程序
;
MAIN:           LCALL   KEYWORK         	;主体程序。调用查键子程序
		LJMP	MAIN				;转MAIN循环
		NOP							;PC值出错处理
		NOP
		NOP
		LJMP	START				;重新初始化
;
;*************************************
;*                                   *
;*        T1中断服务程序             *
;*                                   *
;*************************************
INTT1:          CPL     P3.5       			;40kHZ红外线遥控信号产生
		RETI        				;中断返回
;
;
;*************************************
;*                                   *
;*	键盘工作子程序(4 * 8 阵列)       *
;*	出口为各键工作程序入口           *
;*************************************
KEYWORK:        MOV		KEYY,#0FFH			;置列线输入状态
		CLR		KEYX0				;行线(P1口)全置0
		CLR		KEYX1
		CLR		KEYX2
		CLR		KEYX3
		MOV		A,KEYY		        ;读入P0口值
		MOV		B,A                 ;KEYY口值暂存B中
		CJNE		A,#0FFH,KEYHIT  ;不等于#0FFH,转KEYHIT(有键按下)
KEYOUT:		RET                         ;没有键按下返回
;
KEYHIT:         LCALL   DL10MS              ;延时去抖动
		MOV		A,KEYY              ;再读入P0口值至A
		CJNE	A,B,KEYOUT	    	;A不等于B(是干扰),子程序返回
		SETB	KEYX1		    	;有键按下,找键号开始,查0行
		SETB    KEYX2
		SETB	KEYX3
		MOV		A,KEYY              ;读入P0口值
		CJNE	A,#0FFH,KEYVAL0     ;P0不等于#0FFH,按下键在第0行
		SETB	KEYX0               ;不在第0行,开始查1行
		CLR		KEYX1
		MOV		A,KEYY              ;读入P0口值
		CJNE	A,#0FFH,KEYVAL1     ;P0口不等于#0FFH,按下键在第1行
		SETB	KEYX1               ;不在第1行,开始查2行
		CLR		KEYX2
		MOV		A,KEYY              ;读入P0口值
		CJNE	A,#0FFH,KEYVAL2     ;P0口不等于#0FFH,按下键在第2行
		SETB	KEYX2               ;不在第2行,开始查3行
		CLR		KEYX3
		MOV		A,KEYY              ;读入P0口值
		CJNE	A,#0FFH,KEYVAL3     ;P0口不等于#0FFH,按下键在第3行
		LJMP	KEYOUT              ;不在第3行,子程序返回
;
KEYVAL0:	MOV		R2,#00H				;按下键在第0行,R2赋行号初值0
                LJMP    KEYVAL4     		;跳到KEYVAL4
;
KEYVAL1:	MOV		R2,#08H				;按下键在第1行,R2赋行号初值8
                LJMP    KEYVAL4    			;跳到KEYVAL4
;
KEYVAL2:	MOV		R2,#10H				;按下键在第2行,R2赋行号初值16
                LJMP    KEYVAL4     		;跳到KEYVAL4
;
KEYVAL3:        MOV		R2,#18H				;按下键在第3行,R2赋行号初值24
		LJMP	KEYVAL4     		;跳到KEYVAL4
;
KEYVAL4:	MOV     DPTR,#KEYVALTAB   ; 键值翻译成连续数字
                MOV		B,A               ;P0口值暂存B内
                CLR     A                 ;清A
                MOV     R0,A              ;清R0
KEYVAL5:        MOV     A,R0              ;查列号开始,R0数据放入A
                SUBB    A,#08H            ;A中数减8
                JNC     KEYOUT            ;借位C为0,查表出错,返回
                MOV		A,R0              ;查表次数小于8,继续查,
                MOVC    A,@A+DPTR         ;查列号表
                INC     R0                ;R0加1
                CJNE		A,B,KEYVAL5   ;查得值和P0口值不等,转KEYVAL5再查
                DEC     R0                ;查得值和P0口值相等,R0减1
                MOV     A,R0              ;放入A(R0中数值即为列号值)
		ADD		A,R2		      ; 与行号初值相加成为键号值(0-31)
		MOV		B,A               ;键号乘3处理用于JMP散转指令
		RL		A                 ;键号乘3处理用于JMP散转指令
		ADD		A,B               ;键号乘3处理用于JMP散转指令
		MOV		DPTR,#KEYFUNTAB	  ; 取散转功能程序(表)首址
		JMP		@A+DPTR           ;散转至对应功能程序标号
KEYFUNTAB:	LJMP		KEYFUN00      ;跳到键号0对应功能程序标号
		LJMP		KEYFUN01      ;跳到键号1对应功能程序标号
		LJMP		KEYFUN02      ;跳到键号2对应功能程序标号
		LJMP		KEYFUN03      ;跳到键号3对应功能程序标号
		LJMP		KEYFUN04      ;跳到键号4对应功能程序标号
		LJMP		KEYFUN05      ;跳到键号5对应功能程序标号

⌨️ 快捷键说明

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