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

📄 510.asm

📁 采用ti公司89s51型单片机
💻 ASM
📖 第 1 页 / 共 2 页
字号:
K             BIT           00H           ;按键标志位            一位数显示程序
DEL           BIT           01H           ;删除标志位
ENTER         BIT           02H           ;确定标志位
NUM_H         EQU           21H           ;答案高两位
NUM_L         EQU           22H           ;答案低两位
KEY_1         EQU           23H           ;第一次按键值 
KEY_2         EQU           24H           ;第二次按键值 
KEY_3         EQU           25H           ;第三次按键值 
KEY_4         EQU           26H           ;第四次按键值 
KEY_01        EQU           27H           ;第一次按键值液晶用 
KEY_02        EQU           28H           ;第二次按键值液晶用 
KEY_03        EQU           29H           ;第三次按键值 液晶用
KEY_04        EQU           2AH           ;第四次按键值液晶用 
DELAY_NUM     EQU           2BH           ;DEFINED DELAY TIME

          ORG    0000H
          LJMP   MAIN              ;转到主程序初始化
	  ORG    0003H
 	  LJMP   SERVEINT0
          ORG    000BH             
          LJMP   T0INT     
	  ORG    0013H		      ;;转到外部中断1
          LJMP   SERVEINT1  
          ORG    0100H
 ;;;;;;;;;;;;;;;
 ;;;;初始化程序
MAIN:     MOV    SP,#50H                  ;堆栈初值        
          CLR    P3.4
	  SETB    P3.5                   ;模块开始休眠
	 ; SETB   P3.7                     ;模块开始休眠
 	  MOV    P2,#00H
	  MOV    P0,#00H
          MOV    SCON,#50H                ;串口初始化,方式1
          MOV    PCON,#80H                ;smod=1,波特率19200
          MOV    TMOD,#21H                ;定时器T1方式2,T0方式1初始化
          MOV    TH1,#0FDH
          MOV    TL1,#0FDH
	  MOV    TH0,#00H                 ;定时器中断从初始化  
          MOV    TL0,#00H
	  SETB   PT0                      ;定时器T0高优先级
	  SETB   TR1                      ;打开串口中断
	  SETB    IT0                      ;外部中断0边沿触发
	  SETB    IT1                      ;外部中断1边沿触发
          MOV    P1,#0C0H                 ;p1口0-5为低电平  6,7为高电平
	  SETB   EA
          SETB   RS0
	  CLR    RS1
	  SETB   EX0               
          SETB   EX1
	  CLR    K
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;按键处理子程序
KEY1:     
           JNB    K,TIM20                   ;防止区间过长,加了中转  TIME50和slee相同,即 休眠子程序
           SETB   P3.4                   ;;电源管理电路
	   CPL    K
	   JB     DEL,TIM20               ;防止区间过长,加了中转
           JB     ENTER,RECEIV
           SETB   RS0
	   CLR    RS1
           MOV    NUM_L,R7                  ;答案为一位数的情况
           MOV    NUM_H,#00h
           MOV    KEY_1,R7
	   CLR    A
           MOV    A,#30H
 	   ADD    A,R7
	   MOV    KEY_01,A
	   SETB   ET0                         ;允许定时器T0中断
           SETB   TR0
K1:                              ;液晶显示
           LCALL SETUP
	   MOV A,#80H              ;;;;;第一行
           LCALL WRITE_COM
	   SETB   RS0
	   CLR    RS1
           MOV    R0,#27H
	   MOV R6,#1
           LCALL WRITE_ASCII
  	   CLR  A
           MOV A,#90H                ;;;;;第二行
           LCALL WRITE_COM
           MOV DPTR,#CHINESE1
           LCALL WRITE_HZ
           LCALL DELAY1             ;;;;;;;;;;可加延时,字常亮
KEY2:     
           JNB    K,TIME2                    ;计时过长,自动休眠
           AJMP   KEY20
TIME2:     SETB   RS0
	   CLR    RS1
           CJNE   R3,#0FFH,KEY2
