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

📄 tmp_lcd_clock.asm

📁 这是用东芝单片机作为时钟控制器的程序,分为时钟和显示两部分
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;===========================================================
;名    称:LCD液晶时钟程序
;说    明:基于TBT的实时时钟,LCD显示,可通过按键实现设置时间
;					 设定定时等功能;KEY1为SET功能键,KEY2/KEY3为"+""-"
;					 功能键,KEY4为定时设置键(定时时间到后蜂鸣器鸣叫),
;					 同时LED数码管显示两路温度传感器测得温度。
;入口参数:HOUR、MIN、SEC
;出口参数:-
;程序入口:LCD_DISP
;占用资源:40H~50H,B、C、WA、HL、IX
;涉及模块:TBT
;===========================================================
$include"TMP86P808.H";包含头文件
;-------------------------------
;中断及复位向量
;-------------------------------
CODE_INVEC SECTION CODE ABS=0XFFE0
INTVEC:
DW		TO_RETI;/INT5				0XFFE0
DW		TO_RETI;INTTXD1			0XFFE2
DW		TO_RETI;INTRXD1			OXFFE4
DW		TO_RETI;INT					0XFFE6
DW		TO_RETI;INTTIC0			0XFFE8
DW		TO_RETI;INTET0			0XFFEA
DW		TO_RETI;INTTXD0			0XFFEC
DW		TO_RETI;INTRXD0			0XFFEE
DW		TO_RETI;INTT1				0XFFF0
DW		INTTBT;INTTBT				0XFFF2
DW		TO_RETI;INT1				0XFFF4
DW		TO_RETI;/INTT0			0XFFF6
DW		TO_RETN;INTWDT			0XFFF8
DW		TO_RETN;INTATRAP		0XFFFA
DW		TO_RETN;INTUNDEF		0XFFFC
DW		START;RESET					0XFFFE
;------------------------------------

;=========================================内存分配
LCD_DAT0102		EQU			0X40;LCD显示数据
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;LCD显示位计数器
HOUR					EQU			0X4E;小时寄存器
MIN						EQU			0X4F;分钟计时器
SEC						EQU			0X50;秒计时器
MS						EQU			0X51;毫秒寄存器
TEN_MS				EQU			0X52;10毫秒寄存器
;----------------------------------------HEX转换BCD子程序
LBIT					EQU			0X53;BCD转换高位
HBIT					EQU			0X54;BCD转换低位
;-----------------------------------------按键扫描子程序
KEY_TMP				EQU			0X55;按键名暂存器
KEY_NAME			EQU			0X56;按键名称
KEY_CODE			EQU			0X57;按键AD值
;------------------------------------------
KEY_FLAG			EQU			0X58;按键标志
	WAIT_POP		EQU			0;按键等代谈起标志,=1表示有按键按下,等待弹起
	KEY_TIMON		EQU			1;按键消抖计时标志,=1开始计时
;---------------------------------------------
DIS_FLAG			EQU			0X59;显示标志寄存器
	FLASH				EQU			0;闪烁标志,=1时显示允许
	T_DIS			EQU			1;温度刷新标志,=1时允许刷新刷新频率1Hz
;----------------------------------------------
BP_FLAG				EQU			0X5A;蜂鸣器标志
	BP_ON				EQU			0;打开蜂鸣器标志,1有效
;------------------------------------------------
BP_TIM				EQU			0X5B;蜂鸣器鸣响时间
	FLASH_TIM		EQU			0X5C;闪动时间
	KEY_TIM			EQU			0X65;按键消抖时间
;------------------------------------------------
MENU					EQU			0X5D;菜单寄存器
	H_SET				EQU			0;小时设置
	M_SET				EQU			1;分钟设置
	S_SET				EQU			2;秒设置
;-------------------------------------------------
KN_BUF				EQU			0X5E;按键名缓存
;============================================特殊位标志定义
	TBTEN				EQU			3;TBT启动位,=1有效
	LCD_DAT			EQU			1;LCD数据p31
	LCD_CLK			EQU			1;LCD时钟p11
	LCD_CS			EQU			0;LCD片选p10
	ADS					EQU			7;AD启动标志,1有效
	EOCF				EQU			5;AD结束标志,=1表示转换结束
;=======================================================
;----------------------------------------LED_DISP
COM1_DATA			EQU			0X5F
COM2_DATA			EQU			0X60
COM3_DATA			EQU			0X61
COM4_DATA			EQU			0X62
TEMP1					EQU			0X63
TEMP2					EQU			0X64
;=======================================LCD_DISP位定义
;---------------------------------------LED_DISP位定义
COM1					EQU			2;P02
COM2					EQU			3;P03
COM3					EQU			4;P04
COM4					EQU			5;P05
LED_CLK				EQU			7;P20
LED_DAT				EQU			6;P06
TEMP3					EQU			0X6E
;---------------------------------------AD_INPUT
TTEMP1				EQU			0X71
TTEMP2				EQU			0X72
TTEMP3				EQU			0X73
;=============================================主程序开始
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),0y00111101
			LD				(P0OUTCR),0Xff;
			LD				(P1CR),0XFF;P1输出
;			LD				(P2PRD),0X01;
			LD				(P3CR),0y11000010;
;------------------------------------------内存清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
			SET				(EIRL).6
			EI;打开TBT中断
LOOP1:
			CALL			AD_KEY;按键识别
			CALL			KEY_OP;按键处理
			CALL			LCD_DISP;显示
			CALL			LED_DISP
			LD			CF,(DIS_FLAG).T_DIS;刷新标志判断
			J				CS,LOOP1
			CALL			AD_INPUT
			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),0X05
			J					CS,CLOCK_EXIT;是否大于等于10ms
;----------------------------------------------按键
KEY_TIME:
			LD				CF,(KEY_FLAG).KEY_TIMON
			J					CC,BP_TIME
			INC				(KEY_TIM)
;----------------------------------------------蜂鸣器
BP_TIME:
			LD				CF,(BP_FLAG).BP_ON
			J					CC,FLASH_TIME;是否要打开蜂鸣器
			SET				(P1).2
			INC				(BP_TIM)
			CMP				(BP_TIM),30
			J					CS,FLASH_TIME;蜂鸣器是否鸣想了30ms
			CLR				(BP_FLAG).BP_ON
			LD				(BP_TIM),0
			CLR				(P1).2
;---------------------------------------------------
;---------------------------------------------0.5S闪动
FLASH_TIME:
			INC				(FLASH_TIM)
			CMP				(FLASH_TIM),99
			J					CS,TEN_MSF
			LD				(FLASH_TIM),0
			CPL				(DIS_FLAG).FLASH;每0.5秒闪动一次
;----------------------------------------------------
TEN_MSF:
			LD				(MS),0X0
			INC				(TEN_MS)
			CMP				(TEN_MS),198
			J					CS,CLOCK_EXIT
SECF:
			CPL				(DIS_FLAG).T_DIS
			LD				(TEN_MS),0X0
			CMP				(MENU),0;在设置状态下计时停止
			J					NE,CLOCK_EXIT
			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),24
			J					CS,CLOCK_EXIT
			LD				(HOUR),0X0
CLOCK_EXIT:
			POP				L
			POP				H
			POP				C
			POP				B
			POP				A
			RETI
;===========================================================





;===========================================================
;名    称:AD按键识别程序
;说    明:通过MCU的AD端口识别与之相连的按键,理论上一个8BIT
;      		 的AD端口能够识别255个按键
;入口参数:-
;出口参数:KEY_NAME
;程序入口:AD_KEY
;占用资源:
;===========================================================
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则没有按键按下
;-------------------------------------------------------
			SET			(KEY_FLAG).KEY_TIMON
			CMP			(KEY_TIM),10
			J				CS,KEY_EXIT
			CLR			(KEY_FLAG).KEY_TIMON
			LD			(KEY_TIM),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,6000
DE_IX:
			DEC				IX
			J					NZ,DE_IX
			RET
;===========================================================



;===========================================================
;
;
;
;
;===========================================================
KEY_OP:
			CMP				(KEY_NAME),0
			J					EQ,KOP_EXIT
			CMP				(KEY_NAME),1
			J					EQ,KEY_SET
			CMP				(KEY_NAME),2
			J					EQ,KEY_ADD
			CMP				(KEY_NAME),3
			J					EQ,KEY_DOWN
