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

📄 11.asm

📁 单片机实验程序-13种-17.4M-pdf.zip
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;***************************;
;     数控调频台控制器      ;
;***************************;
;
;26H-29H放显示小数位、个位、十位、百位BCD码数,24H-25H放频率控制数据(十六进制)
;
             CONBITL  EQU  21H  ;频率控制字节低8位
             CONBITH  EQU  22H  ;频率控制字节高8位
             KEYWORD  EQU  23H  ;存放键扫描时P1口值
;
;
              ORG	0000H   ;程序开始地址
              LJMP      START    ;转START执行
              ORG 	0003H       ;
              RETI       		;不用中断程序
              ORG 	000BH       ;
	      RETI       		; 不用中断程序
              ORG 	0013H       ;
	      RETI       		; 不用中断程序
	      ORG 	001BH       ;
	      RETI       		; 不用中断程序
	      ORG 	0023H       ;
	      RETI       		; 不用中断程序
	      ORG	 002BH      ;
 	      RETI       		; 不用中断程序
;
;初始化程序
CLEARMEN:    MOV   R0,#20H       ;20H-29H循环清0
             MOV   R1,#0AH       ;
CLEARLOOP:   MOV   @R0,#00H      ;
             INC   R0       		 ;
             DJNZ  R1,CLEARLOOP  ;
             MOV   P0,#0FFH      ;四端口置1
             MOV   P1,#0FFH      ;
             MOV   P2,#0FFH      ;
             MOV   P3,#0FFH      ;
             CLR   P3.0       	;BH1415禁止操作
             CLR   P3.1       	;
             CLR   P3.2       	;
             LCALL KEYFUN15      ;置立体声发射方式,开立体声发射指示灯
CLEAR1:      MOV   PCON,#00H    	;控制寄存器清0
             MOV   29H,#00H       	; 置初始值为88MHZ(显示为088.0)
             MOV   28H,#08H   		;
             MOV   27H,#08H       	;
             MOV   26H,#00H       	;
             LCALL DISPUPDAT    		;写入BH1415芯片(修改发送频率)
             RET       				;子程序返回
;
;主程序
START:       LCALL  CLEARMEN       	;上电初始化
MAIN:        LCALL  KEYWORK        	;调查键子程序
             LCALL  DISPLAY        	;LED显示一次
             AJMP   MAIN       		;转MAIN循环
             NOP       				;PC出错处理
             NOP       				;
             AJMP   START       		;重新初始化
;
; 4*4行列扫描查键子程序
KEYWORK:     MOV    P1,#0FFH     	; 置P1口为输入状态
             CLR    P1.0       		;扫描第一行(第一行为0)
             MOV    A,P1       		;读入P1口值
             ANL    A,#0F0H       	;低四位为0
             CJNE   A,#0F0H,KEYCON  ;高四位不为全1(有键按下)转KEYCOON
             SETB   P1.0       		; 扫描第二行(第二行为0)
             CLR    P1.1       		;
             MOV    A,P1       		; 读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCON  ; 高四位不为全1(有键按下)转KEYCOON
             SETB   P1.1       		; 扫描第三行(第三行为0)
             CLR    P1.2       		;
             MOV    A,P1       		; 读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCON   ; 高四位不为全1(有键按下)转KEYCOON
             SETB   P1.2       		; 扫描第四行(第四行为0)
             CLR    P1.3       		;
             MOV    A,P1       		; 读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCON   ; 高四位不为全1(有键按下)转KEYCOON
             SETB   P1.3       		;结束行扫描
             RET       				;子程序返回
KEYCON:      LCALL  DL10MS          ;消抖处理
             MOV    A,P1       		;再读入P1口值
             ANL    A,#0F0H       	; 低四位为0
             CJNE   A,#0F0H,KEYCHE   ; 高四位不为全1,确有键按下,转KEYCHE
KEYOUT:      RET       				;干扰,子程序返回
KEYCHE:      MOV    A,P1       		;读P1口值
             MOV    KEYWORD,A        ;放入23H暂存
CJLOOP:      LCALL  DISPLAY       	;调显示子程序
             MOV    A,P1       		;读P1口值
             ANL    A,#0F0H       	;低四位为0
             CJNE   A,#0F0H,CJLOOP   ;高四位为全1(键还按着),转CJLOOP等待释放
             MOV    R7,#00H       	;键释放,置R7初值为#00H(查表次数)
             MOV    DPTR,#KEYTAB     ;取键值表首址
CHEKEYLOOP:  MOV    A,R7       		;查表次数入A
             MOVC    A,@A+DPTR       ;查表
             XRL    A,KEYWORD       	;查表值与P1口读入值比较
             JZ     KEYOK       		;为0(相等)转KEYOK
             INC    R7       			;不等,查表次数加1
             CJNE   R7,#10H,CHEKEYLOOP   ;查表次数不超过16次转CHEKEYLOOP再查
             RET       					;16次到,退出