TIM20:     AJMP   TIM30               ;防止区间过长,加了中转 TIME和slee相同,即 休眠子程序
RECEIV:    AJMP   RECEIVEEND01
KEY20:	   CLR    K
           JB     DEL,DELETE01               
           JB     ENTER,RECEIVEEND01
	   SETB   RS0
	   CLR    RS1
           MOV    KEY_2,R7
	   MOV    B,#10H                     ;答案为两位数的情况
     	   MOV    A,KEY_1
           MUL    AB 
           ADD    A,R7
           MOV    NUM_L,A 
 	   MOV    NUM_H,#00h
           CLR    A
           MOV    A,#30H
 	   ADD    A,R7
	   MOV    KEY_02,A
K2:        LCALL  SETUP                  ;液晶显示
           MOV    A,#80H              ;;;;;第一行
           LCALL  WRITE_COM
	   SETB   RS0
	   CLR    RS1
	   MOV    R0,#27H
	   MOV    R6,#2
           LCALL  WRITE_ASCII
	   CLR  A
           MOV A,#90H                ;;;;;第二行
           LCALL WRITE_COM
           MOV DPTR,#CHINESE2
           LCALL WRITE_HZ
           LCALL DELAY1                
KEY3:      JNB    K,TIME3 
           AJMP   KEY30
TIME3:     SETB   RS0
	   CLR    RS1
           CJNE   R3,#0FFH,KEY3
TIM30:     AJMP   TIM40                      ;防止区间过长,加了中转 TIME和slee相同,即 休眠子程序
DELETE01:  AJMP   DELETE1
RECEIVEEND01:
           AJMP   RECEIVEEND0
KEY30:     CLR    K
           JB     DEL,DELETE02               
           JB     ENTER,RECEIVEEND02
           SETB   RS0
	   CLR    RS1
           MOV    KEY_3,R7
           MOV    NUM_H,KEY_1
           MOV    B,#10H                      ;答案为3位数的情况
     	   MOV    A,KEY_2
           MUL    AB 
           ADD    A,KEY_3
           MOV    NUM_L,A  
           CLR    A
           MOV    A,#30H
 	   ADD    A,R7
	   MOV    KEY_03,A
K3:	   LCALL SETUP                         ;液晶显示
           MOV A,#80H              ;;;;;第一行
           LCALL WRITE_COM
           SETB   RS0
	   CLR    RS1
           MOV    R0,#27H
	   MOV R6,#3
           LCALL WRITE_ASCII
	   CLR  A
           MOV A,#90H                ;;;;;第二行
           LCALL WRITE_COM
           MOV DPTR,#CHINESE3
           LCALL WRITE_HZ
           LCALL DELAY1        
KEY4:      JNB    K,TIME4 
           AJMP   KEY40
TIME4:     SETB   RS0
	   CLR    RS1
           CJNE   R3,#0FFH,KEY4
TIM40:     AJMP   TIM50               ;防止区间过长,加了中转 TIME和slee相同,即 休眠子程序
DELETE02:  AJMP  DELETE2
RECEIVEEND02:
           AJMP   RECEIVEEND0
KEY40:     CLR    K
           JB     DEL,DELETE03               
           JB     ENTER,RECEIVEEND0  
           SETB   RS0
	   CLR    RS1
           MOV    KEY_4,R7
           MOV    B,#10H                       ;答案为4位数的情况
     	   MOV    A,KEY_1
           MUL    AB 
           ADD    A,KEY_2
           MOV    NUM_H,A  
	   MOV    B,#10H                  ;
     	   MOV    A,KEY_3
           MUL    AB 
           ADD    A,KEY_4
           MOV    NUM_L,A  
	   CLR    A
           MOV    A,#30H
 	   ADD    A,R7
	   MOV    KEY_04,A
K4:	   LCALL SETUP             ;液晶显示
           MOV A,#80H              ;;;;;第一行
           LCALL WRITE_COM
	   SETB   RS0
	   CLR    RS1
           MOV    R0,#27H
	   MOV R6,#4
           LCALL WRITE_ASCII
	   CLR  A
           MOV A,#90H                ;;;;;第二行
           LCALL WRITE_COM
           MOV DPTR,#CHINESE4
           LCALL WRITE_HZ
           LCALL DELAY1       
