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

📄 test.asm

📁 中颖单片机 69p43的一个加密及电源管理部分程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*****************************************************
;Company :CHK.ELEC.LTD
;File Name : SINGLE_KEY_ADVANCE.asm
;Author :XiaoWu
;Create Data : 2005-11-10
;Last Modified : 2005-11-21
;Description :infared key check
;单按键触发,优先前面排列的按键
;         PE.0    PE.1    PE.2    PE.3   PF.0   PF.1   PF.2    PF.3
;
;        S_LED0  S_LED1  S_LED2  S_LED3 S_LED4 S_LED5  S_LED6 S_LED7
;
;        [KEY0]  [KEY1]  [KEY2]  [KEY3] [KEY4] [KEY5]  [KEY6] [KEY7]
;
;        R_LED0  R_LED1  R_LED2  R_LED3 R_LED4 R_LED5  R_LED6 R_LED7
;
;         PA.0    PA.1    PA.2    PA.3   PB.0   PB.1   PB.2    PB.3
;          AN0     AN1     AN2     AN3    AN4   AN5     AN6     AN7
;
; OUTPUT:PC.0    PC.1    PC.2    PC.3   PD.0   PD.1   PD.2    PD.3
;
;Version : 1.0
;*****************************************************

   
	;******* SET GOLBAL DEFINE ********
	GEN_REG1  EQU   30H			;3个通用寄存器
	GEN_REG2  EQU   31H	
	GEN_REG3  EQU   32H
	GEN_REG_LED  EQU   33H			;AD采样通道设置
	GEN_REG_ADCH  EQU   34H			;发射红外输出脚设置
	GEN_REG_AD_COUNT_VALUE  EQU   35H  	;采样次数转存器
	GEN_REG_COMP_CONST      EQU   36H	   ;采样比较常量转存器

        AD_8_COUNT    EQU   37H			;采样次数寄存器	
	AD_TEMPL      EQU   38H			;临时存储AD数据高4位
	AD_TEMPH      EQU   39H			;临时存储AD数据低4位
        
        KEY_FLAG      EQU   3AH     		;按键标志XXXX  初次按键,二次按键,去抖标志,松开标志	
	KEY_PORT_FLAG EQU   3BH  		;用来设置PORTE 或者 PORTF,发射红外输出端口设置	
        KEY_PORTA_PRESS_FLAG  EQU   3CH         ;存储端口A的按键KEY0.KEY1,KEY2,KEY3(XXXX)标志位
        KEY_PORTB_PRESS_FLAG  EQU   3DH		;存储端口B的按键KEY4.KEY5,KEY6,KEY7(XXXX)标志位
        
        
        
        AD_LIGHT_DATA1L	 EQU 40H 	;8次采样数据存取
        AD_LIGHT_DATA1H	 EQU 41H  	;灯灭数据高
        AD_LIGHT_DATA2L	 EQU 42H  	;灯亮数据低
        AD_LIGHT_DATA2H	 EQU 43H  	;灯亮数据高       
        
        COMM_DATA  EQU   50H	 	;通信数据寄存器
        COMM_BUF   EQU   51H     	;缓存器
        OUT_FLAG   EQU   52H	 	;输出数据
        OUT_FLAG_DIFF   EQU   53H 	;输出数据反码
        
        TIME_OVER_FLAG  EQU  54H 	 ;超时标志
        
        
        COMM_CLK   EQU   1000B		;时钟线  PC.3
        COMM_SDA   EQU   0100B		;数据线  PC.2
        COMM_PORT  EQU   0AH		;PORTC
        
       
        
        
        COMP_CONST_SHORT      EQU  03H     ;开始预测量时比较常量,小
        AD_COUNT_VALUE_SHORT  EQU  04H      ;预测量次数
        COMP_CONST_LONG       EQU  0AH     ;后面再测量时比较常量,大
        AD_COUNT_VALUE_LONG   EQU  0FH      ;再测量次数
        
        AD_COMP_HIGH          EQU  05H	    ;比较电压差值的高4位常数,可以通过修改这里改变红外感应灵敏度
        AD_COMP_LOW           EQU  04H	    ;比较电压差值的低4位常数
                                 
	;******* END DEFINE SET ***********



	ORG	0000H
	
	JMP	START		;START PROGRAM	
	
	;ORG	0001H		
	RTNI		        ;AD 中断返回
	;RTNI
	JMP TO_SERVER		;T0 中断
	RTNI			;T1 中断
	;RTNI
	JMP COMM_SERVER		;EX 中断



	;**** START PROGRAM ***
