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

📄 ad_key.asm

📁 这是东芝单片机进行AD转换,及键操做的程序
💻 ASM
字号:
;===========================================================
;名    称:AD按键识别程序
;说    明:通过MCU的AD端口识别与之相连的按键,理论上一个8BIT
;      		 的AD端口能够识别255个按键
;入口参数:ADCDR
;出口参数:KEY_NAME
;程序入口:AD_KEY
;占用资源:AIN2(P32)、KEY_TMP、KEY_CODE、KEY_NAME、B、C
;						ADCCR、ADCDR
;===========================================================
$include"TMP86P808.H";包含头文件
;-------------------------------
;中断及复位向量
;-------------------------------
CODE_INVEC SECTION CODE ABS=0XFFE0
INTVEC:
DW		TO_RETI;/INT5				0XFFE0
DW		TO_RETI;INTTXD1			0XFFE1
DW		TO_RETI;INTRXD1			OXFFE2
DW		TO_RETI;INT					0XFFE3
DW		TO_RETI;INTTIC0			0XFFE4
DW		TO_RETI;INTET0			0XFFE5
DW		TO_RETI;INTTXD0			0XFFE6
DW		TO_RETI;INTRXD0			0XFFE7
DW		TO_RETI;INTT1			0XFFE8
DW		INTTBT;INTTBT				0XFFE9
DW		TO_RETI;INT1				0XFFEA
DW		TO_RETI;/INTT0			0XFFEB
DW		TO_RETN;INTWDT			0XFFEC
DW		TO_RETN;INTATRAP		0XFFED
DW		TO_RETN;INTUNDEF		0XFFEE
DW		START;RESET					0XFFEF
;------------------------------------

;=========================================内存分配
;LCD_DAT0102		EQU			0X40
;LCD_DAT0304		EQU			0X41
;LCD_DAT0506		EQU			0X42
;LCD_DAT0708		EQU			0X43
;LCD_DAT0910		EQU			0X44
;LCD_DAT1112		EQU			0X45
;LCD_DAT13			EQU			0X46
;LCD_DAT1415		EQU			0X47
;LCD_DAT1617		EQU			0X48
;LCD_DAT1819		EQU			0X49
;LCD_DAT2021		EQU			0X4A
;LCD_DAT2223		EQU			0X4B
;LCD_DAT24			EQU			0X4C
;-----------------------------------------------------------
;LCD_BCNT				EQU			0X4D
HOUR						EQU			0X4E
MIN							EQU			0X4F
SEC							EQU			0X50
MS							EQU			0X51
TEN_MS					EQU			0X52
;LBIT						EQU			0X53
;HBIT						EQU			0X54
;DIS_FLAG				EQU			0X55
;----------------------------------------LED_DISP
;COM1_DATA			EQU			0X56
;COM2_DATA			EQU			0X57
;COM3_DATA			EQU			0X58
;COM4_DATA			EQU			0X59
;TEMP1					EQU			0X5A
;TEMP2					EQU			0X5B
;----------------------------------------I2C
;BIT_CNT				EQU			0X5C
;WR_ADR					EQU			0X5D
;RD_ADR					EQU			0X5E
;WR_DATA				EQU			0X5F
;RD_DATA				EQU			0X60
;FLAG						EQU			0X61
;----------------------------
;SDA_IN					EQU			0XEF
;SDA_OUT				EQU			0XFF
;---------------------------------------REMOTE_CTRL
;R_CODE					EQU			0X62
;RAM_CNT				EQU			0X63
;RBIT_CNT				EQU			0X64
;RECV_FLAG			EQU			0X65
;RCODE_ADR			EQU			0X66;67H/68H/69H遥控码存储器开始地址
;---------------------------------------
KEY_TMP					EQU			0X6A;按键名暂存器
KEY_NAME				EQU			0X6B;按键名称
KEY_CODE				EQU			0X6C;按键D值
KEY_FLAG				EQU			0X6D;按键标志
BP_FLAG					EQU			0X6F;蜂鸣器标志
BP_TIM					EQU			0X70;蜂鸣器鸣响时间
;=======================================LCD_DISP位定义
TBTEN						EQU			3
;LCD_DAT				EQU			7
;LCD_CLK				EQU			0
;LCD_CS					EQU			0
;FLASH					EQU			0
;---------------------------------------LED_DISP位定义
;LED_CLK				EQU			6;P36
;LED_DAT				EQU			7;P37
;LED_D0					EQU			5;P05
;LED_D1					EQU			6;P06
;LED_D2					EQU			1;P11
;LED_CLR				EQU			2;P02
;-----------------------------------------I2C位定义
;SDA						EQU			4
;SCL						EQU			3
;READ_FLAG			EQU			0
;-------------------------------------remote_CTRL位定义
;REV_OK					EQU			0
;FIRST					EQU			1
;HEAD						EQU			2
;--------------------------------------AD_KEY位定义
ADS							EQU			7
EOCF						EQU			5
WAIT_POP					EQU			0
BP_ON						EQU			0;打开蜂鸣器标志,1有效
;===========================================================