KEY5:      JNB    K,TIME5 
           AJMP   KEY50
TIME5:     SETB   RS0
	   CLR    RS1
           CJNE   R3,#0FFH,KEY5
TIM50:     AJMP   SLEE 
DELETE03:  AJMP  DELETE3
KEY50:     CLR    K
           JB     DEL,DELETE4               
           JB     ENTER,RECEIVEEND0  
           AJMP   KEY5
RECEIVEEND0:
           AJMP   RECEIVEEND
DELETE1:                                ;;;第一次按删除键
           MOV    NUM_L,#00H
           MOV    KEY_1,#00H
           CLR    DEL                    ;;;清除删除标志位
           LJMP   KEY1          	     	        ;;加显示
DELETE2:   CLR    DEL                    ;;;清除删除标志位
           MOV    NUM_L, KEY_1
           MOV    KEY_2,#00H
           LJMP   K1  
DELETE3:   CLR    DEL                    ;;;清除删除标志位
           MOV    NUM_H,#00H
           MOV    B,#10H                  
     	   MOV    A,KEY_1
           MUL    AB 
           ADD    A,KEY_2
           MOV    NUM_L,A 
           LJMP   K2
DELETE4:   CLR    DEL                    ;;;清除删除标志位
           MOV    NUM_H,KEY_1
           MOV    B,#10H                  ;
     	   MOV    A,KEY_2
           MUL    AB 
           ADD    A,KEY_3
           MOV    NUM_L,A 
 	   MOV    NUM_H,KEY_1
	   LJMP   K3                  
RECEIVEEND:
           SETB   P3.4
           CLR    P3.5        ;模块停止休眠
           CLR    TR0         ;停止计数
           MOV    TH0,#00H                 ;定时器从初始化  
           MOV    TL0,#00H
           SETB   RS0
	   CLR    RS1
           MOV    R2,#00H                       ;R2  R3计时单元清零
           MOV    R3,#00H                       
	   SETB   TR0                            ;允许定时器T0计时,记录答题时间

           LCALL SETUP             ;;;;液晶显示等待
	   CLR  A
           MOV A,#90H                ;;;;;第二行
           LCALL WRITE_COM
           MOV DPTR,#CHINESE6
           LCALL WRITE_HZ
HERE1:     JNB    RI,HERE2
           AJMP   REC
HERE2:     SETB   RS0
	   CLR    RS1
           CJNE   R3,#0FFH,HERE1
           AJMP   SLEE1
REC:       MOV    A,SBUF                    ;接受停止码
           CLR    RI 
           CJNE   A,#0FDH,HERE3
SLEE1:	   AJMP   SLEE                           ;答题前,上位机把手持器的寄存器清零
	                                       ;防止有人在两题间按键,抢答
HERE3:     CJNE   A,#0FFH,HERE1
           CLR    TR0
HERE0:     JNB    RI,HERE0
           MOV    A,SBUF                    ;接受地址码
           CLR    RI 
           CJNE   A,#01H,HERE0
	   NOP
           MOV    A,#01H                   ;发送答案    GAO位
           MOV    SBUF,A
WAIT1:     JNB    TI,WAIT1
           CLR    TI
	   lcall  SHORT_DELAY                ;;;应该尽量去掉这段延时
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
           MOV    A,NUM_H                   ;发送答案    GAO位
           MOV    SBUF,A
WAIT2:     JNB    TI,WAIT2
           CLR    TI
	   lcall  SHORT_DELAY                ;;;应该尽量去掉这段延时
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   MOV    A,NUM_L                      ;发送答案   DI 位              
           MOV    SBUF,A
WAIT3:     JNB    TI,WAIT3
           CLR    TI
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   SETB   RS0
	   CLR    RS1
           MOV    A,R3
	   MOV    SBUF,A
WAIT4:     JNB    TI,WAIT4
           CLR    TI
           lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY
 	   SETB   RS0
	   CLR    RS1
	   MOV    A,R2
	   MOV    SBUF,A
WAIT5:     JNB    TI,WAIT5
           CLR    TI
	   lcall  SHORT_DELAY
	   lcall  SHORT_DELAY

⌨️ 快捷键说明

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