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

📄 lcd电子钟.asm

📁 详细的中文说明 标准的程序格式 保证调试通过877a读写lcd
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	incf	RTCCSIG
	goto	main
;*---
SetAlH4	
	movlw	0c7h
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,3
	movf	INTSIG,W
	movwf	Hour1
	movlw	d'24'
	subwf	Hour1,W
	btfss	STATUS,C
	goto	S4
	clrf	INTSIG
	clrf	Hour1
	goto	S4	
SetAlM4
	movlw	0cah
	call	Selshow
	movf	INTSIG,W
	btfss	STATUS,Z
	bsf	ALRSIG,1
	movf	INTSIG,W
	movwf	Mins1
	movlw	d'60'
	subwf	Mins1,W
	btfss	STATUS,C
	goto	S4
	clrf	INTSIG
	clrf	Mins1
	goto	S4
;*=====
ISR	
Push
	movwf	_WREG		; 存 WREG状态
	swapf	STATUS,W	; 存 STATUS
	movwf	_STATUS
;*----
	bcf	STATUS,RP0
	btfsc	PIR1,TMR1IF
	call	TimeAdj
	btfsc	INTCON,INTF
	call	IntDeal
	btfsc	INTCON,T0IF
	call	RtccDeal
	
;*----
Pop
	swapf	_STATUS,W	; Restore STATUS
	movwf	STATUS
	swapf	_WREG,F		; Restore WREG w/o
	swapf	_WREG,W		; affecting STATUS
	retfie
;*=====
TimeAdj
	bcf	STATUS,RP0
	bcf	PIR1,TMR1IF
	movlw	00h
	movwf	TMR1L
	movlw	80h
	movwf	TMR1H
	incf	Secs,1
	movlw	d'60'
	xorwf	Secs,W
	btfss	STATUS,Z
	goto	TE
	clrf	Secs
	incf	Mins,1
	movlw	d'60'
	xorwf	Mins,W
	btfss	STATUS,Z
	goto	TE
	clrf	Mins
	incf	Hour
	movlw	d'24'
	xorwf	Hour,W
	btfss	STATUS,Z
	goto	TE
	clrf	Hour
TE
	return
;*=====
IntDeal
	bcf	INTCON,INTF
	bsf	PORTB,0
	btfsc	PORTB,0		;\
	goto	$+5			; \
	call	Delay	
	bsf	PORTB,0		;  按键去抖动
	btfsc	PORTB,0
	goto	$+2			; /	
	incf	INTSIG
	return
;*=====
RtccDeal
	bcf	STATUS,RP0
	movlw	0ffh			;
	movwf	TMR0
	bcf	INTCON,T0IF
	bsf	PORTA,4
	btfsc	PORTA,4		;\
	goto	RtcWr			; \
	call	Delay
	bsf	PORTA,4		;  按键去抖动
	btfsc	PORTB,4
	goto	RtcWr			; /	
	movf	RTCCSIG,W
	sublw	04h
	btfss	STATUS,C
	goto	WRONG
	movf	RTCCSIG1,W
	sublw	03h
	btfss	STATUS,C
	goto	WRONG
	movf	RTCCSIG,W
	addwf	RTCCSIG1,W
	btfsc	STATUS,Z
	goto	$+3
	incf	RTCCSIG1
	goto	RtcWr
	incf	RTCCSIG
	goto	RtcWr

WRONG	
	clrf	RTCCSIG
	clrf	RTCCSIG1
RtcWr	return
;*=====
BkLight
	bsf	STATUS,RP0
	bcf	ADCON1,ADFM		;ADRESH all 8-bit,H	
	bcf	STATUS,RP0
	movlw	b'01010001'
	movwf	ADCON0		;select AD2,Fosc/8
	decfsz	BKM
	goto	$-1
	bsf	ADCON0,GO
	btfss	PIR1,ADIF
	goto	$-1
	bcf	PIR1,ADIF
	;READ ADRES---
	movf	ADRESH,W
	movwf	ADRESB
	bsf	STATUS,RP0
	bcf	TRISE,0		;SELECT RE0 OUTPUT
	bcf	STATUS,RP0
	movlw	b'10000000'	      ;critical value of lightness
	subwf	ADRESB,W
	btfss	STATUS,C
	goto	$+4		;c=0,ADRESB<critical
	bcf	STATUS,RP0
	bsf	PORTE,0		;c=1,backlight on	
	goto	$+3
	bcf	STATUS,RP0
	bcf	PORTE,0
	movlw	20h
	movwf	BKM
	return