;=============================================主程序开始
MAIN_CODE	SECTION	CODE ABS=0XE000
START:
			LD				SP,0X13F;堆栈指针
			LD				(SYSCR2),0X80;单时钟模式
			LD				(WDTCR1),0X00
			LD				(WDTCR2),0XB1;禁用WDT
			LD				(P0),0X0
			LD				(P1),0X0
			LD				(P2),0X0
			LD				(P3),0XFF
			LD				(P0OUTCR),0XE5;
			LD				(P1CR),0XFF;P1全部输出
;			LD				(P2PRD),0X01;
			LD				(P3CR),0X00;
;------------------------------------------内存清0
RAM_CLR:
			LD				HL,0X40
			LD				WA,0X13F-0X40
RCLR1:
			LD				(HL),0X0
			INC				HL
			DEC				WA
			J					F,RCLR1
;---------------------------------------------------主循环
LOOP:
			SET				(BP_FLAG).BP_ON
			LD				(TBTCR),0X05;每次中断约1MS-4MHZ晶振
			DI
			SET				(TBTCR).TBTEN;启动TBT
			SET				(EIRL).6;允许TBT中断
			EI;打开中断
LOOP1:
			CALL			AD_KEY
			J					LOOP1
;===========================================================



;===========================================================
;NO_USEINT	SECTION CODE MEDIUM;未使用中断向量处理
TO_RETI:
			RETI
TO_RETN:
			RETN
;===========================================================


;==========================================TBT构成的实时时钟
INTTBT:
			PUSH			A
			PUSH			B
			PUSH			C
			PUSH			H
			PUSH			L;压栈
MSF:
			INC				(MS);每次中断约等于1ms
			CMP				(MS),0x0a
			J					CS,CLOCK_EXIT;是否大于等于10ms
;----------------------------------------------蜂鸣器
			LD				CF,(BP_FLAG).BP_ON
			J					CC,TEN_MSF;是否要打开蜂鸣器
			SET				(P1).2
			INC				(BP_TIM)
			CMP				(BP_TIM),30
			J					CS,TEN_MSF;蜂鸣器是否鸣想了30ms
			CLR				(BP_FLAG).BP_ON
			LD				(BP_TIM),0
			CLR				(P1).2
;---------------------------------------------------					
TEN_MSF:
			LD				(MS),0X0
			INC				(TEN_MS)
			CMP				(TEN_MS),0X64
			J					CS,CLOCK_EXIT
SECF:
			LD				(TEN_MS),0X0
			INC				(SEC)
			CMP				(SEC),0X3C
			J					CS,CLOCK_EXIT