KOP_EXIT:
			LD				(KEY_NAME),0
			RET
;---------------------------------------SET按键
KEY_SET:
			LD				A,(MENU);菜单数据到A
			J					NZ,KSET_N1;非0则进入下一个菜单
			SET				(MENU).H_SET;=0则进入小时设置
			J					KOP_EXIT
KSET_N1:
			SHLC			A
			LD				(MENU),A
			LD				CF,(MENU).3;菜单是否结束?
			J					CC,KOP_EXIT;没结束退出
			LD				(MENU),0
			J					KOP_EXIT
;---------------------------------------UP按键
KEY_ADD:
			CMP				(MENU),1
			J					EQ,KU_HSET
			CMP				(MENU),2
			J					EQ,KU_MSET
			CMP				(MENU),4
			J					EQ,KU_SSET
			J					KOP_EXIT
;-------------------------------小时设置状态下按UP键
KU_HSET:
			INC				(HOUR)
			CMP				(HOUR),24
			J					CS,KOP_EXIT
			LD				(HOUR),0
			J					KOP_EXIT
;-------------------------------分钟设置状态下按UP键
KU_MSET:
			INC				(MIN)
			CMP				(MIN),60
			J					CS,KOP_EXIT
			LD				(MIN),0
			J					KOP_EXIT
;-------------------------------秒钟设置状态下按UP键
KU_SSET:
			INC				(SEC)
			CMP				(SEC),60
			J					CS,KOP_EXIT
			LD				(SEC),0
			J					KOP_EXIT
;---------------------------------------DOWN按键
KEY_DOWN:
			CMP				(MENU),1
			J					EQ,KD_HSET
			CMP				(MENU),2
			J					EQ,KD_MSET
			CMP				(MENU),4
			J					EQ,KD_SSET
			J					KOP_EXIT
;-------------------------------小时设置状态下按DOWN键
KD_HSET:
			DEC				(HOUR)
			CMP				(HOUR),255
			J					NE,KOP_EXIT
			LD				(HOUR),23
			J					KOP_EXIT
;-------------------------------分钟设置状态下按DOWN键
KD_MSET:
			DEC				(MIN)
			CMP				(MIN),255
			J					NE,KOP_EXIT
			LD				(MIN),59
			J					KOP_EXIT
;-------------------------------秒钟设置状态下按DOWN键
KD_SSET:
			DEC				(SEC)
			CMP				(SEC),255
			J					NE,KOP_EXIT
			LD				(SEC),59
			J					KOP_EXIT
;===========================================================
			
			
			
				
;===========================================================
;名    称:LCD驱动程序(基于HT1621)
;说    明:控制HT1621驱动LCD段码液晶
;入口参数:HOUR、MIN、SEC
;出口参数:-
;程序入口:LCD_DISP
;占用资源:
;涉及模块:
;===========================================================					
LCD_DISP:
			LD				HL,LCD_DAT0102
LCD_DCLR:
			LD				(HL),0X00
			INC				HL
			CMP				HL,0X4D
			J					NE,LCD_DCLR;LCD数据清零
;-------------------------------------小时显示,LDAT2021/1819
			LD				CF,(MENU).H_SET;在设置状态闪烁
			J					CC,HOUR_DIS
			LD				CF,(DIS_FLAG).FLASH
			J					CC,MIN_DTEST
HOUR_DIS:
			LD				A,(HOUR)
			LD				(LBIT),A;24小时制
			CALL			HEX2BCD
			LD				C,(HBIT)
			LD				HL,DIS_TABLCD
			LD				A,(HL+C);查表得出显示码
			LD				(LCD_DAT2021),A
			LD				C,(LBIT)
			LD				HL,DIS_TABLCD
			LD				A,(HL+C)
			LD				(LCD_DAT1819),A
;---------------------------------------分显示
MIN_DTEST:
			LD				CF,(MENU).M_SET;在设置状态闪烁
			J					CC,MIN_DIS
			LD				CF,(DIS_FLAG).FLASH
			J					CC,SEC_DTEST
MIN_DIS:
			LD				A,(MIN)
			LD				(LBIT),A

⌨️ 快捷键说明

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