START: 
	CALL INITMCU		;初始化单片机寄存器,中断等
	LDI  GEN_REG_AD_COUNT_VALUE,  AD_COUNT_VALUE_SHORT	;AD采样次数
	LDI  GEN_REG_COMP_CONST, COMP_CONST_SHORT		;初始化
	LDI  AD_LIGHT_DATA1L, AD_COMP_LOW	;初始化AD存储值
	LDI  AD_LIGHT_DATA1H, AD_COMP_HIGH
	LDI  AD_LIGHT_DATA2L, AD_COMP_LOW
	LDI  AD_LIGHT_DATA2H, AD_COMP_HIGH
	


      ;********** 主程序 *****************
  MAIN:

	 LDI  KEY_PORTA_PRESS_FLAG,0H	;清按键触发标志
	 LDI  KEY_PORTB_PRESS_FLAG,0H
         LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_SHORT	;传送预测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_SHORT		;传送预测试比较值
        
        LDI  KEY_PORT_FLAG,	0H	;设置扫描端口A,按键0,1,2,3
        LDA  GEN_REG_AD_COUNT_VALUE	;送预测量次数至AD_8_COUNT
        STA  AD_8_COUNT
        
	; 按键0查询
     ;CHECK_0:
 	 LDI  KEY_FLAG,00H	;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数	 
 	 LDI  GEN_REG_ADCH,00H 	;AN0通道
 	 LDI  GEN_REG_LED,1110B
 	 CALL AD_CHECK		;调用AD_CHECK子程序,进行AD采样比较
 	 BAZ  CHECK_1		;若未触发则检测下一个按键	 
	 CALL DELAY	 	;若触发,则延时对该按键进行长扫描 
    	 ORIM  KEY_PORTA_PRESS_FLAG,01H 			;KEY_0 触发,置标志位 	 
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					;设置测量次数
         JMP  CHECK_KEY0					;对该按键进行长扫描
         


	; 按键1查询
     CHECK_1:
	 LDI  KEY_FLAG,00H		;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
	 LDI  GEN_REG_ADCH,00H    	;AN1通道
	 LDI  GEN_REG_LED,1101B
	 CALL AD_CHECK			;调用AD_CHECK子程序,进行AD采样比较
	 BAZ  CHECK_2  			;若未触发则检测下一个按键	 
	 CALL DELAY	 	 	;若触发,则延时对该按键进行长扫描 
	 ORIM  KEY_PORTA_PRESS_FLAG,02H				;KEY_1 触发,置标志位
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					;设置测量次数
         JMP  CHECK_KEY1					;对该按键进行长扫描
         

	; 按键2查询	 
     CHECK_2:
	 LDI  KEY_FLAG,00H					;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
     	 LDI  GEN_REG_ADCH,00H					;AN2通道
     	 LDI  GEN_REG_LED,1011B
	 CALL AD_CHECK						;调用AD_CHECK子程序,进行AD采样比较
	 BAZ  END_PROCESS						;若未触发则检测下一个按键	 
	 CALL DELAY	 	 				;若触发,则延时对该按键进行长扫描 	 
	 ORIM  KEY_PORTA_PRESS_FLAG,04H 			;KEY_2触发,置标志位
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					;设置测量次数
         JMP  CHECK_KEY2					;对该按键进行长扫描
         

	
	; 按键3查询	 
     CHECK_3:
	 LDI  KEY_FLAG,00H					;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
         LDI  GEN_REG_ADCH,00H					;AN3通道
	 LDI  GEN_REG_LED,0111B
	 CALL AD_CHECK						;调用AD_CHECK子程序,进行AD采样比较
	 BAZ  CHECK_4 						;若未触发则检测下一个按键	 
	 CALL DELAY	 	 	 			;若触发,则延时对该按键进行长扫描 	 
	 ORIM  KEY_PORTA_PRESS_FLAG,08H 			;KEY_3 触发,置标志位
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					;设置测量次数
         JMP  CHECK_KEY3					;对该按键进行长扫描
         

	;按键4查询
     CHECK_4:
         LDI  KEY_PORT_FLAG,	01H				;设置扫描按键4,5,6,7
 	 LDI  KEY_FLAG,		00H				;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数        
 	 LDI  GEN_REG_ADCH,	00H 				;AN4通道
 	 LDI  GEN_REG_LED,	1110B
 	 CALL AD_CHECK						;调用AD_CHECK子程序,进行AD采样比较
 	 BAZ  CHECK_5 						;若未触发则检测下一个按键	 
	 CALL DELAY	 	  	 	 		;若触发,则延时对该按键进行长扫描 
 	 ORIM  KEY_PORTB_PRESS_FLAG,01H 			;KEY_4 触发,置标志位
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					;设置测量次数
         JMP  CHECK_KEY4					;对该按键进行长扫描
         
         
	; 按键5查询
    CHECK_5:	
	 LDI  KEY_FLAG,00H					;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
	 LDI  GEN_REG_ADCH,00H    				;AN5通道
	 LDI  GEN_REG_LED,1101B
	 CALL AD_CHECK						 ;调用AD_CHECK子程序,进行AD采样比较
	 BAZ  CHECK_KEY6  					 ;若未触发则检测下一个按键	 
	 CALL DELAY	 	 				 ;若触发,则延时对该按键进行长扫描 
	 ORIM  KEY_PORTB_PRESS_FLAG,02H 			 ; KEY_5 触发,置标志位
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	 ;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		 ;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					 ;设置测量次数
         JMP  CHECK_KEY5					 ;对该按键进行长扫描
         

	; 按键6查询	 
     CHECK_6:
	 LDI  KEY_FLAG,00H					;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
     	 LDI  GEN_REG_ADCH,00H					;AN6通道
     	 LDI  GEN_REG_LED,1011B
	 CALL AD_CHECK						;调用AD_CHECK子程序,进行AD采样比较
	 BAZ  CHECK_KEY7					;若未触发则检测下一个按键	 
	 CALL DELAY	 	 			 	;若触发,则延时对该按键进行长扫描 
	 ORIM  KEY_PORTB_PRESS_FLAG,04H 			;KEY_6 触发,置标志位
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					;设置测量次数
         JMP  CHECK_KEY6					;对该按键进行长扫描
         

	; 按键7查询	 
     CHECK_7:
	 LDI  KEY_FLAG,00H					;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
         LDI  GEN_REG_ADCH,00H					;AN7通道
	 LDI  GEN_REG_LED,0111B		
	 CALL AD_CHECK						;调用AD_CHECK子程序,进行AD采样比较
	 BAZ  END_PROCESS 					;若未触发则按键处理子程序
	 CALL DELAY	 	 			 	;若触发,则延时对该按键进行长扫描 
	 ORIM  KEY_PORTB_PRESS_FLAG,08H  			;KEY_7 触发,置标志位
 	 LDI  GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG	;传送长测试按键值
         LDI  GEN_REG_COMP_CONST,COMP_CONST_LONG		;传送长测试比较值
	 LDA  GEN_REG_AD_COUNT_VALUE
         STA  AD_8_COUNT					;设置测量次数
         JMP  CHECK_KEY7					;对该按键进行长扫描
         
 
         ;出错处理子程序
     ERR_STA:
         LDI  KEY_PORTA_PRESS_FLAG,0H	;清按键触发标志
	 LDI  KEY_PORTB_PRESS_FLAG,0H   
 	 JMP  END_PROCESS    		;结束跳出子程序
   
         ;结束跳出子程序	 
     END_PROCESS:         
	
	 ;显示
	 LDI  GEN_REG1,0FH		;反转触发标志并输出
	 EOR  KEY_PORTA_PRESS_FLAG,0H	;送端口A按键触发标志
      	 STA  PORTD			;端口D输出
      	 LDA  KEY_PORTB_PRESS_FLAG
      	 BA0  $+4
      	 BA1  $+5
      	 LDI  PORTC,0110B		;灭
      	 JMP  MAIN			;清标志子程序
      	 LDI  PORTC,0100B		;端口C输出
      	 JMP  $+2			;跳出
      	 LDI  PORTC,0010B		;端口C输出
      	 
