PIC单片机在ICD做lcd显示时钟演示程序
;* CLKTEST.ASM *
;*************************************************
;* ICDDEMO教学实验板 lcd显示时钟演示程序 *
;*************************************************
include p16f877.inc>
;*----
; 定义 LCD数据 控制I/O口
LCD_DATA equ PORTB
LCD_CNTL1 equ PORTB
LCD_CNTL2 equ PORTA
; 定义 LCD控制相应的I/O引脚
RS equ 1
E equ 5
; LCD 模块命令
DISP_ON EQU 0x00C ; 开显示
DISP_ON_C EQU 0x00E ; 开显示, 开指针
DISP_ON_B EQU 0x00F ; 开显示, 开指针,开闪烁
DISP_OFF EQU 0x008 ; 关显示
CLR_DISP EQU 0x001 ; 清显示的操作数
ENTRY_INC EQU 0x006 ; 操作数
ENTRY_INC_S EQU 0x007 ; 操作数
ENTRY_DEC EQU 0x004 ; 操作数
ENTRY_DEC_S EQU 0x005 ; 操作数
DD_RAM_ADDR EQU 0x080 ; 初始化第一行显示的操作数
DD_RAM_UL EQU 0x0c0 ; 初始化第二行显示的操作数
; 设置显示相关寄存器
Byte EQU 20H
Count EQU 21H
Count1 EQU 22H
Count2 EQU 23H
LCD_DATA1 EQU 24H
PORTDB EQU 25H
Temp EQU 26H
TempH EQU 27H
TempL EQU 28H
INTSIG EQU 29H
RTCCSIG1 EQU 2AH
RTCCSIG EQU 2BH
ALRSIG EQU 2CH
Hour EQU 2DH
HourH EQU 2EH
HourL EQU 2FH
HourL1 EQU 30H
HourH1 EQU 31H
Mins EQU 32H
Mins1 EQU 33H
MinsH EQU 34H
MinsL EQU 35H
MinsH1 EQU 36H
MinsL1 EQU 37H
Secs EQU 38H
SecsH EQU 39H
SecsL EQU 3AH
ALRH1 EQU 3BH
ALRM1 EQU 3CH
ALRH2 EQU 3DH
ALRM2 EQU 3EH
ALRH3 EQU 3FH
ALRM3 EQU 40H
_WREG EQU 41H
_STATUS EQU 42H
Hour1 EQU 43H
ADRESB EQU 44H
BKM EQU 45H
;*----
org 0
nop
goto start
org 4
goto ISR
org 10
CalTable
bcf STATUS,RP0
bcf PCLATH,0
movlw 0x66 ; 进行校准处理
subwf Temp,w ;
addwf PCL,f ; 将补偿结果与 PCL相加
dt 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5
dt 6,6,6,7,7,7,8,8,8,9,9,0xa,0xa,0xb,0xb,0xc,0xc
dt 0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x10,0x10,0x10
dt 0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x14
dt 0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x18,0x18
dt 0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1c
dt 0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0x1f,0x20,0x20
dt 0x21,0x21,0x22,0x22,0x23,0x23,0x24,0x24,0x25,0x25
dt 0x26,0x26,0x27,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2b
dt 0x2c,0x2d,0x2e,0x2f,0x30,0x32
start
call InitLCD
clrf RTCCSIG
clrf RTCCSIG1
clrf INTSIG
clrf Hour
clrf Hour1
clrf Mins
clrf Mins1
clrf Secs
clrf ALRSIG
movlw 20h
movwf BKM
movlw b'10001111'
movwf PORTDB
movlw 0ffh
movwf TMR0
movlw 00
movwf TMR1L
movlw 80h
movwf TMR1H
movlw b'00001111'
movwf T1CON
bsf STATUS,RP0
bsf PIE1,TMR1IE
bcf STATUS,RP0
movlw b'10111111'
OPTION
movlw b'11110000'
movwf INTCON
main
movlw 80h
call SendCmd
call DisplayTime ;显示时间
movlw 0c0h
call SendCmd
movlw 'H'
call putcLCD
movlw 'e'
call putcLCD
movlw 'l'
call putcLCD
movlw 'l'
call putcLCD
movlw 'o'
call putcLCD
movlw ' '
call putcLCD
movlw '!'
call putcLCD
movlw ' '
call putcLCD
movlw ':'
call putcLCD
movlw ')'
call putcLCD
movlw ' '
call putcLCD
movlw ' '
call putcLCD
call BkLight ;背光控制
call TempM ;显示温度
btfsc ALRSIG,1
call ALR1
btfsc ALRSIG,2
call ALR2
btfsc ALRSIG,3
call ALR3
bcf STATUS,RP0
bcf PCLATH,0
movf RTCCSIG,W
addwf PCL,1
goto main
goto RtccS1
goto RtccS2
goto Rtccs3
goto Rtccs4
clrf RTCCSIG
clrf RTCCSIG1
goto main
;*=====
ALR1 bcf STATUS,RP0
movf Hour,W
xorwf ALRH1,W
btfss STATUS,Z
goto ALREND
movf Mins,W
xorwf ALRM1,W
btfss STATUS,Z
goto ALREND
bsf STATUS,RP0
clrf TRISD
bcf STATUS,RP0
bcf STATUS,C
rlf PORTDB,1
btfsc STATUS,C
bsf PORTDB,0
movf PORTDB,W
movwf PORTD
return
;*---
ALR2 bcf STATUS,RP0
movf Hour,W
xorwf ALRH2,W
btfss STATUS,Z
goto ALREND
movf Mins,W
xorwf ALRM2,W
btfss STATUS,Z
goto ALREND
bsf STATUS,RP0
clrf TRISD
bcf STATUS,RP0
bcf STATUS,C
rlf PORTDB,1
btfsc STATUS,C
bsf PORTDB,0
movf PORTDB,W
movwf PORTD
return
;*----
ALR3 bcf STATUS,RP0
movf Hour,W
xorwf ALRH3,W
btfss STATUS,Z
goto ALREND
movf Mins,W
xorwf ALRM3,W
btfss STATUS,Z
goto ALREND
bsf STATUS,RP0
clrf TRISD
bcf STATUS,RP0
bcf STATUS,C
rlf PORTDB,1
btfsc STATUS,C
bsf PORTDB,0
movf PORTDB,W
movwf PORTD
return
;*---
ALREND
bsf STATUS,RP0
movlw 0ffh
movwf TRISD
return
;*=====
RtccS1
movlw 80h
call SendCmd
call DisplayTime
call LongDelay
movlw 0c0h
call SendCmd ;line2, 00
movlw 'S'
call putcLCD
movlw 'e'
call putcLCD
movlw 't'
call putcLCD
movlw ' '
call putcLCD
movlw 'T'
call putcLCD
movlw 'i'
call putcLCD
movlw 'm'
call putcLCD
movlw 'e'
call putcLCD ;show "Set Time"
movlw ' '
call putcLCD
movlw ' '
call putcLCD
movlw ' '
call putcLCD
movlw ' '
call putcLCD
bsf PCLATH,0
movf RTCCSIG1,W
addwf PCL,1
goto SetHour
goto SetMins
clrf INTSIG
incf RTCCSIG
clrf RTCCSIG1
goto main
;*----
SetHour
movlw 80h
call Selshow
movlw d'24'
subwf INTSIG,W
btfsc STATUS,C
goto $+4
movf INTSIG,w
movwf Hour
goto RtccS1
clrf INTSIG
movwf Hour
goto RtccS1
;*----
SetMins
movlw 83h
call Selshow
movlw d'60'
subwf INTSIG,W
btfsc STATUS,C
goto $+4
movf INTSIG,w
movwf Mins
goto RtccS1
clrf INTSIG
movwf Mins
goto RtccS1
;*=====
RtccS2
bcf STATUS,RP0
movlw 0c0h
call SendCmd
call Alarm
movlw '1'
call putcLCD
movlw ' '
call putcLCD
S2 movlw 80h
call SendCmd
call DisplayTime
call DispTime
call LongDelay
bsf PCLATH,0
movf RTCCSIG1,W
addwf PCL,1
goto SetAlH2
goto SetAlM2
movf Hour1,w
movwf ALRH1
movf Mins1,w
movwf ALRM1
clrf INTSIG
clrf RTCCSIG1
incf RTCCSIG
goto main
;*---
SetAlH2
movlw 0c7h
call Selshow
movf INTSIG,W
btfss STATUS,Z
bsf ALRSIG,1
movf INTSIG,W
movwf Hour1
movlw d'24'
subwf Hour1,W
btfss STATUS,C
goto S2
clrf INTSIG
clrf Hour1
goto S2
SetAlM2
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 S2
clrf INTSIG
clrf Mins1
goto S2
;*----
Alarm movlw 'A'
call putcLCD
movlw 'l'
call putcLCD
movlw 'a'
call putcLCD ;
movlw 'r'
call putcLCD
movlw 'm'
call putcLCD ;
return
;*----
Selshow
call SendCmd
movlw ' '
call putcLCD
movlw ' '
call putcLCD
call LongDelay
return
;*=====
Rtccs3
bcf STATUS,RP0
movlw 0c0h
call SendCmd
call Alarm
movlw '2'
call putcLCD
movlw ' '
call putcLCD
S3 movlw 80h
call SendCmd
call DisplayTime
call DispTime
call LongDelay
bsf PCLATH,0
movf RTCCSIG1,w
addwf PCL,1
goto SetAlH3
goto SetAlM3
movf Hour1,w
movwf ALRH2
movf Mins1,w
movwf ALRM2
clrf INTSIG
clrf RTCCSIG1
incf RTCCSIG
goto main
;*---
SetAlH3
movlw 0c7h
call Selshow
movf INTSIG,W
btfss STATUS,Z
bsf ALRSIG,2
movf INTSIG,W
movwf Hour1
movlw d'24'
subwf Hour1,W
btfss STATUS,C
goto S3
clrf INTSIG
clrf Hour1
goto S3
SetAlM3
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 S3
clrf INTSIG
clrf Mins1
goto S3
;*=====
Rtccs4
movlw 80h
call SendCmd
call DisplayTime
bcf STATUS,RP0
movlw 0c0h
call SendCmd
call Alarm
movlw '3'
call putcLCD
movlw ' '
call putcLCD
S4 call DispTime
call LongDelay
bsf PCLATH,0
movf RTCCSIG1,w
addwf PCL,1
goto SetAlH4
goto SetAlM4
movf Hour1,w
movwf ALRH3
movf Mins1,w
movwf ALRM3
clrf INTSIG
clrf RTCCSIG1
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
单片机 51单片机 MCU 单片机视频教程 单片机开发 ARM单片机 AVR单片机 PIC单片机 Atmel stm32 单片机学习 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)