📄 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 + -