;*=====
TempM				;temprature measure
	bsf	STATUS,RP0
	bcf	ADCON1,ADFM	;ADRESH all 8-bit
	bcf	STATUS,RP0
	movlw	b'01001001'	;select	AD1,FOSC/8
	movwf	ADCON0
	decfsz	BKM
	goto	$-1
	bsf	ADCON0,GO
	btfss	PIR1,ADIF
	goto	$-1
	bcf	PIR1,ADIF
	;bsf	STATUS,RP0
	movf	ADRESH,W
	;bcf	STATUS,RP0
	movwf	Temp	
	call	CalTable
	movwf	Temp
	call	Bin2BCDT	; 进行BCD码调整
	movlw	08ah		; 从第一行的第0A个位置开始
	call	SendCmd
	movf	TempH,W	; 显示温度
	call	putcLCD
	movf	TempL,W
	call	putcLCD
	movlw	'C'		; 显示“C”(表示摄氏度) 
	call	putcLCD
	movlw	20h
	movwf	BKM
	return
;************************************************
;* Bin2BCDT - 将 Temp  寄存器内的二进制数转     *
;* 换为相应的 ASCII 码并存为 TempH:TempL 的形式 *
;************************************************
Bin2BCDT
	bcf	STATUS,RP0
	clrf	TempH		; Initialize variables
	movf	Temp,W
	movwf	TempL
Ttenth				; Subtract 10 from low variable
	movlw	.10		; until result is < 0.  On each
	subwf	TempL,W		; subtraction, increment the
	btfss	STATUS,C	; temperature high byte.
	goto	Over0
	movwf	TempL
	incf	TempH,F
	goto	Ttenth
Over0
	movlw	0x30		; Make decimal ASCII by adding
	addwf	TempH,F		; '0' to high and low byte
	addwf	TempL,F
	return
;*************************************************
;* DisplayTime - 将显示指针移至第一行,调用Bin2BCD*
;* 子程序将Secs 和 Mins寄存器内的数据转换为相应的*
;* ASCII 码, 然后送 LCD显示.                     *
;*************************************************
DisplayTime
	bcf	STATUS,RP0
	call	Bin2BCD		; 调用二进制与bcd码转换子程序
	movf	HourH,W		; 显示小时高位
	call	putcLCD		; 
	movf	HourL,W		; 显示小时低位
	call	putcLCD		; 
	movlw	':'
	call	putcLCD		; 显示 ':' 
	movf	MinsH,W		; 显示分钟高位
	call	putcLCD		; 
	movf	MinsL,W		; 显示分钟低位
	call	putcLCD		; 
	movlw	':'		; 显示 ':' 
	call	putcLCD
	movf	SecsH,W		; 显示秒钟高位
	call	putcLCD		; 
	movf	SecsL,W		; 显示秒钟低位
	call	putcLCD		; 
	return
;************************************************
;* Bin2BCD - 将 Secs & Mins 寄存器内的二进制数转*
;* 换为相应的 ASCII 码并存为 SecsH:SecsL 及     *
;* MinsH:MinsL,HourH:HourL的形式.               *
;************************************************
Bin2BCD
	bcf	STATUS,RP0
	clrf	HourH		; 初始化变量
	movf	Hour,W		; 转换“时”
	movwf	HourL
Hourth				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	HourL,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Next
	movwf	HourL
	incf	HourH,F
	goto	Hourth
Next
	clrf	MinsH		; 初始化变量
	movf	Mins,W		; 转换“分”
	movwf	MinsL
Mtenth				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	MinsL,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Next1
	movwf	MinsL
	incf	MinsH,F
	goto	Mtenth
Next1
	clrf	SecsH		; 初始化变量
	movf	Secs,W		; 转换“秒”
	movwf	SecsL
Stenth				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	SecsL,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Over
	movwf	SecsL
	incf	SecsH,F
	goto	Stenth
Over
	movlw	0x30		; 
	addwf	HourH,F		; 
	addwf	HourL,F		; Add 0x30 ('0') to all
	addwf	MinsH,F		; variables to convert
	addwf	MinsL,F		; a number 0 - 9 to an
	addwf	SecsH,F		; ASCII equivalent
	addwf	SecsL,F		; '0' to '9'
	return
;*====
DispTime
	bcf	STATUS,RP0
	movlw	0c7h
	call	SendCmd
	call	Bin2BCa		; 调用二进制与bcd码转换子程序
	movf	HourH1,W	; 显示小时高位
	call	putcLCD		; 
	movf	HourL1,W	; 显示小时低位
	call	putcLCD		; 
	movlw	':'		; 显示 ':' 
	call	putcLCD
	movf	MinsH1,W	; 显示分钟高位
	call	putcLCD		; 
	movf	MinsL1,W	; 显示分钟低位
	call	putcLCD		; 
	return
;*----
Bin2BCa
	bcf	STATUS,RP0
	clrf	HourH1		; 初始化变量
	movf	Hour1,W		; 转换“时”
	movwf	HourL1
Hourth1				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	HourL1,W	; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Nexta
	movwf	HourL1
	incf	HourH1,F
	goto	Hourth1