MINF:
			LD				(SEC),0X0
			INC				(MIN)
			CMP				(MIN),0X3C
			J					CS,CLOCK_EXIT
HOURF:
			LD				(MIN),0X0
			INC				(HOUR)
			CMP				(HOUR),0X3C
			J					CS,CLOCK_EXIT
			LD				(HOUR),0X0
CLOCK_EXIT:
			POP				L
			POP				H
			POP				C
			POP				B
			POP				A
			RETI
;===========================================================


AD_KEY:
		LD			(ADCCR2),0y00010100;速率为19.5us,4mhz
		LD			(ADCCR1),0y00100000;选择AD通道0,单次启动
		SET			(ADCCR1).ADS;启动AD
WAIT_AD:
		LD			CF,(ADCDR2).EOCF
		J				CC,WAIT_AD;等待AD转换结束
		LD			A,(ADCDR1);读取AD结果
		LD			(KEY_CODE),A;转存结果
		J				Z,NOKEY;AD结果如果为0则没有按键按下
;------------------------延时30ms消抖
		CALL		DELY10MS
		CALL		DELY10MS
		CALL		DELY10MS
		CALL		DELY10MS
;---------------------------延时结束
		SET			(ADCCR1).ADS;启动AD
WAIT_AD1:
		TEST		(ADCDR2).EOCF
		J				T,WAIT_AD1;等待AD转换结束
		LD			A,(ADCDR1);读取AD结果
		LD			(KEY_CODE),A
		J				Z,NOKEY;释放消抖
		SET			(KEY_FLAG).WAIT_POP;有按键按下,设置标志
READ_KEY:
		CMP			(KEY_CODE),0XDC;220
		J				CS,RDK_N1;如果AD值小于220则进入下一个按键判断
		LD			(KEY_TMP),0X09
		J				AD_KEY
RDK_N1:
		CMP			(KEY_CODE),0XC4;196
		J				CS,RDK_N2
		LD			(KEY_TMP),0X08
		J				AD_KEY
RDK_N2:
		CMP			(KEY_CODE),0XB4;180
		J				CS,RDK_N3
		LD			(KEY_TMP),0X07
		J				AD_KEY	
RDK_N3:
		CMP			(KEY_CODE),0XA5;165
		J				CS,RDK_N4
		LD			(KEY_TMP),0X06
		J				AD_KEY	
RDK_N4:
		CMP			(KEY_CODE),0X9B;155
		J				CS,RDK_N5
		LD			(KEY_TMP),0X05
		J				AD_KEY	
RDK_N5:
		CMP			(KEY_CODE),0X91;145
		J				CS,RDK_N6
		LD			(KEY_TMP),0X04
		J				AD_KEY
RDK_N6:
		CMP			(KEY_CODE),0X87;.135
		J				CS,RDK_N7
		LD			(KEY_TMP),0X03
		J				AD_KEY
RDK_N7:
		CMP			(KEY_CODE),0X7E;.126
		J				CS,RDK_N8
		LD			(KEY_TMP),0X02
		J				AD_KEY
RDK_N8:
		CMP			(KEY_CODE),0X75;.115
		J				CS,RDK_N9
		LD			(KEY_TMP),0X01
		RET
RDK_N9:
		LD			(KEY_TMP),0X00
		CLR			(KEY_FLAG).WAIT_POP
		RET	
NOKEY:
		LD			CF,(KEY_FLAG).WAIT_POP;是否处于等待按键放开状态
		J				CC,KEY_EXIT
		CLR			(KEY_FLAG).WAIT_POP
		LD			A,(KEY_TMP)
		LD			(KEY_NAME),A
		SET			(BP_FLAG).BP_ON
KEY_EXIT:
		RET
;===========================================================

;===========================================================
DELY10MS:
			LD				IX,0X2710
DE_IX:
			DEC				IX
			J					NZ,DE_IX
			RET
;===========================================================
		END
		

⌨️ 快捷键说明

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