📄 rtc-demo.asm
字号:
RLF C15rem,1
MOVLW .10
SUBWF C15rem,W
BTFSS 0x03,Carry
GOTO m076
MOVLW .10
SUBWF C15rem,1
BSF 0x03,Carry
m076 RLF temp_3,1
DECFSZ C13cnt,1
GOTO m075
; temp <<= 4;
SWAPF temp_3,W
ANDLW .240
MOVWF temp_3
; minutes %= 10;
MOVF minutes,W
MOVWF C17tmp
CLRF minutes
MOVLW .8
MOVWF C16cnt
m077 RLF C17tmp,1
RLF minutes,1
MOVLW .10
SUBWF minutes,W
BTFSS 0x03,Carry
GOTO m078
MOVLW .10
SUBWF minutes,1
m078 DECFSZ C16cnt,1
GOTO m077
; minutes = temp | minutes;
MOVF temp_3,W
IORWF minutes,1
; write_eeprom(1, minutes); //Load minutes register
MOVLW .1
MOVWF address
CLRF address+1
MOVF minutes,W
CALL write_eeprom
;
; /*
; Hour settings :
;
; Bit # - Programmed Setting : Description
; 7 - 0 :
; 6 - 1 : 12Hr or 24Hr Mode - High for AM/PM 12Hr. Mode
; 5 - 1 : AM/PM bit - Set to PM
; 4 - 0 :
;
; 3 - 1 :
; 2 - 0 :
; 1 - 0 :
; 0 - 0 : Set to 8 hours
; */
; temp = hours / 10; //Convert hours into BCD
MOVF hours,W
MOVWF C19tmp
CLRF C20rem
MOVLW .8
MOVWF C18cnt
m079 RLF C19tmp,1
RLF C20rem,1
MOVLW .10
SUBWF C20rem,W
BTFSS 0x03,Carry
GOTO m080
MOVLW .10
SUBWF C20rem,1
BSF 0x03,Carry
m080 RLF temp_3,1
DECFSZ C18cnt,1
GOTO m079
; temp <<= 4;
SWAPF temp_3,W
ANDLW .240
MOVWF temp_3
; hours %= 10;
MOVF hours,W
MOVWF C22tmp
CLRF hours
MOVLW .8
MOVWF C21cnt
m081 RLF C22tmp,1
RLF hours,1
MOVLW .10
SUBWF hours,W
BTFSS 0x03,Carry
GOTO m082
MOVLW .10
SUBWF hours,1
m082 DECFSZ C21cnt,1
GOTO m081
; hours = temp | hours;
MOVF temp_3,W
IORWF hours,1
; hours |= 0b.0100.0000; //Force 12hr mode
BSF hours,6
; if(am_pm == PM) hours |= 0b.0010.0000; //Force AM/PM bit
BTFSC 0x2B,am_pm
BSF hours,5
; if(am_pm == AM) hours &= 0b.1101.1111; //Force AM/PM bit
BTFSS 0x2B,am_pm
BCF hours,5
; write_eeprom(2, hours); //Write hour configuration
MOVLW .2
MOVWF address
CLRF address+1
MOVF hours,W
CALL write_eeprom
; //=========================================================
;
; //Date configuration
; //=========================================================
; cell = 1;
MOVLW .1
MOVWF cell
; uns8 day = 1, month = 1, date = 1, year = 4;
MOVWF day
MOVWF month
MOVWF date
MOVLW .4
MOVWF year
;
; printf("\n\r a/s change cell | +/- increase/decrease | p to program\n\r", 0);
MOVLW .183
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
;
; while(1)
; {
; if(day == 1) printf("Sunday", 0);
m083 DECFSZ day,W
GOTO m084
MOVLW .243
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(day == 2) printf("Monday", 0);
m084 MOVF day,W
XORLW .2
BTFSS 0x03,Zero_
GOTO m085
MOVLW .250
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(day == 3) printf("Tuesday", 0);
m085 MOVF day,W
XORLW .3
BTFSS 0x03,Zero_
GOTO m086
MOVLW .1
MOVWF nate_2
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(day == 4) printf("Wednesday", 0);
m086 MOVF day,W
XORLW .4
BTFSS 0x03,Zero_
GOTO m087
MOVLW .9
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(day == 5) printf("Thursday", 0);
m087 MOVF day,W
XORLW .5
BTFSS 0x03,Zero_
GOTO m088
MOVLW .19
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(day == 6) printf("Friday", 0);
m088 MOVF day,W
XORLW .6
BTFSS 0x03,Zero_
GOTO m089
MOVLW .28
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(day == 7) printf("Saturday", 0);
m089 MOVF day,W
XORLW .7
BTFSS 0x03,Zero_
GOTO m090
MOVLW .35
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
;
; putc(' ');
m090 MOVLW .32
CALL putc
;
; if(month == 1) printf("January", 0);
DECFSZ month,W
GOTO m091
MOVLW .44
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 2) printf("February", 0);
m091 MOVF month,W
XORLW .2
BTFSS 0x03,Zero_
GOTO m092
MOVLW .52
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 3) printf("March", 0);
m092 MOVF month,W
XORLW .3
BTFSS 0x03,Zero_
GOTO m093
MOVLW .61
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 4) printf("April", 0);
m093 MOVF month,W
XORLW .4
BTFSS 0x03,Zero_
GOTO m094
MOVLW .67
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 5) printf("May", 0);
m094 MOVF month,W
XORLW .5
BTFSS 0x03,Zero_
GOTO m095
MOVLW .73
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 6) printf("June", 0);
m095 MOVF month,W
XORLW .6
BTFSS 0x03,Zero_
GOTO m096
MOVLW .77
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 7) printf("July", 0);
m096 MOVF month,W
XORLW .7
BTFSS 0x03,Zero_
GOTO m097
MOVLW .82
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 8) printf("August", 0);
m097 MOVF month,W
XORLW .8
BTFSS 0x03,Zero_
GOTO m098
MOVLW .87
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 9) printf("September", 0);
m098 MOVF month,W
XORLW .9
BTFSS 0x03,Zero_
GOTO m099
MOVLW .94
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 10) printf("October", 0);
m099 MOVF month,W
XORLW .10
BTFSS 0x03,Zero_
GOTO m100
MOVLW .104
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 11) printf("November", 0);
m100 MOVF month,W
XORLW .11
BTFSS 0x03,Zero_
GOTO m101
MOVLW .112
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; if(month == 12) printf("December", 0);
m101 MOVF month,W
XORLW .12
BTFSS 0x03,Zero_
GOTO m102
MOVLW .121
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
;
; printf(" %d,", date);
m102 MOVLW .130
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
MOVF date,W
MOVWF my_byte
CLRF my_byte+1
CALL printf
;
; printf(" 200%d ", year);
MOVLW .135
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
MOVF year,W
MOVWF my_byte
CLRF my_byte+1
CALL printf
;
; data_byte_in = getc();
CALL getc
MOVWF data_byte_in
; if(data_byte_in == 'a' && cell > 1) cell--;
XORLW .97
BTFSS 0x03,Zero_
GOTO m103
MOVLW .2
SUBWF cell,W
BTFSC 0x03,Carry
DECF cell,1
; if(data_byte_in == 's' && cell < 4) cell++;
m103 MOVF data_byte_in,W
XORLW .115
BTFSS 0x03,Zero_
GOTO m104
MOVLW .4
SUBWF cell,W
BTFSS 0x03,Carry
INCF cell,1
;
; if(data_byte_in == '+')
m104 MOVF data_byte_in,W
XORLW .43
BTFSS 0x03,Zero_
GOTO m105
; {
; if(cell == 1) day++;
DECF cell,W
BTFSC 0x03,Zero_
INCF day,1
; if(cell == 2) month++;
MOVF cell,W
XORLW .2
BTFSC 0x03,Zero_
INCF month,1
; if(cell == 3) date++;
MOVF cell,W
XORLW .3
BTFSC 0x03,Zero_
INCF date,1
; if(cell == 4) year++;
MOVF cell,W
XORLW .4
BTFSC 0x03,Zero_
INCF year,1
; }
; if(data_byte_in == '-')
m105 MOVF data_byte_in,W
XORLW .45
BTFSS 0x03,Zero_
GOTO m106
; {
; if(cell == 1) day--;
DECF cell,W
BTFSC 0x03,Zero_
DECF day,1
; if(cell == 2) month--;
MOVF cell,W
XORLW .2
BTFSC 0x03,Zero_
DECF month,1
; if(cell == 3) date--;
MOVF cell,W
XORLW .3
BTFSC 0x03,Zero_
DECF date,1
; if(cell == 4) year--;
MOVF cell,W
XORLW .4
BTFSC 0x03,Zero_
DECF year,1
; }
;
; if(data_byte_in == 'p') break;
m106 MOVF data_byte_in,W
XORLW .112
BTFSC 0x03,Zero_
GOTO m107
;
; putc('\r');
MOVLW .13
CALL putc
;
; }
GOTO m083
;
; write_eeprom(3, day); //Load day register
m107 MOVLW .3
MOVWF address
CLRF address+1
MOVF day,W
CALL write_eeprom
;
; temp = month / 10; //Convert month into BCD
MOVF month,W
MOVWF C24tmp
CLRF C25rem
MOVLW .8
MOVWF C23cnt
m108 RLF C24tmp,1
RLF C25rem,1
MOVLW .10
SUBWF C25rem,W
BTFSS 0x03,Carry
GOTO m109
MOVLW .10
SUBWF C25rem,1
BSF 0x03,Carry
m109 RLF temp_3,1
DECFSZ C23cnt,1
GOTO m108
; temp <<= 4;
SWAPF temp_3,W
ANDLW .240
MOVWF temp_3
; month %= 10;
MOVF month,W
MOVWF C27tmp
CLRF month
MOVLW .8
MOVWF C26cnt
m110 RLF C27tmp,1
RLF month,1
MOVLW .10
SUBWF month,W
BTFSS 0x03,Carry
GOTO m111
MOVLW .10
SUBWF month,1
m111 DECFSZ C26cnt,1
GOTO m110
; month = temp | month;
MOVF temp_3,W
IORWF month,1
; printf(" --%h-- ", month);
MOVLW .146
MOVWF nate_2
MOVLW .1
MOVWF nate_2+1
MOVF month,W
MOVWF my_byte
CLRF my_byte+1
CALL printf
; write_eeprom(5, month); //Load month register
MOVLW .5
MOVWF address
CLRF address+1
MOVF month,W
CALL write_eeprom
;
; temp = date / 10; //Convert date into BCD
MOVF date,W
MOVWF C29tmp
CLRF C30rem
MOVLW .8
MOVWF C28cnt
m112 RLF C29tmp,1
RLF C30rem,1
MOVLW .10
SUBWF C30rem,W
BTFSS 0x03,Carry
GOTO m113
MOVLW .10
SUBWF C30rem,1
BSF 0x03,Carry
m113 RLF temp_3,1
DECFSZ C28cnt,1
GOTO m112
; temp <<= 4;
SWAPF temp_3,W
ANDLW .240
MOVWF temp_3
; date %= 10;
MOVF date,W
MOVWF C32tmp
CLRF date
MOVLW .8
MOVWF C31cnt
m114 RLF C32tmp,1
RLF date,1
MOVLW .10
SUBWF date,W
BTFSS 0x03,Carry
GOTO m115
MOVLW .10
SUBWF date,1
m115 DECFSZ C31cnt,1
GOTO m114
; date = temp | date;
MOVF temp_3,W
IORWF date,1
; write_eeprom(4, date); //Load date register
MOVLW .4
MOVWF address
CLRF address+1
MOVF date,W
CALL write_eeprom
;
; temp = year / 10; //Convert year into BCD
MOVF year,W
MOVWF C34tmp
CLRF C35rem
MOVLW .8
MOVWF C33cnt
m116 RLF C34tmp,1
RLF C35rem,1
MOVLW .10
SUBWF C35rem,W
BTFSS 0x03,Carry
GOTO m117
MOVLW .10
SUBWF C35rem,1
BSF 0x03,Carry
m117 RLF temp_3,1
DECFSZ C33cnt,1
GOTO m116
; temp <<= 4;
SWAPF temp_3,W
ANDLW .240
MOVWF temp_3
; year %= 10;
MOVF year,W
MOVWF C37tmp
CLRF year
MOVLW .8
MOVWF C36cnt
m118 RLF C37tmp,1
RLF year,1
MOVLW .10
SUBWF year,W
BTFSS 0x03,Carry
GOTO m119
MOVLW .10
SUBWF year,1
m119 DECFSZ C36cnt,1
GOTO m118
; year = temp | year;
MOVF temp_3,W
IORWF year,1
; write_eeprom(6, year); //Load year register
MOVLW .6
MOVWF address
CLRF address+1
MOVF year,W
CALL write_eeprom
;
; read_rtc(); //Print it out for double checking
GOTO read_rtc
;
;}
;
;void boot_up(void)
;{
boot_up
; //Setup Ports
; ANSEL = 0b.0000.0000; //Turn off A/D
CLRF ANSEL
;
; PORTA = 0b.0000.0000;
BCF 0x03,RP0
CLRF PORTA
; TRISA = 0b.1111.1111;
MOVLW .255
BSF 0x03,RP0
MOVWF TRISA
;
; PORTB = 0b.0000.0000;
BCF 0x03,RP0
CLRF PORTB
; TRISB = 0b.0000.0100; //0 = Output, 1 = Input RX on RB2
MOVLW .4
BSF 0x03,RP0
MOVWF TRISB
;
; //Setup the hardware UART module
; //=============================================================
; //SPBRG = 51; //8MHz for 9600 inital communication baud rate
; SPBRG = 129; //20MHz for 9600 inital communication baud rate
MOVLW .129
MOVWF SPBRG
;
; TXSTA = 0b.0010.0100; //8-bit asych mode, high speed uart enabled
MOVLW .36
MOVWF TXSTA
; RCSTA = 0b.1001.0000; //Serial port enable, 8-bit asych continous receive mode
MOVLW .144
BCF 0x03,RP0
MOVWF RCSTA
; //=============================================================
;
;}
RETURN
END
; *** KEY INFO ***
; 0x01BF P0 16 word(s) 0 % : enable_uart_TX
; 0x01CF P0 19 word(s) 0 % : enable_uart_RX
; 0x01E2 P0 6 word(s) 0 % : putc
; 0x01E8 P0 4 word(s) 0 % : getc
; 0x01EC P0 21 word(s) 1 % : bin2Hex
; 0x0201 P0 207 word(s) 10 % : printf
; 0x0004 P0 237 word(s) 11 % : _const1
; 0x02F2 P0 5 word(s) 0 % : start
; 0x02F7 P0 15 word(s) 0 % : stop
; 0x0306 P0 26 word(s) 1 % : read_byte
; 0x0320 P0 28 word(s) 1 % : send_byte
; 0x02E0 P0 18 word(s) 0 % : read_eeprom
; 0x02D6 P0 10 word(s) 0 % : write_eeprom
; 0x02D0 P0 6 word(s) 0 % : ack_polling
; 0x07BF P0 19 word(s) 0 % : boot_up
; 0x0507 P0 696 word(s) 33 % : rtc_programming
; 0x0372 P0 405 word(s) 19 % : read_rtc
; 0x033C P0 54 word(s) 2 % : main
; RAM usage: 36 bytes (36 local), 332 bytes free
; Maximum call level: 4
; Codepage 0 has 1999 word(s) : 97 %; Codepage 1 has 0 word(s) : 0 %; Total of 1793 code words (43 %)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -