亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hoarder.c

?? 用PIC16F877實現的基于Hoarder board的C源程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
  while ((cf_task_file_read(7)&0xC0)!=0x40);
  cf_task_file_write(2, 1);     
  cf_task_file_write(3, sector[0]);     
  cf_task_file_write(4, sector[1]);     
  cf_task_file_write(5, sector[2]);     
  cf_task_file_write(6, 0xE0 | (sector[3]&0x0F));     
  cf_task_file_write(7, 0x20);   // read sector command
  while ((cf_read()&0x88)!=0x08);
  cf_set_addr(0);
}

// start writing CF sector
// global var sector contains sector number
// after calling this function use cf_write()
// to write 512 bytes to sector
void cf_start_sector_write()
{
  while ((cf_task_file_read(7)&0xC0)!=0x40);
  cf_task_file_write(2, 1);     
  cf_task_file_write(3, sector[0]);     
  cf_task_file_write(4, sector[1]);     
  cf_task_file_write(5, sector[2]);     
  cf_task_file_write(6, 0xE0 | (sector[3]&0x0F));     
  cf_task_file_write(7, 0x30);   // write sector command
  while ((cf_read()&0x88)!=0x08);
  cf_set_addr(0);
}

// put CF to sleep mode (see CF specs)
#separate
void cf_sleep()
// put the card into sleep mode
{
  while ((cf_task_file_read(7)&0xC0)!=0x40);
  cf_task_file_write(6, 0xE0);     
  cf_task_file_write(7, 0x99);   // sleep command
}

// put CF to standby mode (see CF specs)
#separate
void cf_standby()
// put the card into stadby mode
{
  while ((cf_task_file_read(7)&0xC0)!=0x40);
  cf_task_file_write(6, 0xE0);     
  cf_task_file_write(7, 0x94);   // standby immediate command
}

// put CF to idle mode (see CF specs)
#separate
void cf_idle(int delay)
// put the card into idle mode, sets a delay for auto power-down
{
  while ((cf_task_file_read(7)&0xC0)!=0x40);
  cf_task_file_write(2, delay);     
  cf_task_file_write(6, 0xE0);     
  cf_task_file_write(7, 0x97);   // idle command
}

void print_prompt()
{
  putc('>');
}

void led_off()
{
  OUTPUT_LOW(CF_LED0);
  OUTPUT_LOW(CF_LED1);
}

void led_green()
{
  OUTPUT_LOW(CF_LED1);
  OUTPUT_HIGH(CF_LED0);
}

void led_red()
{
  OUTPUT_LOW(CF_LED0);
  OUTPUT_HIGH(CF_LED1);
}

// getc() after taking care of possible overflow error
char loadc()
{
  while (!input(RCIF))
  {
    if (input(OERR))
    {
      output_low(CREN);
      output_high(CREN);
    }
  }
  return getc();
}

// Yep! It's nope. Used for short delays.
#inline
void nop()
{
  #asm
  nop
  #endasm
}

// RTC functions
// see RTC chip specs http://pdfserv.maxim-ic.com/arpdf/DS1302.pdf (if still there)
// for data format etc

// IMPORTANT
// RTC READ/WRITE DOES NOT WORK IF CF CARD IS PLUGGED IN AND POWERED DOWN
// This is because of sharing port D pins
// So make sure CF is either out or powered up before using RTC

// Read time from RTC chip into time[] 
// 8-byte burst operation
// Note: nop() are important to get proper timing at 20MHz
void rtc_read_time()
{
  static byte i, j, result;

  set_tris_d(TRIS_D_RTC_OUT);
  output_high(RTC_RST);
  output_high(RTC_IO);
  
  for (i=0; i<6; i++) {
    output_high(RTC_CLK);
    nop();
    output_low(RTC_CLK);
  }
  output_low(RTC_IO);
  output_high(RTC_CLK);
  nop();
  output_low(RTC_CLK);
  output_high(RTC_IO);
  output_high(RTC_CLK);
  nop();
  set_tris_d(TRIS_D_RTC_IN);
  
  for (j=0; j<8; j++) {
    for (i=0; i<8; i++) {
      output_low(RTC_CLK);
      nop();
    	shift_right(&result, 1, input(RTC_IO));
      output_high(RTC_CLK);
    }
    time[j]=result;
  }
  
  output_low(RTC_CLK);
  output_low(RTC_IO); 
  output_low(RTC_RST);
  SET_TRIS_D(TRIS_D_IN);
}

