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

📄 lcd_clock.asm

📁 这是用东芝单片机作为时钟控制器的程序,分为时钟和显示两部分
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;===========================================================
;名    称:LCD液晶时钟程序
;说    明:基于TBT的实时时钟,LCD显示,可通过按键实现设置时间
;					 设定定时等功能;KEY1为SET功能键,KEY2/KEY3为"+""-"
;					 功能键,KEY4为定时设置键(定时时间到后蜂鸣器鸣叫)
;入口参数: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时显示允许
;----------------------------------------------
BP_FLAG				EQU			0X5A;蜂鸣器标志
	BP_ON				EQU			0;打开蜂鸣器标志,1有效
;------------------------------------------------
BP_TIM				EQU			0X5B;蜂鸣器鸣响时间
	FLASH_TIM		EQU			0X5C;闪动时间
;------------------------------------------------
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表示转换结束
;=============================================主程序开始
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;显示
			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
;----------------------------------------------蜂鸣器
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:
			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则没有按键按下
;------------------------延时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

⌨️ 快捷键说明

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