;      	 LDA  KEY_PORTA_PRESS_FLAG
;      	 BA1  $+3
;      	 LDI  PORTD,0FH
;      	 JMP  $+2
;      	 LDI  PORTD,0EH
      	 
      	 
      	 ;===========================================
;将按键转换成16进制,即按键0-1;按键1-2;按键7-8;灯亮数值代替那个按键触发	 
	 LDA  KEY_PORTA_PRESS_FLAG	;读端口A按键标志
	 BA0 	$+11			;按键0,则FLAG=01H
	 BA1	$+12			;按键1,则FLAG=02H
	 BA2	$+13			;按键2,则FLAG=03H
	 BA3	$+14			;按键3,则FLAG=04H
	 ;
	 LDA  KEY_PORTB_PRESS_FLAG
	 BA0	$+14			;按键4,则FLAG=05H
	 BA1	$+15			;按键5,则FLAG=06H
	 BA2	$+16			;按键6,则FLAG=07H
	 BA3  	$+17			;按键7,则FLAG=08H
	 
	 LDI  OUT_FLAG,0H		;给值OUT_FLAG
	 JMP  $+16			;跳到CLEAR_FLAG 
	 LDI  OUT_FLAG,01H	
	 JMP  $+14
	 LDI  OUT_FLAG,02H
	 JMP  $+12
	 LDI  OUT_FLAG,03H
	 JMP  $+10
	 LDI  OUT_FLAG,04H
	 JMP  $+8
	 LDI  OUT_FLAG,05H
	 JMP  $+6
	 LDI  OUT_FLAG,06H
	 JMP  $+4
	 LDI  OUT_FLAG,07H
	 JMP  $+2
	 LDI  OUT_FLAG,08H
	 
	 LDI  GEN_REG1,0FH
	 EOR  OUT_FLAG
	 STA  OUT_FLAG_DIFF			;OUT_FLAG的反码

      	 	 
	 JMP MAIN	 					;跳回主程序


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

         
         ;再扫描按键0
    CHECK_KEY0:
     	 LDI  KEY_FLAG,00H	;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数	 
 	 LDI  GEN_REG_ADCH,00H 	;AN0通道
 	 LDI  GEN_REG_LED,1110B ;设置红外输出管脚

⌨️ 快捷键说明

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