// Read and return one byte from RTC chip at addr
int rtc_read(int addr)
{
  int i;

  set_tris_d(TRIS_D_RTC_OUT);
  output_high(RTC_RST);
  output_high(RTC_IO);
  output_high(RTC_CLK);
  nop();
  output_low(RTC_CLK);
  for (i=0; i<6; i++) {
    output_bit(RTC_IO, bit_test(addr, 0));
    output_high(RTC_CLK);
    addr>>=1;
    output_low(RTC_CLK);
  }
  output_high(RTC_IO);
  output_high(RTC_CLK);
  set_tris_d(TRIS_D_RTC_IN);
  for (i=0; i<8; i++) {
    output_low(RTC_CLK);
    nop();
  	shift_right(&_return_, 1, input(RTC_IO));
    output_high(RTC_CLK);
  }
  output_low(RTC_CLK);
  output_low(RTC_IO); 
  output_low(RTC_RST);
  SET_TRIS_D(TRIS_D_IN);
}

// Write data to RTC chip at addr
void rtc_write(int addr, int data)
{
  int i;

  set_tris_d(TRIS_D_RTC_OUT);
  output_high(RTC_RST);
  output_low(RTC_IO);
  output_high(RTC_CLK);
  nop();
  output_low(RTC_CLK);
  for (i=0; i<6; i++) {
    output_bit(RTC_IO, addr&1);
    output_high(RTC_CLK);
    addr>>=1;
    output_low(RTC_CLK);
  }
  output_high(RTC_IO);
  output_high(RTC_CLK);
  nop();
  output_low(RTC_CLK);
  for (i=0; i<8; i++) {
    output_bit(RTC_IO, data&1);
    output_high(RTC_CLK);
    data>>=1;
    output_low(RTC_CLK);
  }
  output_low(RTC_IO); 
  output_low(RTC_RST);
  set_tris_d(TRIS_D_IN);
}

// Write time to RTC chip
// 8-byte burst operation
void rtc_set_time()
{
  int i, j, data;

  set_tris_d(TRIS_D_RTC_OUT);
  output_high(RTC_RST);
  output_low(RTC_IO);
  output_high(RTC_CLK);
  nop();
  output_low(RTC_CLK);
  output_high(RTC_IO);
  for (i=0; i<5; i++) {
    output_high(RTC_CLK);
    output_low(RTC_CLK);
  }
  output_low(RTC_IO);
  output_high(RTC_CLK);
  nop();
  output_low(RTC_CLK);
  output_high(RTC_IO);
  output_high(RTC_CLK);
  nop();
  output_low(RTC_CLK);
  for (j=0; j<8; j++)
  {
    data=time[j];
    for (i=0; i<8; i++) {
      output_bit(RTC_IO, data&1);
      output_high(RTC_CLK);
      data>>=1;
      output_low(RTC_CLK);
    }
  }
  output_low(RTC_IO); 
  output_low(RTC_RST);
  set_tris_d(TRIS_D_IN);
}

