📄 rtc-demo.asm
字号:
; putc(k);
CALL putc
;
;
; } //End Special Characters
; else if (k == 'b') //Print Binary
GOTO m028
m007 MOVF k,W
XORLW .98
BTFSS 0x03,Zero_
GOTO m012
; {
; for( m = 0 ; m < 8 ; m++ )
CLRF m
m008 MOVLW .8
SUBWF m,W
BTFSC 0x03,Carry
GOTO m028
; {
; if (my_byte.7 == 1) putc('1');
BTFSS my_byte,7
GOTO m009
MOVLW .49
CALL putc
; if (my_byte.7 == 0) putc('0');
m009 BTFSC my_byte,7
GOTO m010
MOVLW .48
CALL putc
; if (m == 3) putc(' ');
m010 MOVF m,W
XORLW .3
BTFSS 0x03,Zero_
GOTO m011
MOVLW .32
CALL putc
;
; my_byte = my_byte << 1;
m011 BCF 0x03,Carry
RLF my_byte,1
RLF my_byte+1,1
; }
INCF m,1
GOTO m008
; } //End Binary
; else if (k == 'd') //Print Decimal
m012 MOVF k,W
XORLW .100
BTFSS 0x03,Zero_
GOTO m023
; {
; //Print negative sign and take 2's compliment
; /*
; if(my_byte < 0)
; {
; putc('-');
; my_byte ^= 0xFFFF;
; my_byte++;
; }
; */
;
; if (my_byte == 0)
MOVF my_byte,W
IORWF my_byte+1,W
BTFSS 0x03,Zero_
GOTO m013
; putc('0');
MOVLW .48
CALL putc
; else
GOTO m028
; {
; //Divide number by a series of 10s
; for(m = 4 ; my_byte > 0 ; m--)
m013 MOVLW .4
MOVWF m
m014 BTFSC my_byte+1,7
GOTO m021
MOVF my_byte,W
IORWF my_byte+1,W
BTFSC 0x03,Zero_
GOTO m021
; {
; temp = my_byte % (uns16)10;
MOVF my_byte,W
MOVWF C2tmp
MOVF my_byte+1,W
MOVWF C2tmp+1
CLRF temp
MOVLW .16
MOVWF C1cnt
m015 RLF C2tmp,1
RLF C2tmp+1,1
RLF temp,1
BTFSC 0x03,Carry
GOTO m016
MOVLW .10
SUBWF temp,W
BTFSS 0x03,Carry
GOTO m017
m016 MOVLW .10
SUBWF temp,1
m017 DECFSZ C1cnt,1
GOTO m015
; decimal_output[m] = temp;
MOVLW .58
ADDWF m,W
MOVWF FSR
BCF 0x03,IRP
MOVF temp,W
MOVWF INDF
; my_byte = my_byte / (uns16)10;
MOVF my_byte,W
MOVWF C4tmp
MOVF my_byte+1,W
MOVWF C4tmp+1
CLRF C5rem
MOVLW .16
MOVWF C3cnt
m018 RLF C4tmp,1
RLF C4tmp+1,1
RLF C5rem,1
BTFSC 0x03,Carry
GOTO m019
MOVLW .10
SUBWF C5rem,W
BTFSS 0x03,Carry
GOTO m020
m019 MOVLW .10
SUBWF C5rem,1
BSF 0x03,Carry
m020 RLF my_byte,1
RLF my_byte+1,1
DECFSZ C3cnt,1
GOTO m018
; }
DECF m,1
GOTO m014
;
; for(m++ ; m < 5 ; m++)
m021 INCF m,1
m022 MOVLW .5
SUBWF m,W
BTFSC 0x03,Carry
GOTO m028
; putc(bin2Hex(decimal_output[m]));
MOVLW .58
ADDWF m,W
MOVWF FSR
BCF 0x03,IRP
MOVF INDF,W
CALL bin2Hex
CALL putc
INCF m,1
GOTO m022
; }
;
; } //End Decimal
; else if (k == 'h') //Print Hex
m023 MOVF k,W
XORLW .104
BTFSS 0x03,Zero_
GOTO m025
; {
; //New trick 3-15-04
; putc('0');
MOVLW .48
CALL putc
; putc('x');
MOVLW .120
CALL putc
;
; if(my_byte > 0x00FF)
BTFSC my_byte+1,7
GOTO m024
MOVF my_byte+1,1
BTFSC 0x03,Zero_
GOTO m024
; {
; putc(bin2Hex(my_byte.high8 >> 4));
SWAPF my_byte+1,W
ANDLW .15
CALL bin2Hex
CALL putc
; putc(bin2Hex(my_byte.high8 & 0b.0000.1111));
MOVLW .15
ANDWF my_byte+1,W
CALL bin2Hex
CALL putc
; }
;
; putc(bin2Hex(my_byte.low8 >> 4));
m024 SWAPF my_byte,W
ANDLW .15
CALL bin2Hex
CALL putc
; putc(bin2Hex(my_byte.low8 & 0b.0000.1111));
MOVLW .15
ANDWF my_byte,W
CALL bin2Hex
CALL putc
;
; /*high_byte.3 = my_byte.7;
; high_byte.2 = my_byte.6;
; high_byte.1 = my_byte.5;
; high_byte.0 = my_byte.4;
;
; low_byte.3 = my_byte.3;
; low_byte.2 = my_byte.2;
; low_byte.1 = my_byte.1;
; low_byte.0 = my_byte.0;
;
; putc('0');
; putc('x');
;
; putc(bin2Hex(high_byte));
; putc(bin2Hex(low_byte));*/
; } //End Hex
; else if (k == 'f') //Print Float
GOTO m028
m025 MOVF k,W
XORLW .102
BTFSS 0x03,Zero_
GOTO m026
; {
; putc('!');
MOVLW .33
CALL putc
; } //End Float
; else if (k == 'u') //Print Direct Character
GOTO m028
m026 MOVF k,W
XORLW .117
BTFSS 0x03,Zero_
GOTO m028
; {
; //All ascii characters below 20 are special and screwy characters
; //if(my_byte > 20)
; putc(my_byte);
MOVF my_byte,W
CALL putc
; } //End Direct
;
; } //End Special Chars
;
; else
GOTO m028
; putc(k);
m027 MOVF k,W
CALL putc
; }
m028 INCF i,1
GOTO m006
; FILE D:\Pics\code\16F88\RTC-Demo\rtc-demo.c
;
;#include "\Pics\code\stdio.c" //Software based Basic Serial IO
m029 RETURN
; FILE \Pics\code\16F88\RTC-Demo\I2c.c
;/*
; 5/29/02
; Copyright Spark Fun Electronics 2004
;
; Nathan Seidle
; spark@sparkfun.com
;
; I2C Interface with 24LC04B
; Started on 5-19
; 12:22am 5-29 First Working I2C - DAH! 10 $#@%ing days
; 12:51am 5-29 Cleaned up - 4MHz Operation
;
; 7-20 Added page selection
;
; 9-23 Started working with SOIC 24LC16B - 16k baby!
; Need to increase page_num to full byte.
; Bits 2 1 0 control up to 8 256byte pages.
;
;
; 7-23-03 Touched up.
;
; 8-7-03 Moved to 24LC32A - 4k bytes. But now we have to have three byte transmission
; for each read/write. The A0,A1,A2 must also be tied high/low.
;
; 9-7-03 Added Ack_polling to both read and write routines. This fixed many small
; graphical errors on the display.
;
; 11-23-04 Tweaked for use with the DS1307 RTC Module
; Can we use the internal pull-up resistors on the PIC for the required
; resistors on the I2C bus? Yep - neat!
;
;*/
;
;
;//=================
;//Make sure the bits agree with the TRISB statements
;#pragma bit scl_IIC @ PORTB.0
;#pragma bit sda_IIC @ PORTB.1
;
;#define WRITE_sda() TRISB = TRISB & 0b.1111.1101 //SDA must be output when writing
;#define READ_sda() {TRISB = TRISB | 0b.0000.0010; OPTION.7 = 0;} //SDA must be input when reading - Enable pull-up resistor on SDA
;
;#define DEVICE_ADDRESS 0xD0
;//=================
;
;void start(void);
;void stop(void);
;int read_byte(void);
;void send_byte(uns8);
;int read_eeprom(uns16);
;void write_eeprom(uns16, uns8);
;
;void ack_polling(void)
;{
ack_polling
; while(sda_IIC != 0)
m030 BTFSS 0x06,sda_IIC
GOTO stop
; {
; start();
CALL start
; send_byte(DEVICE_ADDRESS);
MOVLW .208
CALL send_byte
; }
GOTO m030
; stop();
;}
;
;void write_eeprom(uns16 address, uns8 thing)
;{
write_eeprom
MOVWF thing
; ack_polling();
CALL ack_polling
;
; start();
CALL start
; send_byte(DEVICE_ADDRESS);
MOVLW .208
CALL send_byte
;
; //send_byte(address.high8); //Uppder Address - Needed for >= 32k EEProms
; send_byte(address.low8);
MOVF address,W
CALL send_byte
; send_byte(thing);
MOVF thing,W
CALL send_byte
; stop();
GOTO stop
;}
;
;int read_eeprom(uns16 address)
;{
read_eeprom
; ack_polling();
CALL ack_polling
;
; start();
CALL start
; send_byte(DEVICE_ADDRESS);
MOVLW .208
CALL send_byte
; //send_byte(address.high8); //Uppder Address - Needed for >= 32k EEProms
; send_byte(address.low8);
MOVF address_2,W
CALL send_byte
; stop();
CALL stop
;
; start();
CALL start
; send_byte(DEVICE_ADDRESS | 0b.0000.0001); //Read bit must be set
MOVLW .209
CALL send_byte
; address = read_byte();
CALL read_byte
MOVWF address_2
CLRF address_2+1
BTFSC address_2,7
DECF address_2+1,1
; stop();
CALL stop
;
; return(address);
MOVF address_2,W
RETURN
;}
;
;void start(void)
;{
start
; WRITE_sda();
BSF 0x03,RP0
BCF TRISB,1
; sda_IIC = 0;
BCF 0x03,RP0
BCF 0x06,sda_IIC
;}
RETURN
;
;void stop(void)
;{
stop
; scl_IIC = 0;
BCF 0x06,scl_IIC
;
; WRITE_sda();
BSF 0x03,RP0
BCF TRISB,1
;
; sda_IIC = 0;
BCF 0x03,RP0
BCF 0x06,sda_IIC
; nop();
NOP
; nop();
NOP
; nop();
NOP
; nop();
NOP
; scl_IIC = 1;
BSF 0x06,scl_IIC
; nop();
NOP
; nop();
NOP
; nop();
NOP
; sda_IIC = 1;
BSF 0x06,sda_IIC
;}
RETURN
;
;int read_byte(void)
;{
read_byte
; int j, in_byte;
;
; scl_IIC = 0;
BCF 0x06,scl_IIC
;
; READ_sda();
BSF 0x03,RP0
BSF TRISB,1
BCF OPTION_REG,7
;
; for(j = 0 ; j < 8 ; j++)
BCF 0x03,RP0
CLRF j
m031 BTFSC j,7
GOTO m032
MOVLW .8
SUBWF j,W
BTFSC 0x03,Carry
GOTO m033
; {
; scl_IIC = 0;
m032 BCF 0x06,scl_IIC
; nop();
NOP
; nop();
NOP
; nop();
NOP
; nop();
NOP
; scl_IIC = 1;
BSF 0x06,scl_IIC
;
; in_byte = rl(in_byte);
RLF in_byte,1
; in_byte.0 = sda_IIC;
BCF in_byte,0
BTFSC 0x06,sda_IIC
BSF in_byte,0
; }
INCF j,1
GOTO m031
;
; return(in_byte);
m033 MOVF in_byte,W
RETURN
;}
;
;void send_byte(uns8 nate)
;{
send_byte
MOVWF nate_3
; int i;
;
; WRITE_sda();
BSF 0x03,RP0
BCF TRISB,1
;
; for( i = 0 ; i < 8 ; i++ )
BCF 0x03,RP0
CLRF i_2
m034 BTFSC i_2,7
GOTO m035
MOVLW .8
SUBWF i_2,W
BTFSC 0x03,Carry
GOTO m036
; {
; nate = rl(nate);
m035 RLF nate_3,1
; scl_IIC = 0;
BCF 0x06,scl_IIC
; sda_IIC = Carry;
BTFSS 0x03,Carry
BCF 0x06,sda_IIC
BTFSC 0x03,Carry
BSF 0x06,sda_IIC
; scl_IIC = 1;
BSF 0x06,scl_IIC
; nop();
NOP
; }
INCF i_2,1
GOTO m034
;
; //read ack.
; scl_IIC = 0;
m036 BCF 0x06,scl_IIC
; READ_sda();
BSF 0x03,RP0
BSF TRISB,1
BCF OPTION_REG,7
; scl_IIC = 1;
BCF 0x03,RP0
BSF 0x06,scl_IIC
; FILE D:\Pics\code\16F88\RTC-Demo\rtc-demo.c
;#include "\Pics\code\16F88\RTC-Demo\I2c.c" //Software based I2C routines
RETURN
;
;void boot_up(void);
;void rtc_programming(void);
;void read_rtc(void);
;
;void main(void)
;{
main
; uns8 choice;
;
; boot_up();
BSF 0x03,RP0
BCF 0x03,RP1
CALL boot_up
;
; while(1)
; {
; printf("\n\r\n\r========RTC DEMO========\n\r", 0);
m037 CLRF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; printf("Main Menu:\n\r", 0);
MOVLW .31
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; printf(" 1) Program RTC Module\n\r", 0);
MOVLW .44
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; printf(" 2) Check RTC Time\n\r", 0);
MOVLW .69
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
; printf("\n\r : ", 0);
MOVLW .90
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
;
; choice = getc();
CALL getc
MOVWF choice
;
; if (choice == '1')
XORLW .49
BTFSS 0x03,Zero_
GOTO m038
; {
; rtc_programming();
CALL rtc_programming
; }
; else if (choice == '2')
GOTO m037
m038 MOVF choice,W
XORLW .50
BTFSS 0x03,Zero_
GOTO m039
; {
; read_rtc();
CALL read_rtc
; }
; else
GOTO m037
; {
; printf("choice = %d", choice);
m039 MOVLW .96
MOVWF nate_2
CLRF nate_2+1
MOVF choice,W
MOVWF my_byte
CLRF my_byte+1
CALL printf
; }
; }
GOTO m037
;
; while(1);
m040 GOTO m040
;}//End Main
;
;//Read current RTC - Converts BCD bytes to printable numerals
;void read_rtc(void)
;{
read_rtc
; //SCL is connected to RB0
; //SDA is connected to RB1
;
; //All numbers are in BCD form
;
; uns8 x, temp;
;
; printf("\n\n\rCurrent Time and Date:\n\n\r ", 0);
MOVLW .108
MOVWF nate_2
CLRF nate_2+1
CLRF my_byte
CLRF my_byte+1
CALL printf
;
; //=======================
; x = read_eeprom(2); //Read hours register
MOVLW .2
MOVWF address_2
CLRF address_2+1
CALL read_eeprom
MOVWF x_2
; temp = x & 0b.0001.0000; //Avoid the hour settings
MOVLW .16
ANDWF x_2,W
MOVWF temp_2
; temp >>= 4;
SWAPF temp_2,W
ANDLW .15
MOVWF temp_2
; temp += '0';
MOVLW .48
ADDWF temp_2,1
; putc(temp);
MOVF temp_2,W
CALL putc
;
; temp = x & 0b.0000.1111; //Get hours - low number
MOVLW .15
ANDWF x_2,W
MOVWF temp_2
; temp += '0';
MOVLW .48
ADDWF temp_2,1
; putc(temp);
MOVF temp_2,W
CALL putc
; //=======================
;
; putc(':');
MOVLW .58
CALL putc
;
; //=======================
; x = read_eeprom(1); //Minutes
MOVLW .1
MOVWF address_2
CLRF address_2+1
CALL read_eeprom
MOVWF x_2
; temp = x & 0b.1111.0000;
MOVLW .240
ANDWF x_2,W
MOVWF temp_2
; temp >>= 4;
SWAPF temp_2,W
ANDLW .15
MOVWF temp_2
; temp += '0';
MOVLW .48
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -