ORG PIC54 GOTO MAIN ORG 0 ;---------------------- ;---------------------------- DELAY22 MOVLW D'200' ; DELAY 2*250=500mS MOVWF COUNT1 DE32 MOVLW D'250' ; 8*250=2mS MOVWF COUNT2 DE42 NOP ; 1+2+1=5uS DECFSZ COUNT2,1 GOTO DE42 DECFSZ COUNT1,1 GOTO DE32 RETLW 0 ;-------------------------------- ; 子程序!!! ;******************************** MAIN MOVLW 0FFH TRIS RA LOOP CALL CONVERT CALL DELAY22 CALL DELAY22 CALL GET_TEMP
GOTO LOOP ;------------------------ GET_TEMP CALL INI MOVLW 0CCH MOVWF COMD CALL WR1820 MOVLW 0BEH MOVWF COMD CALL WR1820 CALL RE1820 MOVF TEM_DATE,W MOVWF TEM_DATEL CALL RE1820 MOVF TEM_DATE,W MOVWF TEM_DATEH RETLW 0 ;------------------------ CONVERT CALL INI MOVLW 0CCH MOVWF COMD CALL WR1820 MOVLW 44H MOVWF COMD CALL WR1820 RETLW 0
;---------DS1820--------- INI ;MOVLW B'00100000' MOVLW 0 TRIS RA BSF RA,3 NOP BCF RA,3 MOVLW D'200' MOVWF COUNT1 L0 DECFSZ COUNT1,1 GOTO L0 ;MOVLW B'01100000' MOVLW 0FH TRIS RA MOVLW D'30' MOVWF COUNT1 L1 DECFSZ COUNT1,1 GOTO L1 BTFSC RA,3 GOTO INI L2 MOVLW D'80' MOVWF COUNT1 L3 DECFSZ COUNT1,1 GOTO L3 BTFSS RA,3 GOTO L0 RETLW 0 ;------------------------- WR1820 MOVLW 8 MOVWF COUNT2 WR0 ;MOVLW B'00100000' MOVLW 0 TRIS RA BCF RA,3 NOP NOP MOVLW 2 MOVWF COUNT1 WR1 DECFSZ COUNT1,1 GOTO WR1 ;MOVLW B'01111111' MOVLW 0FH BTFSC COMD,0 BSF RA,3 BTFSC COMD,0 TRIS RA BCF STATUS,C RRF COMD,1 MOVLW D'20' MOVWF COUNT1 WR2 DECFSZ COUNT1,1 GOTO WR2 BSF RA,3 ;MOVLW B'01100000' MOVLW 0FH TRIS RA DECFSZ COUNT2,1 GOTO WR0 RETLW 0 ;-------------------------- RE1820 MOVLW 8 MOVWF COUNT2 RE0 ;MOVLW B'00100000' MOVLW 0 TRIS RA BCF RA,3 MOVLW 2 MOVWF COUNT1 RE1 DECFSZ COUNT1,1 GOTO RE1 ;MOVLW B'01100000' MOVLW 0FH TRIS RA NOP BTFSS RA,3 BCF STATUS,C BTFSC RA,3 BSF STATUS,C RRF TEM_DATE,1 MOVLW D'20' MOVWF COUNT1 RE2 DECFSZ COUNT1,1 GOTO RE2 DECFSZ COUNT2,1 GOTO RE0 BSF RA,3 RETLW 0 ;------------------------- ;**************************** ;************************** END
PIC控制时钟芯片DS1302汇编程序
;PIC单片机 http://www./ #INCLUDE CBLOCK 20H SEC ;秒 MIN ;分 HOU ;小时 DATE ;日期 MON ;月 DAY ;日 YERR ;年 DDD ;写使能位 TIME_TX ;1302发送寄存器 TIME_RX ;1302接收寄存器 COUNT1 ; COUNT2 ; DELAY1 DELAY2 ENDC ******************************* ; ; 1302子程序说明 ; ;****************************** ; DS1302INI ;1302初始化,先禁止RST,设定充电方式 ; SET_TIME ;一次发送7个数据设定时间,包含写使能寄存器,8个数据 ; GET_TIME ;一次接收7个数据显示时间 ; TIME_WRITE_1;一次写入1302一个字节 ; TIME_READ_1 ;一次接收一个字节数据 ; ;******* 1302定义************** ; ;****************************** #DEFINE I_O PORTC,7 ;1302I_O #DEFINE SCLK PORTC,6 ;1302时钟 #DEFINE RST PORTA,0 ;1302使能位 #DEFINE RX_ADD 40H ;保存接受的7个数据 #DEFINE TX_ADD 20H ;开始保存7个要写入的时间数据 BANK1 MACRO BSF STATUS,RP0 ENDM BANK0 MACRO BCF STATUS,RP0 ENDM
ORG 000H NOP GOTO MAIN MAIN
CALL CLR_RAM 清除RAN CALL PORT_INI 端口定义 CALL DS1302_INI CALL SET_TIME 一次写入7个时间数据 CALL GET_TIME ; 一次读回7个时间数据 GOTO $
;; 写入秒,可以写任意的7个时间数据,单字节 MOVLW B'10000000' MOVWF TIME_TX BSF RST CALL TIME_WRITE_1 MOVLW B'00100101' MOVWF TIME_TX CALL TIME_WRITE_1 BCF RST
读秒,可以读任意7个时间,单字节
MOVLW B'10000001' MOVWF TIME_TX BSF RST CALL TIME_WRITE_1 CALL TIME_READ_1 BCF RST
GOTO $
:子程序
************************************************** ; DS1302_INI ; 作用:初始化1302,先禁止RST,允许写使能 ;************************************************** DS1302_INI BCF SCLK BCF RST ;先禁止 MOVLW B'10001110' ;写使能寄存器 MOVWF TIME_TX BSF RST CALL TIME_WRITE_1 MOVLW B'0' ;允许写使能 MOVWF TIME_TX CALL TIME_WRITE_1;发送一个字节的数据 BCF RST
;设定充电方式
没有设定 RETURN
;************************************************** ; SET_TIME ; 作用:一次输入7个数据来一次性的设定时间,同时使能写寄存器 ; 突发模式写入,必须写入8个数据,不是7个 ; INPUT:要设定的8个数据已经写入到TIME_TX_ADD开始的8个字节里面 ;************************************************** SET_TIME MOVLW B'10111110' ;标志位 MOVWF TIME_TX BSF RST CALL TIME_WRITE_1 ;TIME_WRITE_8 ;发送8个数据 MOVLW TIME_TX_ADD ;发送数据的起始地址 MOVWF FSR MOVLW D'8' MOVWF COUNT2 TW1 MOVF INDF,W MOVWF TIME_TX CALL TIME_WRITE_1 INCF FSR,F DECFSZ COUNT2,F GOTO TW1 BCF RST RETURN ;*********************************************** ; GET_TIME ; 作用:一次接受7个字节的时间数据,突发模式读取 ; INPUT:NONE ; OUTPUT:把7个时间数据保存在TIME_RX_ADD开始的7个寄存器里面 ;*********************************************** GET_TIME MOVLW B'10111111' MOVWF TIME_TX BSF RST CALL TIME_WRITE_1 ;TIME_READ_7 ;接收7个数据 MOVLW TIME_RX_ADD ;保存数据的起始地址 MOVWF FSR MOVLW D'7' MOVWF COUNT2 TR2 CALL TIME_READ_1 MOVF TIME_RX,W MOVWF INDF INCF FSR,F DECFSZ COUNT2,F GOTO TR2 BCF RST RETURN ;************************************************ ; TIME_WRITE_1 ; 作用:一次发送一个字节的数据,用于发送1302的 ; 控制字或者发送一个数据 ; INPUT: TIME_TX ;************************************************ TIME_WRITE_1 MOVLW D'8' MOVWF COUNT1 TLOP BCF I_O ;初始值是低电平 BCF SCLK BTFSC TIME_TX,0 BSF I_O RRF TIME_TX,F BSF SCLK ;高电平发送数据 DECFSZ COUNT1,F GOTO TLOP BCF SCLK ;恢复 RETURN ;************************************************ ; TIME_READ_1 ; 作用:读取1302一个字节的数据 ; INPUT: NONE ; OUTPUT:接收数据保存在TIME_RX里面 ; 原理:在SCLK下降沿接收数据,低字节在前,根据I_O的 ; 的电平的高低,采取带进位和不带进位右移. ;*********************************************** TIME_READ_1 BANK1 BSF TRISC,7 ;I_O IS INPUT BANK0 MOVLW D'8' MOVWF COUNT1 ;读取8个字节 TR1 BCF SCLK ;下降沿读取 BCF STATUS,C BTFSC I_O BSF STATUS,C RRF TIME_RX,F BSF SCLK ;恢复高电平 DECFSZ COUNT1,F GOTO TR1 BANK1 BCF TRISC,7 ;OUTPUT BANK0 BCF SCLK ;恢复 RETURN NOP
PORT_INI BANK1 MOVLW B'00000000' MOVWF TRISC MOVLW B'0' MOVWF TRISB MOVLW B'00000111' MOVWF ADCON1 MOVLW B'00000000' MOVWF TRISA BANK0 MOVLW 18H MOVWF 20H MOVLW 19H MOVWF 21H MOVLW 05H MOVWF 22H MOVLW 13H MOVWF 23H MOVLW 14H MOVWF 24H MOVLW 15H MOVWF 25H MOVLW 16H MOVWF 26H RETURN CLR_RAM MOVLW 20H MOVWF FSR LOOP CLRF INDF INCF FSR,F BTFSS FSR,7 GOTO LOOP ;清除32个 RETURN END
LCD驱动HT1621的PIC源代码
;PIC单片机 http://www./ STATUS EQU 3H FSR EQU 4H RB EQU 6H RC EQU 7H OPTIONA EQU 81H TRISB EQU 86H TRISC EQU 87H
GENR0 EQU 053H GENR1 EQU 054H WD_RG EQU 055H DA_AG0 EQU 056H ;SEG0 SEG1 DA_AG8 EQU 05EH ;SEG16 SEG17 ;............................. C EQU 0 Z EQU 2 RP0 EQU 5 RP1 EQU 6 CS EQU 2 WDA EQU 5 ;RC,5数据线 WCLK EQU 1 ;RB,1写时钟线 RCLK EQU 4 ;RB,4读时钟线 ;.............................. ORG 0H GOTO START ;............................... START BSF STATUS,RP0 MOVLW 00H MOVWF TRISB MOVLW 81H MOVWF TRISC BCF STATUS,RP0 MOVLW 12H MOVWF RB BSF RC,2 BSF RC,5 MOVLW 4 MOVWF OPTIONA LOOP NOP CALL X_QUAN NOP GOTO LOOP
;............................ X_QUAN MOVLW 8H CALL ON_LCD ;TRANSMIT TH1621 WORK MODE VALUE MOVLW 9H ;显示9位LCD CALL DIS_DATA RETURN ;............................ ON_LCD MOVWF GENR1 BCF RC,2 MOVLW 80H ;HI_W3 BITS:100 MOVWF WD_RG MOVLW 3 ;3位命令100 CALL TRAM_DATA ON_LCD0 MOVF GENR1,0 CALL ON_VALUE ;查表初始化LCD MOVWF WD_RG
MOVLW 8 ;送8位查表值 CALL TRAM_DATA BCF RC,WDA NOP NOP BCF RB,1 NOP NOP BSF RB,1 BSF RC,2 DECFSZ GENR1,1 GOTO ON_LCD+1 RETURN ;........................ ON_VALUE ADDWF 2 NOP RETLW 03H ;LCD ON RETLW 01H ;SYS ON
RETLW 08H ;TONE OFF RETLW 29H ;BISA1/3 4 COM RETLW 18H ;256K RETLW 05H ;WDT DISABLE
RETLW 80H ;/IRQ DISABLE * RETLW 0E3H ;NORMAL MODE *
;................................ ;TRANSMIT BITS SUBROUTINE TRAM_DATA BCF STATUS,0 MOVWF GENR0 BCF RB,1 RLF WD_RG BTFSS 3,0 GOTO $+3 BSF RC,WDA GOTO $+2 BCF RC,WDA BSF RB,1 DECFSZ GENR0,1 GOTO TRAM_DATA+2 RETURN ;....................... DIS_DATA MOVWF GENR1 ;9位LCD BCF RC,2 MOVLW 0A0H MOVWF WD_RG ;WRITE CONTROL
MOVLW 3H ;3位写命令101 CALL TRAM_DATA MOVLW 00 MOVWF WD_RG ;WRITE ADDRESS MOVLW 6H ;6位地址 CALL TRAM_DATA ; DIS_DATA0 MOVLW 0FFH MOVWF WD_RG ;DISPLAY CODE
MOVLW 8 ;8段数据 CALL TRAM_DATA
DECFSZ GENR1,1 GOTO DIS_DATA0 BSF RC,2 RETLW 0 END
|