// Use this function to skip previous records in data file and prevent
// accidental loss of previously recorded data when Hoarder restarts.
// Skips to first "unused" sector of data file.
// - "unused" sector has either invalid signature or timestamp lower than previous sector
// - sectors written by Hoarder have "ESL" signature and 6-byte time stamp in the beginning
//
// Function returns TRUE if data file is valid and not full
//                  FALSE if data file is not valid or no space left
// If function returns TRUE sector points to first "unused" sector of data file and 
// sector_counter indicates number of free sectors 
#separate
boolean init_file_write() {
  int i, t[6];
  if (cf_out || !(disk_valid && file_valid)) return FALSE;
  move32(sector, data_start);
  move32(sector_counter, data_file_size);
  for (i=0; i<6; i++) time[i]=0;
  while (!is_zero32(sector_counter)) {
    for (i=0; i<6; i++) t[i]=time[i];
    cf_start_sector_read();
    if ((cf_read()!='E')||(cf_read()!='S')||(cf_read()!='L')) return TRUE;
    for (i=0; i<6; i++) time[i]=cf_read();
    i=6;
    while (--i!=0xFF) if (time[i]<t[i]) return TRUE; else if (time[i]>t[i]) i=0;
    inc32(sector);
    dec32(sector_counter);
  }
  cf_idle(100);
  return FALSE;
}

// Call cf_start_sector_write() for next sector in data file
// return FALSE if no free sectors left
// uses global vars sector and sector_counter
#separate
boolean next_file_sector_write() {
  if (cf_out) return FALSE;
  if (is_zero32(sector_counter)) {
    cf_idle(100);
    return FALSE;
  }
  cf_start_sector_write();
  inc32(sector);
  dec32(sector_counter);
  return TRUE;
}

#separate
void save_audio()
{
  char tag1[4], tag2[4];
  long tagtime, tag1time, tag2time;
  int tagphase;

  if (cf_out || !(disk_valid && file_valid)) return;
  // Start at beginning of data file
  move32(sector, data_start);
  move32(sector_counter, data_file_size);
  
  tag1time=0xFFFF;
  tag2time=0xFFFF;
  tagphase=0;	
  // Set timer interrupt to 8kHz to sample audio
  setup_timer_2(T2_DIV_BY_1, 125, 5); // 8 kHz
  write_pos=0;
  // Set flags for timer interrupt data sampling
  audio=TRUE;
  ad_on=TRUE;
  // loop until something received thru serial port 
  // and full sector is written
  while ((!input(RCIF))||(write_pos!=512)) {
    // if sector ended start a new one	
    if (write_pos>=512) {
      write_pos=0;
    }
    else if (write_pos==0) {
      // exit if no space left in data file	
      if (!next_file_sector_write()) return;
      // blink
      SET_TRIS_C(TRIS_C);
      led_red();	
      // write sector signature ESL
      cf_write('E');
      cf_write('S');
      cf_write('L');
      // write time stamp
      rtc_read_time();
      cf_write(time[0]);
      cf_write(time[1]);
      cf_write(time[2]);
      cf_write(time[3]);
      cf_write(time[4]);
      cf_write(time[6]);
      write_pos+=9;
      led_off();
    } 
    // save accelerometer data 3 times in each sector 
    else if ((write_pos==170)||(write_pos==335)||(write_pos==500)) {
      putI2C(0xB0, 2);
      I2C_start();
      I2C_write(0xB0 | I2CREAD);
      cf_write(i2c_read());
      cf_write(i2c_read());
      cf_write(i2c_read());
      cf_write(i2c_read());
      i2c_read(0);
      I2C_stop();
      write_pos+=4;
      // write tag reader data once per sector
      if (write_pos==504) {
        if ((tagphase&0x1F)==0) {	
          putI2C(0xA0, 2);
          I2C_start();
          I2C_write(0xA0 | I2CREAD);
          tag1[0]=i2c_read();
          tag1[1]=i2c_read();
          tag1[2]=i2c_read();
          tag1[3]=i2c_read();
	        tagtime=i2c_read();
	        tagtime=tagtime<<8|i2c_read();
          i2c_read(0);
          I2C_stop();
          if (tagtime>=tag1time) zero32(tag1); 
          tag1time=tagtime;
          putI2C(0xA0, 3);
          I2C_start();
          I2C_write(0xA0 | I2CREAD);
          tag2[0]=i2c_read();
          tag2[1]=i2c_read();
          tag2[2]=i2c_read();
          tag2[3]=i2c_read();
          tagtime=i2c_read();
  	      tagtime=tagtime<<8|i2c_read();
          i2c_read(0);
          I2C_stop();
          if (tagtime>=tag2time) zero32(tag2); 
          tag2time=tagtime;
        }  
        tagphase++;
        cf_write(tag1[0]);
        cf_write(tag1[1]);
        cf_write(tag1[2]);
        cf_write(tag1[3]);
        cf_write(tag2[0]);
        cf_write(tag2[1]);
        cf_write(tag2[2]);
        cf_write(tag2[3]);
        write_pos+=8;    	
      }  
    } else if (write_pos<512) {
    // save buffered audio samples
    // sampling happens in timer interrupt
      while (buf_count==0);
      cf_write(buffer[buf_head]>>2);
      write_pos++;
      disable_interrupts(GLOBAL);
      buf_head=(buf_head+1)%buf_size;
      buf_count--;
      enable_interrupts(GLOBAL);
    }
  }
  // stop sampling, restore 1000Hz timer frequency
  ad_on=FALSE;
  audio=FALSE;
  purge_adc_buffer();
  setup_timer_2(T2_DIV_BY_4, 250, 5); // 1mS interval @ 20 MHz
}