;
KEYOK:       MOV    A,R7       		;查表次数入A(即键号值)
             MOV    B,A       		;放入B
             RL	    A       			;左移
	     ADD    A,B       		;相加(键号乘3处理JMP 3字节指令)
	     MOV    DPTR,#KEYFUNTAB	;取键功能散转表首址
	     JMP    @A+DPTR       	;查表
KEYFUNTAB:   LJMP   KEYFUN00       	; 键功能散转表。跳至0号键功能程序
	     LJMP   KEYFUN01       	; 跳至01号键功能程序
             LJMP   KEYFUN02       	; 跳至02号键功能程序
	     LJMP   KEYFUN03
             LJMP   KEYFUN04
	     LJMP   KEYFUN05
             LJMP   KEYFUN06
	     LJMP   KEYFUN07
             LJMP   KEYFUN08
	     LJMP   KEYFUN09
             LJMP   KEYFUN10
	     LJMP   KEYFUN11
             LJMP   KEYFUN12
	     LJMP   KEYFUN13
             LJMP   KEYFUN14
	     LJMP   KEYFUN15       	; 跳至15号键功能程序
             RET       				;散转出错返回
;
;键号对应P1口数值表(同时按下两键为无效操作)
KEYTAB:      DB     0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
             DB    0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;
;0号键功能程序
KEYFUN00:    INC    29H          	;百位数加1
             MOV    A,29H        	;入A
             CLR    C         		;清进位标志
             CJNE   A,#02H,FUN00     ;
FUN00:       JC     FUN00OUT         ;百位小于2转FUNOO0UT
             MOV    29H,#00H         ;大于等于2清为0(百位只能是0或1)
FUN00OUT:    MOV    A,29H       		; 判断百位是0还是1
             XRL    A,#01H			;
             JNZ     F00OUT1			;若百位为0转FOOOUT1
             MOV    28H,#00H			;若百位为1,十位为0
             AJMP   F00OUT			;
F00OUT1:     MOV    28H,#08H			;若百位为0,十位数改为8
F00OUT:      LCALL  DISPUPDAT       ;写入控制芯片(修改发射频率)
             RET						;返回
;
;01号键功能程序
KEYFUN01:    INC    28H				;十位数加1
             MOV    A,28H			;入A
             CLR    C				;清进位标志
             CJNE   A,#0AH,FUN01		;判断是否小于10
FUN01:       JC     FUN01OUT			;十位数小于10转FUN01OUT
             MOV    28H,#00H			;十位数大于或等于10清为0
FUN01OUT:    MOV    A,29H			;判断百位数是0不是1
             XRL    A,#01H			;
             JNZ     F01OUT			;
             MOV    28H,#00H			;百位数为1时,十位数为0
             AJMP   F001OUT			;
F01OUT:      MOV    A,28H     		;百 位为0时,十位数只能是8或9
             XRL    A,#08H			;判断是不是8
             JZ     F001OUT			;十位数是8转F001OUT
             MOV    A,28H			;
             XRL    A,#09H			;判断是不是9
             JZ     F001OUT			;十位数是9转F001OUT
             MOV    28H,#08H			;不是8也不是9,十位赋值为8
F001OUT:     LCALL  DISPUPDAT       ;写入控制芯片(修改发射频率)
             RET						;返回
;
;02号键功能程序
KEYFUN02:    INC    27H				;个位数加1
             MOV    A,27H			;
             CLR    C				;
             CJNE   A,#0AH,FUN02		;判断是否小于10
FUN02:       JC     FUN02OUT			;小于10转FUN02OUT
             MOV    27H,#00H			;大于或等于10清为0
FUN02OUT:    LCALL  DISPUPDAT       ;写入控制芯片(修改发射频率)
             RET						;
;
;03号键功能程序
KEYFUN03:    INC    26H				;个位数加1
             MOV    A,26H			;
             CLR    C				;
             CJNE   A,#0AH,FUN03		;判断是不小于10
FUN03:       JC     FUN03OUT			;小于10转FUN03OUT
             MOV    26H,#00H			;大于或等于10清为0
FUN03OUT:    LCALL  DISPUPDAT       ;写入控制芯片(修改发射频率)
             RET      				;返回
;
;04号键功能程序(频率预置键)
KEYFUN04:    MOV   29H,#01H       ; 预置109.0MHZ发射频率
             MOV   28H,#00H
             MOV   27H,#09H
             MOV   26H,#00H
             LCALL  DISPUPDAT       ;写入控制芯片(修改发射频率)
             RET
;
;05号键功能程序(频率预置键)
KEYFUN05:    MOV   29H,#01H       ; 预置108.0MHZ发射频率
             MOV   28H,#00H
             MOV   27H,#08H
             MOV   26H,#00H
             LCALL  DISPUPDAT       ;写入控制芯片(修改发射频率)
             RET
;
;06号键功能程序(频率预置键)
KEYFUN06:    MOV   29H,#01H       ; 预置105.0MHZ发射频率
             MOV   28H,#00H

⌨️ 快捷键说明

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