Nexta
	clrf	MinsH1		; 初始化变量
	movf	Mins1,W		; 转换“分”
	movwf	MinsL1
Mtenth1				; Loop to subtract 10
	movlw	.10		; from low byte and
	subwf	MinsL1,W		; increment high byte
	btfss	STATUS,C	; while low byte is > 0
	goto	Over1
	movwf	MinsL1
	incf	MinsH1,F
	goto	Mtenth1
Over1
	movlw	0x30		; 
	addwf	HourH1,F	; 
	addwf	HourL1,F	; Add 0x30 ('0') to all
	addwf	MinsH1,F	; variables to convert
	addwf	MinsL1,F	; a number 0 - 9 to an
	return			; ASCII equivalent
;*******************************************************************
;*  LCD 模块子程序                                                 *
;*******************************************************************
;InitLCD——初始化LCD模块                                          *
;*******************************************************************
InitLCD
	bcf	STATUS,RP0			; Bank 0
	bcf	STATUS,RP1
	clrf	LCD_DATA			; 清 LCD 数据 & 控制位
	bsf	STATUS,RP0			; Bank 1
	movlw	0xc1				; 设置RB1~RB5为输出
	movwf	LCD_DATA
	bcf	TRISA,5
	
	bcf	STATUS,RP0			;
	movlw   0x00			; 
	movwf   LCD_DATA
	bsf     LCD_CNTL2, E
	bcf     LCD_CNTL2, E

	movlw   0x08			; 
	movwf   LCD_DATA
	bsf     LCD_CNTL2, E
	bcf     LCD_CNTL2, E
	call	LongDelay
	call	LongDelay

	movlw	b'00101000'
	call	SendCmd
	movlw	DISP_ON				; 开显示
	call	SendCmd
	movlw	ENTRY_INC			; 设置指针移动方式
	call	SendCmd
	movlw	DD_RAM_ADDR			; 设置起始地址
	call	SendCmd

InitLCDEnd					;
	bcf	STATUS,RP0			; 
	movlw	CLR_DISP	; 
	call	SendCmd
	return

;*******************************************************************
;*putcLCD—— 将字符数据送入 LCD                                   *
;*            本程序将字符数据分成了高半字节和低半字节分别输入     * 
;*            先送入的是高半字节                                   *
;*******************************************************************
putcLCD
	bcf	STATUS,RP0
	movwf	Byte			; 存 WREG 到 Byte 寄存器
	swapf	Byte,W		; 写入高半字节
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bsf	LCD_CNTL1, RS	; 设置为送数据模式
	bsf	LCD_CNTL2, E		; 发送数据信号
	bcf	LCD_CNTL2, E

	movf	Byte,W		; 接着送低半字节
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bsf	LCD_CNTL1, RS	; 设置为送数据模式
	bsf	LCD_CNTL2, E		; 发送数据信号
	bcf	LCD_CNTL2, E
	call	Delay
	return

;*******************************************************************
;* SendCmd - 送命令到 LCD                                          *
;*           本程序将命令数据分成了高半字节和低半字节分别输入      * 
;*           先送入的是高半字节                                    *
;*******************************************************************
SendCmd
	bcf	STATUS,RP0
	movwf	Byte			; 存 WREG 到 Byte 寄存器
	swapf	Byte,W		; 送入命令的高字节
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bcf	LCD_CNTL1,RS	; 设置为送命令模式
	bsf	LCD_CNTL2,E		; 发送数据信号
	bcf	LCD_CNTL2,E
	movf	Byte,W		; 接着送命令的低字节 
	
	movwf	LCD_DATA1
	rlf	LCD_DATA1,1
	rlf	LCD_DATA1,1
	movlw	0x3c
	andwf	LCD_DATA1,1
	movf	LCD_DATA1,w
	movwf	LCD_DATA
	bcf	LCD_CNTL1,RS		; 设置为送命令模式
	bsf	LCD_CNTL2,E		; 发送数据信号
	bcf	LCD_CNTL2,E
	call	Delay
	return
;*******************************************************************
;* Delay - 延时子程序                                              *
;*******************************************************************
Delay					; call指令占用2个指令周期
	bcf	STATUS,RP0
	clrf	Count			; 清 Count占用1个指令周期
Dloop
	decfsz	Count,f			; 这两行指令将延时
	goto	Dloop			; (256 * 3) -1 个指令周期
	return				;  return占用2个指令周期

;*******************************************************************
;* LongDelay - 长延时子程序   	                                   * 
;*******************************************************************
LongDelay
	bcf	STATUS,RP0
	clrf	Count
	clrf	Count1
	movlw	0x03
	movwf	Count2
LDloop
	decfsz	Count,f
	goto	LDloop
	decfsz	Count1,f
	goto	LDloop
	decfsz	Count2,f
	goto	LDloop
	return
;*------
	END

⌨️ 快捷键说明

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