⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc-demo.asm

📁 DS1307 RTC real time clock header file for atmel AT89X5X
💻 ASM
📖 第 1 页 / 共 4 页
字号:
			;                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 + -