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

📄 ds12c887.asm

📁 PIC16F877A 与 DS12C887 时钟蕊片的驱动
💻 ASM
字号:
;-------------------------------------------------------------------------------
;DS12C877+LCD1602
;MCU PIC16F877A
;PORT RA0-RA3 TO CONNECT DS12C887 
;INTEL BUS
;-------------------------------------------------------------------------------
;DS12C887 
;RA0--CS;RA1--AS(ALE);RA2--R/W(WR);RA3--DS(RD)
;RC0~RC7 TO CONNECT DS12887'S AD0~AD7
;-------------------------------------------------------------------------------
;LCD 1602
;RB1--RS,RB2--RW,RB3--E
;D0~D7 CONNECT MCU RD0~RD7
;--------------------------------------------------------------------------------
LIST	P=16F877A
INCLUDE"P16F877A.INC"

#DEFINE	L_E	PORTB,3			;LCD片选信号脚定义在RB.3脚
#DEFINE	L_RW	PORTB,2			;LCD读/写信号脚定义在RB.2脚
#DEFINE	L_RS	PORTB,1 			;LCD寄存器选择信号脚定义在RB.1脚
#DEFINE	T_CS	PORTA,0
#DEFINE	T_AS	PORTA,1
#DEFINE	T_RW	PORTA,2
#DEFINE	T_DS	PORTA,3
#DEFINE	DAT	PORTD
T_ADDR	EQU	22H
T_DATA	EQU	23H
COUNT	EQU	24H
TEMP	EQU	25H
TEMP1	EQU	26H
TEMP2	EQU	27H
SOUH	EQU	28H
SOUL	EQU	29H	
SOU	EQU	2AH
SEN_H	EQU	30H
SEN_L	EQU	31H
MIN_H	EQU	32H
MIN_L	EQU	33H
HOUR_H	EQU	34H
HOUR_L	EQU	35H
WEEK_H	EQU	36H
WEEK_L	EQU	37H
DAY_H	EQU	38H
DAY_L	EQU	39H
MON_H	EQU	3AH
MON_L	EQU	3BH
YEAR_H	EQU	3CH
YEAR_L	EQU	3DH


;------------------------------------------------------------------------------------------
	 ORG 0000H
	 NOP		;放置一条ICD必需的空操作指令
	 GOTO MAIN

	ORG	00004H
MAIN	CALL	INIT_LCD
	CALL	RTC_INIT
	
GONO	CALL	READRTC
	CALL	DISPLAY		
	GOTO	 GONO
;---------------------------------------------------------------------------------------------

INIT_LCD	BSF	STATUS,RP0	;选择体1
	MOVLW 	B'11110001'
	MOVWF 	TRISB	;PORTB的B1-3定义为输出,其余为输入
	CLRF	TRISD	;PORTD端口定义为输出
	BCF      	STATUS,RP0	;SELECT BANK 0
	CALL	DELAY5MS	;调用延时,刚上电LCD复位不一定有PIC快
	CALL	DELAY5MS
	CALL	DELAY5MS
	
	MOVLW   	38H
	CALL    	FCOM_WR
	MOVLW   	38H
	CALL    	FCOM_WR
	MOVLW   	38H
	CALL    	FCOM_WR	
	MOVLW   	38H
	CALL    	COMM_WR  	;显示模式设置:16*2显示,5*7点阵,8位数码接口
	MOVLW	08H
	CALL    	COMM_WR 	;显示关闭,不显示光标
	MOVLW   	01H
	CALL    	COMM_WR   	;显示清屏
	MOVLW   	06H
	CALL    	COMM_WR  	;显示光标移动设置(右移),整屏显示不移动
	MOVLW   	0CH
	CALL    	COMM_WR	;显示开及光标设置,不显示光标
	
	RETURN
;***************************LCD显示子程序************************
;LCD模块初始化,由厂家提供的资料显示,其初始化过程为:
    	
DISPLAY	MOVLW   	0CAH
    	CALL	COMM_WR	
    	MOVFW   	SEN_H           	;显示秒十位	
    	CALL	DATA_WR
    		
    	MOVLW	0CBH	
    	CALL	COMM_WR
        	MOVFW	SEN_L	;显示秒个位
    	CALL	DATA_WR
    	
    	MOVLW   	0C7H
    	CALL	COMM_WR	
        	MOVFW   	MIN_H           	;显示分十位		
    	CALL	DATA_WR	
    	
    	MOVLW	0C8H
    	CALL	COMM_WR
        	MOVFW	MIN_L	;显示分个位
    	CALL	DATA_WR
    	
    	MOVLW   	0C4H
    	CALL	COMM_WR	
        	MOVFW   	HOUR_H           ;显示时十位			
    	CALL	DATA_WR	
    	
    	MOVLW	0C5H
    	CALL	COMM_WR
        	MOVFW	HOUR_L	;显示时个位
    	CALL	DATA_WR	
    	
    	MOVLW   	8AH
    	CALL	COMM_WR	
    	MOVFW   	DAY_H           	;显示秒十位	
    	CALL	DATA_WR
    		
    	MOVLW	8BH	
    	CALL	COMM_WR
        	MOVFW	DAY_L	;显示秒个位
    	CALL	DATA_WR
    	
    	MOVLW   	87H
    	CALL	COMM_WR	
        	MOVFW   	MON_H           	;显示分十位		
    	CALL	DATA_WR	
    	
    	MOVLW	88H
    	CALL	COMM_WR
        	MOVFW	MON_L	;显示分个位
    	CALL	DATA_WR
    	
    	MOVLW   	84H
    	CALL	COMM_WR	
        	MOVFW   	YEAR_H           ;显示时十位			
    	CALL	DATA_WR	
    	
    	MOVLW	85H
    	CALL	COMM_WR
        	MOVFW	YEAR_L	;显示时个位
    	CALL	DATA_WR	
	RETURN

;*****************************写命令子程序***********************
FCOM_WR	MOVWF    	DAT             	;把命令字送数据口
	BCF	L_RS
	BCF	L_RW
	BCF      	L_E
	NOP
	BSF      	L_E              
	RETURN

COMM_WR 	MOVWF    	DAT             	;把命令字送数据口
	BCF	L_RS
	BCF	L_RW
	BCF      	L_E
	NOP
	BSF      	L_E  
	CALL	LCDBUSY           
	RETURN
;*************************写数据子程序***************************
DATA_WR	MOVWF    	DAT
	BSF	L_RS
	BCF	L_RW
	BCF      	L_E
	NOP
	BSF      	L_E
	CALL	LCDBUSY
	RETURN

;**************************判总线忙子程序************************
LCDBUSY       	BSF	STATUS,RP0
	MOVLW    	080H
	MOVWF    	TRISD	;数据口最高位置为输入口
	BCF	STATUS,RP0
	BCF    	L_RS
	BSF    	L_RW
	BSF    	L_E
	NOP
	BSF	L_E
	BTFSC    	DAT,7	;是否忙
	GOTO     	LCDBUSY	;是,继续判断
	BSF	STATUS,RP0
	MOVLW	00H
	MOVWF	TRISD	;否,数据最高位恢复为输出状态
	BCF 	STATUS,RP0
	RETURN
    
;---------------------------------
;     实时时钟芯片
;       DS12C887
;      通信子程序
;---------------------------------
T_WRITE	CLRF	PORTC
	BSF    	T_DS	
	BSF    	T_RW
	BSF    	T_AS
	BCF    	T_CS
	MOVF   	T_ADDR,0
	MOVWF  	PORTC
	BCF    	T_AS
	BCF    	T_RW
	MOVF   	T_DATA,0
	MOVWF  	PORTC
	BSF    	T_RW
	BSF    	T_CS
	BSF    	T_AS
	RETURN
;------------------------------
T_READ	CLRF	PORTC
	BSF    	T_DS
	BSF    	T_RW
	BSF    	T_AS
	BCF    	T_CS
	MOVF   	T_ADDR,W
	MOVWF  	PORTC
	BCF    	T_AS
	BCF    	T_DS
	CLRF   	PORTC
	CALL	LCDBUSY            
	BSF	STATUS,RP0
	MOVLW  	B'11111111'
	MOVWF  	TRISC
	BCF	STATUS,RP0
	MOVF   	PORTC,0
	MOVWF  	T_DATA
	BSF    	T_DS
	BSF    	T_CS
	BSF    	T_AS
	BSF	STATUS,RP0
	MOVLW  	00H
	MOVWF  	TRISC
	BCF	STATUS,RP0
	CLRF	PORTC
	RETURN
;--------------------------
;      实际用法
;--------------------------
;      实时时钟设置
;-----------------------------  
RTC_INIT	BSF	STATUS,RP0		;选择体1
	MOVLW 	B'11110000'			
	MOVWF 	TRISA		;PORTB的B1-3定义为输出,其余为输入
	CLRF	TRISC		;PORTD端口定义为输出
	MOVLW    	00H
	MOVWF    	OPTION_REG         	;分频比1:4,定时器,内部时钟源
	MOVLW    	B'00000110'
	MOVWF    	ADCON1         		 ;关闭所有A/D口
	MOVLW    	B'00000000'
	MOVWF    	INTCON             	;关闭所
	NOP
	BCF      	STATUS,RP0
   	CLRF	PORTA
    	CLRF	PORTC
    	CALL	DELAY5MS
    	MOVLW  	0AH
	MOVWF  	T_ADDR
	MOVLW  	B'00101111'
	MOVWF  	T_DATA
	CALL   	T_WRITE
	MOVLW  	0BH
	MOVWF  	T_ADDR
	MOVLW  	B'00000010'
	MOVWF  	T_DATA
	CALL   	T_WRITE
	RETURN
;----------------------------
;      读时间信息(年,月,日,秒等)
;----------------------------
READRTC	MOVLW  	00H
	MOVWF  	T_ADDR
	CALL   	T_READ
	MOVF   	T_DATA,0
	MOVWF  	SOU
	CALL	BCD2ASC
	MOVF	SOUH,0
	MOVWF	SEN_H
	MOVF	SOUL,0
	MOVWF	SEN_L	
		
	MOVLW	02H
	MOVWF  	T_ADDR
	CALL   	T_READ
	MOVF   	T_DATA,0
	MOVWF  	SOU
	CALL	BCD2ASC
	MOVF	SOUH,0
	MOVWF	MIN_H
	MOVF	SOUL,0
	MOVWF	MIN_L
	
	MOVLW	04H
	MOVWF  	T_ADDR
	CALL   	T_READ
	MOVF   	T_DATA,0
	MOVWF  	SOU
	CALL	BCD2ASC
	MOVF	SOUH,0
	MOVWF	HOUR_H
	MOVF	SOUL,0
	MOVWF	HOUR_L
	
	MOVLW  	06H
	MOVWF  	T_ADDR
	CALL   	T_READ
	MOVF   	T_DATA,0
	MOVWF  	SOU
	CALL	BCD2ASC
	MOVF	SOUH,0
	MOVWF	WEEK_H
	MOVF	SOUL,0
	MOVWF	WEEK_L	
	
	MOVLW  	07H
	MOVWF  	T_ADDR
	CALL   	T_READ
	MOVF   	T_DATA,0
	MOVWF  	SOU
	CALL	BCD2ASC
	MOVF	SOUH,0
	MOVWF	DAY_H
	MOVF	SOUL,0
	MOVWF	DAY_L	
		
	MOVLW	08H
	MOVWF  	T_ADDR
	CALL   	T_READ
	MOVF   	T_DATA,0
	MOVWF  	SOU
	CALL	BCD2ASC
	MOVF	SOUH,0
	MOVWF	MON_H
	MOVF	SOUL,0
	MOVWF	MON_L
	
	MOVLW	09H
	MOVWF  	T_ADDR
	CALL   	T_READ
	MOVF   	T_DATA,0
	MOVWF  	SOU
	CALL	BCD2ASC
	MOVF	SOUH,0
	MOVWF	YEAR_H
	MOVF	SOUL,0
	MOVWF	YEAR_L	
	RETURN
;--------------------------------------------------------------
;入口参数:原二进制数在SOU中。
;BCD码转ASCII码
;--------------------------------------------------------------
BCD2ASC	MOVF	SOU,0
            	ANDLW	B'11110000'
            	MOVWF	SOUH
            	SWAPF	SOUH,1
            	MOVLW	030H
            	ADDWF	SOUH,1
                      	MOVF	SOU,0
                      	ANDLW	B'00001111'
                       	MOVWF	SOUL
                       	MOVLW	030H
                       	ADDWF	SOUL,1
                       	RETURN                  	;整个子程序结束
;------------------------------------------------------------------------------------------
DELAY5MS   	movlw 1h          	;将外层循环参数值FFH经过W
	movwf 20h          	;送入用作外循环变量的20H单元
loop0	movlw 0FFh        	;将内层循环参数值FFH经过W
	movwf 21h           	;送入用作内循环变量的21H单元
loop1	decfsz 21h,1      	;变量21H内容递减,若为0跳跃
	goto loop1           		;跳转到LP1处
	decfsz 20h,1         	;变量20H内容递减,若为0跳跃
	goto loop0           		;跳跃到LP0处
	return                		;返回主程序

 ;------------------------------------------------------------------------------------------
		END
;------------------------------------------------------------------------------------------




⌨️ 快捷键说明

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