#separate
void save_data()
{
  if (!disk_valid) return;
  write_pos=0;
  move32(sector, data_start);
  ad_on=TRUE;
  while ((!input(RCIF))||(write_pos!=512)) {
    if (write_pos>=512) {
      write_pos=0;
      inc32(sector);
    }
    if (write_pos==0) {
      led_red();
      cf_start_sector_write();
      cf_write('E');
      cf_write('S');
      rtc_read_time();
      cf_write(time[0]);
      cf_write(time[1]);
      cf_write(time[2]);
      cf_write(time[3]);
      cf_write(time[4]);
      cf_write(time[6]);
      write_pos+=8;
      led_off();
    }
    while (buf_count==0);
    cf_write(buffer[buf_head]);
    cf_write(buffer[buf_head]>>8);
    write_pos+=2;
    disable_interrupts(GLOBAL);
    buf_head=(buf_head+1)%buf_size;
    buf_count--;
    enable_interrupts(GLOBAL);
  }
  ad_on=FALSE;
  purge_adc_buffer();
  inc32(sector);
  cf_start_sector_write();
  for (write_pos=0; write_pos<512; write_pos++) cf_write(0);
}

#separate
void send_data()
{
  unsigned int temp;
  long int id;
  ad_on=TRUE;
  while (!input(RCIF)) {
    //for (temp=0; temp<19; temp++) putc(0xF0);
    putc(0x5A);	
    for (temp=0; temp<4; temp++) { 	
      while (buf_count==0);
      if (temp==3)
      {
        putc(buffer[buf_head]);
        if (id>0) putc((buffer[buf_head]>>8)|((id-1) << 2)|0xA8);
        else putc(buffer[buf_head]>>8);
      }
      if (temp==2)
      {
        if (buffer[buf_head]>768) id=0; else if (buffer[buf_head]<256) id=1; else id=2;
      }
      disable_interrupts(GLOBAL);
      buf_head=(buf_head+1)%buf_size;
      buf_count--;
      enable_interrupts(GLOBAL);
    }
  }
  ad_on=FALSE;
  purge_adc_buffer();
}

// Calculates standard 16-bit CRC
// uses global var crc16
// Note: crc16 should be set to 0 before each series of CRC calculations
void crc (unsigned int data)
{
  int i, j;
  for (i=0; i<8; i++) {
    j=(data^crc16)&1;
    crc16>>=1;
    if (j) crc16^=0xA001;
    data>>=1;
  }
}

// send data and update CRC
void put_crc(unsigned int data)
{
  putc(data); 
  crc(data);
}

#separate
void send_data_bim()
{
  unsigned int temp;
  unsigned int bits;
  unsigned long order;
  unsigned int i;
  if (!init_file_write()) return;
  ad_on=TRUE;
  order=0;
  output_low(BIM_TX);
  while (!input(RCIF) && next_file_sector_write()) {
    led_red();
    cf_write('E');
    cf_write('S');
    cf_write('L');
    rtc_read_time();
    cf_write(time[0]);
    cf_write(time[1]);
    cf_write(time[2]);
    cf_write(time[3]);
    cf_write(time[4]);
    cf_write(time[6]);
    led_off();
    for (i=0; i<100; i++) {	  	
      for (temp=0; temp<5; temp++) putc(0x0F<<(temp%5)); //total packet length 22
      crc16=0;
      put_crc(0xA5);
      put_crc(order);	
      put_crc(order>>8);	
      for (temp=0; temp<4; temp++) { 	
        while (buf_count==0);
        put_crc(buffer[buf_head]);
        cf_write(buffer[buf_head]);
        bits=(bits<<2)|((buffer[buf_head]>>8)&0x03);
        disable_interrupts(GLOBAL);
        buf_head=(buf_head+1)%buf_size;
        buf_count--;
        enable_interrupts(GLOBAL);
      }
      put_crc(bits);
      cf_write(bits);
      putc(crc16);     
      putc(crc16>>8);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区免费看| 成人激情动漫在线观看| 国产日韩欧美精品综合| 欧美日韩亚洲综合在线 | 国产拍揄自揄精品视频麻豆| 日韩理论在线观看| 国产精品美女久久久久久久| 久久久亚洲午夜电影| 欧美一级二级在线观看| 91精品国产综合久久香蕉的特点| 欧美日韩国产片| 欧美成人综合网站| 精品国产乱码久久久久久浪潮| 中文字幕乱码亚洲精品一区| 国产精品美女久久久久久| 激情偷乱视频一区二区三区| 国产高清无密码一区二区三区| 成人一区二区三区在线观看| 91亚洲精品久久久蜜桃网站| 欧美在线一区二区三区| 在线播放国产精品二区一二区四区| 欧美电影影音先锋| 天天综合网天天综合色 | 亚洲精品视频一区二区| 一区二区三区中文字幕在线观看| 亚洲不卡在线观看| 国产麻豆精品一区二区| 精品精品欲导航| 精品在线播放午夜| 成人三级伦理片| 国产精品每日更新在线播放网址 | 午夜电影一区二区| 欧美日韩亚洲综合一区| 亚洲福利视频导航| 国产精品自产自拍| 欧美性猛片xxxx免费看久爱| 久久婷婷成人综合色| 亚洲精品国产一区二区精华液 | 高清国产一区二区三区| 色视频一区二区| 91精品国产综合久久久蜜臀粉嫩| 日韩高清不卡一区二区| 成人午夜碰碰视频| 一区二区三区四区亚洲| 欧美午夜一区二区| 日韩专区一卡二卡| 色天天综合久久久久综合片| 亚洲va欧美va国产va天堂影院| 欧美日韩成人综合| 麻豆久久一区二区| 欧美猛男gaygay网站| 久久国产精品99久久人人澡| 91国产免费看| 亚洲三级久久久| 欧美人伦禁忌dvd放荡欲情| 亚洲18色成人| 久久久激情视频| 色婷婷av一区二区三区gif| 蜜臀精品久久久久久蜜臀| 久久嫩草精品久久久久| 91丨porny丨国产入口| 日韩在线一区二区三区| 国产精品入口麻豆原神| 欧美日韩你懂得| 欧美日韩国产123区| 免费欧美高清视频| 欧美精品精品一区| 国产乱人伦偷精品视频免下载| 亚洲欧美日韩国产成人精品影院| av在线免费不卡| 综合色天天鬼久久鬼色| 91精品国产色综合久久| 日韩av中文在线观看| 国产精品视频yy9299一区| 欧美酷刑日本凌虐凌虐| 成人晚上爱看视频| 日本免费在线视频不卡一不卡二| 国产精品私人影院| 欧美一级一级性生活免费录像| 福利一区福利二区| 激情六月婷婷久久| 亚洲大片一区二区三区| 国产精品乱码妇女bbbb| 国产成人综合在线| 日韩不卡一区二区三区| 亚洲精选在线视频| 久久蜜臀中文字幕| 精品国产免费一区二区三区四区 | 日本女优在线视频一区二区| 亚洲精品欧美综合四区| 日本一区二区三区在线不卡| 日韩一区二区免费电影| 欧美日韩一区二区三区在线看| 成人短视频下载| 国产999精品久久久久久| 激情小说欧美图片| 蜜臀av亚洲一区中文字幕| 亚洲一级二级三级在线免费观看| 欧美日韩视频第一区| 91同城在线观看| 成人av在线一区二区| 粉嫩av亚洲一区二区图片| 国内精品嫩模私拍在线| 麻豆91在线观看| 日本不卡一区二区| 天天操天天综合网| 天天色天天操综合| 蜜桃视频在线一区| 久久99这里只有精品| 老司机精品视频一区二区三区| 石原莉奈一区二区三区在线观看| 亚洲va国产va欧美va观看| 亚洲bt欧美bt精品777| 亚洲综合丝袜美腿| 亚洲小说春色综合另类电影| 亚洲一区二区三区中文字幕在线| 玉足女爽爽91| 午夜精品福利一区二区三区av| 婷婷久久综合九色综合伊人色| 丝袜美腿亚洲色图| 精品综合久久久久久8888| 国产一区二区三区免费| 国产成人啪免费观看软件| 日韩一区二区在线看片| 日韩限制级电影在线观看| 精品国产免费一区二区三区香蕉| 久久精品人人做| 欧美日韩国产精品成人| 日韩三级伦理片妻子的秘密按摩| 欧美一级欧美三级在线观看| 精品久久国产字幕高潮| 中文文精品字幕一区二区| 亚洲乱码国产乱码精品精的特点 | 综合久久久久久| 一个色在线综合| 日本网站在线观看一区二区三区| 久久不见久久见免费视频1| 高潮精品一区videoshd| 欧美日韩中文字幕一区二区| 精品播放一区二区| 亚洲人成网站精品片在线观看| 亚洲成人黄色影院| 国产综合色视频| 在线免费一区三区| 精品日韩一区二区三区| 亚洲欧美日韩精品久久久久| 日av在线不卡| 成人黄色av网站在线| 欧美日韩高清一区二区不卡| 久久久久国产精品免费免费搜索| 亚洲美女在线一区| 韩国一区二区在线观看| 欧美视频在线观看一区二区| 精品国产1区二区| 亚洲午夜av在线| 国产成人精品亚洲777人妖| 欧美视频一区二区三区四区 | 亚洲一区在线看| 国产激情91久久精品导航| 欧美亚洲国产一区在线观看网站| 精品国产免费久久| 亚洲国产另类av| 不卡一区二区在线| 欧美一区二区三区日韩| 亚洲精品视频免费观看| 成人性生交大片免费看在线播放 | 91麻豆精品91久久久久同性| 中文一区二区完整视频在线观看| 日韩专区在线视频| 在线中文字幕一区二区| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲午夜精品网| 色老汉av一区二区三区| 国产精品色一区二区三区| 国产在线国偷精品免费看| 欧美男男青年gay1069videost| 亚洲欧美日韩综合aⅴ视频| 国产成人自拍高清视频在线免费播放| 欧美视频在线一区二区三区| 最新国产の精品合集bt伙计| 国产成人在线观看| 久久久亚洲午夜电影| 国精产品一区一区三区mba桃花 | 91精品久久久久久久久99蜜臂| 成人免费在线播放视频| 亚洲美女偷拍久久| 99精品视频在线播放观看| 日本电影欧美片| 欧美极品另类videosde| 欧美日韩一区二区在线观看| 日韩视频在线永久播放| 亚洲成人av一区二区三区| 在线视频一区二区三| 亚洲欧洲三级电影| 不卡av在线网| 1区2区3区精品视频| 99精品欧美一区| 亚洲人成网站精品片在线观看| 93久久精品日日躁夜夜躁欧美| 亚洲三级理论片|