// h/w clock reader - initialise data pointers for ISR and start timers // timer2 creates clock output for external reader // timer4 reads data bit values // period_us == clock for reader // ticks == clock periods per bit // bits == number of bits to read // oneshot must be set if we are reading data in response to RWD, so no repeating stream BOOL read_ASK_HW_clock(unsigned int period, unsigned int ticks, BYTE *data, unsigned int bits, unsigned int timeout_us, BOOL oneshot) { unsigned long dwell, time; BYTE count; Manchester_Error= FALSE; // if we're manchester or bi-phase encoding, we want to clock twice as fast so we can read both halves of the bit if(RFIDlerConfig.Manchester || RFIDlerConfig.BiPhase) { ticks /= 2; HW_Bits= (unsigned long) bits * 2; } else HW_Bits= (unsigned long) bits; // point globals at data for ISR EMU_Data= data; memset(EMU_Data, '\0', bits); // stop USB interfering USBMaskInterrupts(); // start clock if not already running if(!mGetLED_Clock() == mLED_ON) { InitHWReaderClock(OC_TOGGLE_PULSE, period / 2L, period, RWD_STATE_ACTIVE); // give reader time to wake up and settle Delay_us((RFIDlerConfig.FrameClock * RFIDlerConfig.RWD_Wake_Period) / 100); } // align ourselves to reader's bit period by waiting until the end of a pulse GetTimer_us(RESET); count= READER_DATA; while(count == READER_DATA) if(GetTimer_us(NO_RESET) > timeout_us) return FALSE; // convert to ticks period= CONVERT_TO_TICKS(period); // biphase cannot auto-align when it detects a half-bit error, so we must align // on a full bit before we start if(RFIDlerConfig.BiPhase && !oneshot) { dwell= period * ticks * 2; count= 0; while((time= get_reader_gap(timeout_us))) { if(!time || count == 255) return; else if(approx(time, dwell, 10)) break; ++count; } } // wait for half the bit period so we sample mid-tick, not just as bit is toggling dwell= ((period * ticks) / 2L); GetTimer_ticks(RESET); //DEBUG_PIN_2= HIGH; while(GetTimer_ticks(NO_RESET) < dwell) ; // reset timer for external timeouts GetTimer_us(RESET); //DEBUG_PIN_2= LOW; // re-start reader ISR to read this bit if required InitHWReaderISR(period * ticks - 1L, TRUE); return TRUE; }
/*延时nms函数*/ void Delay_ms(uint16_t xms) { while(xms--) { Delay_us(1000); } }
static bool DHT_read(void) { uint8_t laststate = 1; uint8_t counter = 0; uint8_t j = 0, i; SysTick_t currenttime; // Check if sensor was read less than two seconds ago and return early // to use last reading. currenttime = GetSystemTick(); if (currenttime < _lastreadtime) { // ie there was a rollover _lastreadtime = 0; } if (!firstreading && ((currenttime - _lastreadtime) < 2000)) { return true; // return last correct measurement //delay(2000 - (currenttime - _lastreadtime)); } firstreading = false; /* Serial.print("Currtime: "); Serial.print(currenttime); Serial.print(" Lasttime: "); Serial.print(_lastreadtime); */ _lastreadtime = GetSystemTick(); data[0] = data[1] = data[2] = data[3] = data[4] = 0; // pull the pin high and wait 250 milliseconds // DHT_pinMode(GPIO_Mode_IPU); // Delay_ms(250); // now pull it low for ~20 milliseconds DHT_pinMode(GPIO_Mode_Out_PP); GPIO_ResetBits(DHT11_PORT, DHT11_PIN); Delay_ms(20); __disable_irq(); // GPIO_SetBits(DHT11_PORT, DHT11_PIN); // Delay_us(40); DHT_pinMode(GPIO_Mode_IPU); // uint8_t max_counter = 0, min_counter = 200; // read in timings for ( i = 0; i < MAXTIMINGS; i++) { counter = 0; while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == laststate) { counter++; Delay_us(3); if (counter == 255) { break; } } laststate = GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN); if (counter == 255) break; // ignore first 3 transitions if ((i >= 4) && ((i & 1) == 0)) { // shove each bit into the storage bytes data[j / 8] <<= 1; if (counter > 8) data[j / 8] |= 1; j++; // if(counter > max_counter) // max_counter = counter; // if(counter < min_counter) // min_counter = counter; } } __enable_irq(); // DBG_MSG("Counter: %d %d", min_counter, max_counter); /* Serial.println(j, DEC); Serial.print(data[0], HEX); Serial.print(", "); Serial.print(data[1], HEX); Serial.print(", "); Serial.print(data[2], HEX); Serial.print(", "); Serial.print(data[3], HEX); Serial.print(", "); Serial.print(data[4], HEX); Serial.print(" =? "); Serial.println(data[0] + data[1] + data[2] + data[3], HEX); */ // check we read 40 bits and that the checksum matches if ((j >= 40) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { return true; } return false; }
// Reader clock ISR // also process RWD commands while we toggle clock line void __ISR(_OUTPUT_COMPARE_5_VECTOR, ipl6auto) reader_clock_tick (void) { static unsigned int count= 0; static unsigned int bcount= 0; // Clear interrupt flag mOC5ClearIntFlag(); mLED_Clock_On(); // process RWD commands (if any) switch (RWD_State) { case RWD_STATE_INACTIVE: case RWD_STATE_ACTIVE: //DEBUG_PIN_4= !DEBUG_PIN_4; break; case RWD_STATE_GO_TO_SLEEP: //DEBUG_PIN_4= !DEBUG_PIN_4; //DEBUG_PIN_4= !DEBUG_PIN_4; // initial shutdown of coil to restart tag READER_CLOCK_ENABLE_OFF(); COIL_OUT_LOW(); // time small amounts with ticks, large with uS if(RWD_Sleep_Period > MAX_TIMER5_TICKS) Delay_us(CONVERT_TICKS_TO_US(RWD_Sleep_Period)); else { WriteTimer5(0); while(GetTimer_ticks(NO_RESET) < RWD_Sleep_Period) ; } count= 0; RWD_State= RWD_STATE_WAKING; // restart clock only if we have a wake period if(RWD_Wake_Period) READER_CLOCK_ENABLE_ON(); break; case RWD_STATE_WAKING: //DEBUG_PIN_4= !DEBUG_PIN_4; // leave coil running for wakeup period if(count == RWD_Wake_Period) { count= 0; bcount = 0; if(*RWD_Command_ThisBit != '*') RWD_State= RWD_STATE_START_SEND; else RWD_State= RWD_STATE_ACTIVE; } else count++; break; case RWD_STATE_START_SEND: //DEBUG_PIN_4= !DEBUG_PIN_4; // send initial gap // stop modulation of coil and wait READER_CLOCK_ENABLE_OFF(); COIL_OUT_LOW(); count= 0; if(RWD_Barrier) RWD_State= RWD_STATE_SENDING_BARRIER_LOW; else RWD_State= RWD_STATE_SENDING_BIT_LOW; //DEBUG_PIN_4= !DEBUG_PIN_4; // restart clock //READER_CLOCK_ENABLE_ON(); break; case RWD_STATE_SENDING_BIT_HIGH: //DEBUG_PIN_4= !DEBUG_PIN_4; // clock running for bit period, then wait for gap period if((*RWD_Command_ThisBit && count == RWD_One_Period) || (!*RWD_Command_ThisBit && count == RWD_Zero_Period)) { count= 0; if(*RWD_Command_ThisBit == '*') RWD_State= RWD_STATE_POST_WAIT; else if(RWD_Barrier && bcount == 7) RWD_State= RWD_STATE_SENDING_BARRIER_LOW; else RWD_State= RWD_STATE_SENDING_BIT_LOW; READER_CLOCK_ENABLE_OFF(); COIL_OUT_LOW(); bcount++; if(bcount == 8) bcount = 0; } else count++; break; case RWD_STATE_SENDING_BIT_LOW: if((*RWD_Command_ThisBit && count == RWD_One_Gap_Period) || (!*RWD_Command_ThisBit && count == RWD_Zero_Gap_Period)) { ++RWD_Command_ThisBit; count= 0; RWD_State= RWD_STATE_SENDING_BIT_HIGH; // restart clock READER_CLOCK_ENABLE_ON(); } else count++; break; case RWD_STATE_SENDING_BARRIER_HIGH: if(count == RWD_One_Barrier_Period){ count= 0; RWD_State= RWD_STATE_SENDING_BIT_LOW; READER_CLOCK_ENABLE_OFF(); COIL_OUT_LOW(); }else count++; break; case RWD_STATE_SENDING_BARRIER_LOW: if(count == RWD_Zero_Barrier_Period){ count= 0; RWD_State= RWD_STATE_SENDING_BARRIER_HIGH; READER_CLOCK_ENABLE_ON(); }else count++; break; case RWD_STATE_POST_WAIT: //DEBUG_PIN_4= !DEBUG_PIN_4; // coil running for forced post-command wait period if(count == RWD_Post_Wait) { count= 0; RWD_State= RWD_STATE_ACTIVE; } else count++; break; default: break; } }
void Delay_ms(int i){ while(i--) Delay_us(1000); }
void main() { P0 = OFF; // Turn Off diodes on PORT0 P1 = OFF; // Turn Off diodes on PORT1 P2 = OFF; // Turn Off diodes on PORT2 P3 = OFF; // Turn Off diodes on PORT3 Delay_ms(ONE_SEC); while(1) { display_W(); P2 = OFF; Delay_us(1000); display_E(); P2 = OFF; Delay_us(1000); display_L(); P2 = OFF; Delay_us(1000); display_C(); P2 = OFF; Delay_us(1000); display_O(); P2 = OFF; Delay_us(1000); display_M(); P2 = OFF; Delay_us(1000); display_E(); P2 = OFF; Delay_us(1000); display_T(); P2 = OFF; Delay_us(1000); display_O(); P2 = OFF; Delay_us(1000); display_T(); P2 = OFF; Delay_us(1000); display_E(); P2 = OFF; Delay_us(1000); display_C(); P2 = OFF; Delay_us(1000); display_H(); P2 = OFF; Delay_us(1000); display_N(); P2 = OFF; Delay_us(1000); display_O(); P2 = OFF; Delay_us(1000); display_B(); P2 = OFF; Delay_us(1000); display_L(); P2 = OFF; Delay_us(1000); display_A(); P2 = OFF; Delay_us(1000); display_S(); P2 = OFF; Delay_us(1000); display_T(); P2 = OFF; Delay_us(1000); /*display_-(); P2 = OFF; Delay_us(1000); display_2(); P2 = OFF; Delay_us(1000); display_0(); P2 = OFF; Delay_us(1(); P2 = OFF; Delay_us(1000); display_3(); P2 = OFF; Delay_us(1000);*/ } }
display_E() { //--------------col-1-------------- P2 = ON; // Turn ON diodes on PORT2 Delay_us(U_SEC); P2 = OFF; // Turn Off diodes on PORT2 //--------------col-2-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-3-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-4-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-5-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-6-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-7-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-8-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-9-------------- P2_0_bit = ON; P2_3_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-10-------------- P2_3_bit = OFF; P2_0_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-11-------------- P2_0_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-12-------------- P2_0_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-13-------------- P2_0_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-14-------------- P2_0_bit = ON; P2_1_bit = ON; P2_6_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); P2_0_bit = OFF; P2_1_bit = OFF; P2_6_bit = OFF; P2_7_bit = OFF; //--------------------------------- }
static uint8_t lcd_read(uint8_t rs) { uint8_t data; #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1) if (rs) lcd_waitbusy(); if (PrevCmdInvolvedAddressCounter) { Delay_us(5); PrevCmdInvolvedAddressCounter=0; } #endif if (rs) { lcd_rs_port_high(); // RS=1: Read Data #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1) PrevCmdInvolvedAddressCounter=1; #endif } else lcd_rs_port_low(); // RS=0: Read Busy Flag lcd_rw_port_high(); // RW=1: Read Mode #if LCD_BITS==4 lcd_db7_ddr_low(); // Configure Data Pins as Input lcd_db6_ddr_low(); lcd_db5_ddr_low(); lcd_db4_ddr_low(); lcd_e_port_high(); // Read High Nibble First Delay_ns(500); data=lcd_db4_pin_get() << 4 | lcd_db5_pin_get() << 5 | lcd_db6_pin_get() << 6 | lcd_db7_pin_get() << 7; lcd_e_port_low(); Delay_ns(500); lcd_e_port_high(); // Read Low Nibble Delay_ns(500); data|=lcd_db4_pin_get() << 0 | lcd_db5_pin_get() << 1 | lcd_db6_pin_get() << 2 | lcd_db7_pin_get() << 3; lcd_e_port_low(); lcd_db7_ddr_high(); // Configure Data Pins as Output lcd_db6_ddr_high(); lcd_db5_ddr_high(); lcd_db4_ddr_high(); lcd_db7_port_high(); // Pins High (Inactive) lcd_db6_port_high(); lcd_db5_port_high(); lcd_db4_port_high(); #else //using 8-Bit-Mode lcd_db7_ddr_low(); // Configure Data Pins as Input lcd_db6_ddr_low(); lcd_db5_ddr_low(); lcd_db4_ddr_low(); lcd_db3_ddr_low(); lcd_db2_ddr_low(); lcd_db1_ddr_low(); lcd_db0_ddr_low(); lcd_e_port_high(); Delay_ns(500); data=lcd_db7_pin_get() << 7 | lcd_db6_pin_get() << 6 | lcd_db5_pin_get() << 5 | lcd_db4_pin_get() << 4 | lcd_db3_pin_get() << 3 | lcd_db2_pin_get() << 2 | lcd_db1_pin_get() << 1 | lcd_db0_pin_get(); lcd_e_port_low(); lcd_db7_ddr_high(); // Configure Data Pins as Output lcd_db6_ddr_high(); lcd_db5_ddr_high(); lcd_db4_ddr_high(); lcd_db3_ddr_high(); lcd_db2_ddr_high(); lcd_db1_ddr_high(); lcd_db0_ddr_high(); lcd_db7_port_high(); // Pins High (Inactive) lcd_db6_port_high(); lcd_db5_port_high(); lcd_db4_port_high(); lcd_db3_port_high(); lcd_db2_port_high(); lcd_db1_port_high(); lcd_db0_port_high(); #endif lcd_rw_port_low(); #if (WAIT_MODE==0 || RW_LINE_IMPLEMENTED==0) if (rs) Delay_us(40); else Delay_us(1); #endif return data; }
/************************************************************************* Low-level function to write byte to LCD controller Input: data byte to write to LCD rs 1: write data 0: write instruction Returns: none *************************************************************************/ static void lcd_write(uint8_t data,uint8_t rs) { #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1) lcd_waitbusy(); if (PrevCmdInvolvedAddressCounter) { Delay_us(5); PrevCmdInvolvedAddressCounter=0; } #endif if (rs) { lcd_rs_port_high(); // RS=1: Write Character #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1) PrevCmdInvolvedAddressCounter=1; #endif } else { lcd_rs_port_low(); // RS=0: Write Command #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1) PrevCmdInvolvedAddressCounter=0; #endif } #if LCD_BITS==4 lcd_db7_port_set(data&_BV(7)); //Output High Nibble lcd_db6_port_set(data&_BV(6)); lcd_db5_port_set(data&_BV(5)); lcd_db4_port_set(data&_BV(4)); Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); lcd_db7_port_set(data&_BV(3)); //Output High Nibble lcd_db6_port_set(data&_BV(2)); lcd_db5_port_set(data&_BV(1)); lcd_db4_port_set(data&_BV(0)); Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); lcd_db7_port_high(); // All Data Pins High (Inactive) lcd_db6_port_high(); lcd_db5_port_high(); lcd_db4_port_high(); #else //using 8-Bit_Mode lcd_db7_port_set(data&_BV(7)); //Output High Nibble lcd_db6_port_set(data&_BV(6)); lcd_db5_port_set(data&_BV(5)); lcd_db4_port_set(data&_BV(4)); lcd_db3_port_set(data&_BV(3)); //Output High Nibble lcd_db2_port_set(data&_BV(2)); lcd_db1_port_set(data&_BV(1)); lcd_db0_port_set(data&_BV(0)); Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); lcd_db7_port_high(); // All Data Pins High (Inactive) lcd_db6_port_high(); lcd_db5_port_high(); lcd_db4_port_high(); lcd_db3_port_high(); lcd_db2_port_high(); lcd_db1_port_high(); lcd_db0_port_high(); #endif #if (WAIT_MODE==0 || RW_LINE_IMPLEMENTED==0) if (!rs && data<=((1<<LCD_CLR) | (1<<LCD_HOME))) // Is command clrscr or home? Delay_us(1640); else Delay_us(40); #endif }
void main() { int i; DDRA = 0xFF; DDRC = 0xFF; DDRD = 0xFF; Delay_us(2000); sendCommand(0x38) ; sendCommand(0x0C); sendCommand(0x01); Delay_us(2000) ; while(1) { ss(1); name(); ONS; ss(11); HFS; ss(2); HFS; sendCommand(0x01); HFS; ss(11); dept(); HFS; ss(10); ONS; ss(11); HFS; ss(2); sendCommand(0x01); HFS; name(); HFS; ss(11); HFS; ss(0); ONS; sendCommand(0x01); ss(11); HFS; ss(9); dept(); ONS; ss(11); HFS; ss(7); HFS; sendCommand(0x01); HFS; ss(11); name(); HFS; ss(8); ONS; ss(11); HFS; ss(10); sendCommand(0x01); HFS; dept(); HFS; ss(11); HFS; ss(1); ONS; sendCommand(0x01); ss(11); HFS; } }
void Init_SSD2805_SPI(void) { SPI_Init(); Delay_ms(10); Set_RST(0);// ( rGPFDAT &= (~(1<<3))) ; Delay_ms(50); Set_RST(1);// ( rGPFDAT |= (1<<3) ) ; Delay_ms(10); //void SPI_2825_WrCmd(U8) //void SPI_2825_WrReg(U8 c,U16 value) //Initial code 1: SSD2825 initialization //RGB interface configuration SPI_2825_WrReg(0xb1,(LCD_HSPW<<8)|LCD_VSPW); //Vertical sync and horizontal sync active period SPI_2825_WrReg(0xb2,(LCD_HBPD<<8)|LCD_VBPD); //Vertical and horizontal back porch period SPI_2825_WrReg(0xb3,(LCD_HFPD<<8)|LCD_VFPD); //Vertical and horizontal front porch period SPI_2825_WrReg(0xb4, LCD_XSIZE_TFT); //Horizontal active period SPI_2825_WrReg(0xb5, LCD_YSIZE_TFT); //Vertical active period //SPI_2825_WrReg(0xb6, 0x2007); //Video mode and video pixel format 888 SPI_2825_WrReg(0xb6, 0x2004); //Video mode and video pixel format 565 //MIPI lane configuration //00 - 1 lane mode //01 - 2 lane mode //10 - 3 lane mode //11 - 4 lane mode SPI_2825_WrReg(0xde, 0x0001); //MIPI lane select //SPI_2825_WrReg(0xDD, (LCD_HFPD<<8)|LCD_VFPD); //SPI_2825_WrReg(0xd6, 0x0004); //Color order and endianess BGR SPI_2825_WrReg(0xd6, 0x0005); //Color order and endianess RGB SPI_2825_WrReg(0xb9, 0x0000); //Disable PLL SPI_2825_WrReg(0xc4, 0x0001); //BTA setting //CABC brightness setting SPI_2825_WrReg(0xe9, 0xff2f); //CABC control SPI_2825_WrReg(0xeb, 0x0100); //CABC control //Communicate with LCD driver through MIPI SPI_2825_WrReg(0xb7, 0x0342); //DCS mode 0342 SPI_2825_WrReg(0xb8, 0x0000); //VC registe SPI_2825_WrReg(0xbc, 0x0000); //Packet size SPI_2825_WrCmd(0x11); //LCD driver exit sleep mode Delay_ms(100); SPI_2825_WrCmd(0x29); //Set LCD driver display on // PLL configuration //SPI_2825_WrReg(0xba, 0x8334); //PLL setting,8028 0x34--52*24/3=416M SPI_2825_WrReg(0xba, 0x8322); //PLL setting,8028 0x27--39*24/3=312M SPI_2825_WrReg(0xbb, 0x0006); //LP clock divider SPI_2825_WrReg(0xb9, 0x0001); //PLL enable SPI_2825_WrReg(0xb8, 0x0000); //VC register // SPI_2825_WrReg(0xb7, 0x030B); //Generic mode, HS video mode Delay_ms(55); //Initial code 2: LCD driver initialization //MIPI lane and PLL configuration SPI_2825_WrReg(0xb9, 0x0001); //PLL enable SPI_2825_WrReg(0xb7, 0x0150); //Generic mode, LP mode SPI_2825_WrReg(0xb8, 0x0000); //VC register //Send command and data through MIPI //------------------------------------------------------------------------------------------ //----------communicate with lcd driver through mipi---------------------------------------- GP_COMMAD_PA(4); SPI_WriteData(0xBF); SPI_WriteData(0x91); SPI_WriteData(0x61); SPI_WriteData(0xF2); GP_COMMAD_PA(3); SPI_WriteData(0xB3); SPI_WriteData(0x00); SPI_WriteData(0x77); GP_COMMAD_PA(3); SPI_WriteData(0xB4); SPI_WriteData(0x00); SPI_WriteData(0x77); GP_COMMAD_PA(7); SPI_WriteData(0xB8); SPI_WriteData(0x00); SPI_WriteData(0xA0); SPI_WriteData(0x01); SPI_WriteData(0x00); SPI_WriteData(0xA0); SPI_WriteData(0x01); GP_COMMAD_PA(4); SPI_WriteData(0xBA); SPI_WriteData(0x3E); SPI_WriteData(0x23); SPI_WriteData(0x00); GP_COMMAD_PA(2); SPI_WriteData(0xC3); SPI_WriteData(0x04); GP_COMMAD_PA(3); SPI_WriteData(0xC4); SPI_WriteData(0x30); SPI_WriteData(0x6A); GP_COMMAD_PA(39); SPI_WriteData(0xC8); SPI_WriteData(0x7E); SPI_WriteData(0x68); SPI_WriteData(0x57); SPI_WriteData(0x49); SPI_WriteData(0x43); SPI_WriteData(0x33); SPI_WriteData(0x35); SPI_WriteData(0x1C); SPI_WriteData(0x33); SPI_WriteData(0x2F); SPI_WriteData(0x2B); SPI_WriteData(0x43); SPI_WriteData(0x2C); SPI_WriteData(0x31); SPI_WriteData(0x20); SPI_WriteData(0x22); SPI_WriteData(0x1E); SPI_WriteData(0x1D); SPI_WriteData(0x03); SPI_WriteData(0x7E); SPI_WriteData(0x68); SPI_WriteData(0x57); SPI_WriteData(0x49); SPI_WriteData(0x43); SPI_WriteData(0x33); SPI_WriteData(0x35); SPI_WriteData(0x1C); SPI_WriteData(0x33); SPI_WriteData(0x2F); SPI_WriteData(0x2B); SPI_WriteData(0x43); SPI_WriteData(0x2C); SPI_WriteData(0x31); SPI_WriteData(0x20); SPI_WriteData(0x22); SPI_WriteData(0x1E); SPI_WriteData(0x1D); SPI_WriteData(0x03); GP_COMMAD_PA(10); SPI_WriteData(0xC7); SPI_WriteData(0x00); SPI_WriteData(0x01); SPI_WriteData(0x31); SPI_WriteData(0x05); SPI_WriteData(0x65); SPI_WriteData(0x2B); SPI_WriteData(0x12); SPI_WriteData(0xA5); SPI_WriteData(0xA5); GP_COMMAD_PA(17); SPI_WriteData(0xD4); SPI_WriteData(0x1E); SPI_WriteData(0x1F); SPI_WriteData(0x17); SPI_WriteData(0x37); SPI_WriteData(0x06); SPI_WriteData(0x04); SPI_WriteData(0x0A); SPI_WriteData(0x08); SPI_WriteData(0x00); SPI_WriteData(0x02); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); GP_COMMAD_PA(17); SPI_WriteData(0xD5); SPI_WriteData(0x1E); SPI_WriteData(0x1F); SPI_WriteData(0x17); SPI_WriteData(0x37); SPI_WriteData(0x07); SPI_WriteData(0x05); SPI_WriteData(0x0B); SPI_WriteData(0x09); SPI_WriteData(0x01); SPI_WriteData(0x03); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); GP_COMMAD_PA(17); SPI_WriteData(0xD6); SPI_WriteData(0x1F); SPI_WriteData(0x13); SPI_WriteData(0x17); SPI_WriteData(0x17); SPI_WriteData(0x07); SPI_WriteData(0x09); SPI_WriteData(0x0B); SPI_WriteData(0x05); SPI_WriteData(0x03); SPI_WriteData(0x01); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); GP_COMMAD_PA(17); SPI_WriteData(0xD7); SPI_WriteData(0x1F); SPI_WriteData(0x1E); SPI_WriteData(0x17); SPI_WriteData(0x17); SPI_WriteData(0x06); SPI_WriteData(0x08); SPI_WriteData(0x0A); SPI_WriteData(0x04); SPI_WriteData(0x02); SPI_WriteData(0x00); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); SPI_WriteData(0x1F); GP_COMMAD_PA(21); SPI_WriteData(0xD8); SPI_WriteData(0x20); SPI_WriteData(0x00); SPI_WriteData(0x00); SPI_WriteData(0x30); SPI_WriteData(0x03); SPI_WriteData(0x30); SPI_WriteData(0x01); SPI_WriteData(0x02); SPI_WriteData(0x00); SPI_WriteData(0x01); SPI_WriteData(0x02); SPI_WriteData(0x06); SPI_WriteData(0x70); SPI_WriteData(0x00); SPI_WriteData(0x00); SPI_WriteData(0x73); SPI_WriteData(0x07); SPI_WriteData(0x06); SPI_WriteData(0x70); SPI_WriteData(0x08); GP_COMMAD_PA(21); SPI_WriteData(0xD9); SPI_WriteData(0x00); SPI_WriteData(0x0A); SPI_WriteData(0x0A); SPI_WriteData(0x80); SPI_WriteData(0x00); SPI_WriteData(0x00); SPI_WriteData(0x06); SPI_WriteData(0x7B); SPI_WriteData(0x00); SPI_WriteData(0x80); SPI_WriteData(0x00); SPI_WriteData(0x33); SPI_WriteData(0x6A); SPI_WriteData(0x1F); SPI_WriteData(0x00); SPI_WriteData(0x00); SPI_WriteData(0x00); SPI_WriteData(0x03); SPI_WriteData(0x7B); GP_COMMAD_PA(2); SPI_WriteData(0x35); SPI_WriteData(0x00); GP_COMMAD_PA(2); SPI_WriteData(0x11); SPI_WriteData(0x00); Delay_us(5); GP_COMMAD_PA(2); SPI_WriteData(0x29); SPI_WriteData(0x00); Delay_us(1); //------------------------------------------------------------------------------------------ //Cmd code 3: Access video mode //RGB interface configuration SPI_2825_WrReg(0xb1,(LCD_HSPW<<8)|LCD_VSPW); //Vertical sync and horizontal sync active period SPI_2825_WrReg(0xb2,(LCD_HBPD<<8)|LCD_VBPD); //Vertical and horizontal back porch period SPI_2825_WrReg(0xb3,(LCD_HFPD<<8)|LCD_VFPD); //Vertical and horizontal front porch period SPI_2825_WrReg(0xb4, LCD_XSIZE_TFT); //Horizontal active period SPI_2825_WrReg(0xb5, LCD_YSIZE_TFT); //Vertical active period //SPI_2825_WrReg(0xb6, 0x0007); //2007 //Video mode and video pixel format 888 SPI_2825_WrReg(0xb6, 0x2004); //2007 //Video mode and video pixel format 565 //MIPI lane configuration //00 - 1 lane mode //01 - 2 lane mode //10 - 3 lane mode //11 - 4 lane mode SPI_2825_WrReg(0xde, 0x0001); //MIPI lane select, 2chl SPI_2825_WrReg(0xd6, 0x0005); //Color order and endianess SPI_2825_WrReg(0xb9, 0x0000); //Disable PLL SPI_2825_WrReg(0xc4, 0x0001); //BTA setting //CABC brightness setting SPI_2825_WrReg(0xe9, 0xff2f); //CABC control SPI_2825_WrReg(0xeb, 0x0100); //CABC control Delay_ms(22); //PLL configuration //FR: bit15~14 //00 每 62.5 < OUT f < 125 //01 每 126 < OUT f < 250 //10 每 251 < OUT f < 500 //11 每 501 < OUT f < 1000 //MS: bit12~8 //Fpre = fin/MS //NS: bit7~0 //Fout = Fpre*NS SPI_2825_WrReg(0xba, 0x8324); //PLL setting,8028 SPI_2825_WrReg(0xbb, 0x0006); //LP clock divider,煦けf/ㄗ1+1ㄘ,750MHZ/2 = SPI_2825_WrReg(0xb9, 0x0001); //PLL enable SPI_2825_WrReg(0xb8, 0x0000); //VC register SPI_2825_WrReg(0xb7, 0x030B | 0x0020 ); //Generic mode, HS video mode }
/** ********************************************************************************* * @Function: UART5_ReceiveData; * * @Description: 从UART5接口接收1个字节数据 * * @Input: none; * * @Output: none; * * @Return: char 接收到的数据; * * @Note: none; *********************************************************************************** */ char UART5_ReceiveData( void ) { Delay_us(20); return USART_ReceiveData(UART5) ; }
BOOL hitag2_write_page(BYTE block, BYTE *data) { BYTE command[11], tmp[37], tmp1[37], tmp2[37], tmphex[9]; if(block > HITAG2_DATABLOCKS - 1) return FALSE; // create 10 bit command block: HITAG2_WRIE_PAGE + 3 bits address + invert(HITAG2_WRITE_PAGE + 3 bits address) memcpy(command, HITAG2_WRITE_PAGE, 2); inttobinstring(command + 2, (unsigned int) block, 3); invertbinstring(command + 5, command); command[10]= '\0'; // encrypt command if in crypto mode if(CryptoActive) hitag2_binstring_crypt(tmp, command); else memcpy(tmp, command, 11); // convert data to binstring for send if(hextobinstring(tmp1, data) != 32) return FALSE; // send command with RX->TX delay and no reset if(!rwd_send(tmp, strlen(tmp), NO_RESET, BLOCK, RWD_STATE_WAKING, RFIDlerConfig.FrameClock, 0, RFIDlerConfig.RWD_Wait_Switch_RX_TX, RFIDlerConfig.RWD_Zero_Period, RFIDlerConfig.RWD_One_Period, RFIDlerConfig.RWD_Gap_Period, RFIDlerConfig.RWD_Wait_Switch_TX_RX)) return FALSE; // skip 1/2 bit to synchronise manchester HW_Skip_Bits= 1; // get ACK - 10 bytes + sync if(read_ask_data(RFIDlerConfig.FrameClock, RFIDlerConfig.DataRate, tmp2, 15, RFIDlerConfig.Sync, RFIDlerConfig.SyncBits, RFIDlerConfig.Timeout, ONESHOT_READ, BINARY) == 15) { // check sync bits if (memcmp(tmp2, Hitag2Sync, 5) != 0) return FALSE; // decrypt if(CryptoActive) hitag2_binarray_crypt(tmp2 + 5, tmp2 + 5, 10); // check ACK - should be our original command echo'd back binarraytobinstring(tmp2 + 5, tmp2 + 5, 10); if(memcmp(command, tmp2 + 5, 10) != 0) return FALSE; } // encrypt data if in crypto mode if(CryptoActive) hitag2_binstring_crypt(tmp1, tmp1); // send data with RX->TX delay and no reset if(!rwd_send(tmp1, strlen(tmp1), NO_RESET, BLOCK, RWD_STATE_WAKING, RFIDlerConfig.FrameClock, 0, RFIDlerConfig.RWD_Wait_Switch_RX_TX, RFIDlerConfig.RWD_Zero_Period, RFIDlerConfig.RWD_One_Period, RFIDlerConfig.RWD_Gap_Period, RFIDlerConfig.RWD_Wait_Switch_TX_RX)) return FALSE; // no ack, so read back and verify // delay for long enough to allow write plus RX->TX period Delay_us((HITAG2_WRITE_DELAY * RFIDlerConfig.FrameClock + RFIDlerConfig.RWD_Wait_Switch_RX_TX * RFIDlerConfig.FrameClock) / 100); if(!hitag2_read_page(tmp, block)) return FALSE; if(memcmp(tmp, data, 8) != 0) return FALSE; return TRUE; }
BOOL tag_set(BYTE tag) { // reset everything, then set what needs to be changed // most timings are in FCs unless otherwise specified // FrameClock itself is in us/100 (i.e. 800 is 8us == 125KHz) // Timeout is in us RFIDlerConfig.FrameClock= 0; RFIDlerConfig.BiPhase= FALSE; RFIDlerConfig.Manchester= FALSE; RFIDlerConfig.Invert= FALSE; RFIDlerConfig.Modulation= MOD_MODE_NONE; RFIDlerConfig.PotLow= 0; RFIDlerConfig.PotHigh= 0; RFIDlerConfig.DataRate= 0; RFIDlerConfig.DataRateSub0= 0; RFIDlerConfig.DataRateSub1= 0; RFIDlerConfig.DataBits= 0; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 0; RFIDlerConfig.Timeout= 0L; RFIDlerConfig.Sync[0]= 0x00; RFIDlerConfig.Sync[1]= 0x00; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 0; RFIDlerConfig.RWD_Gap_Period= 0; RFIDlerConfig.RWD_Sleep_Period= 0; RFIDlerConfig.RWD_Wake_Period= 0; RFIDlerConfig.RWD_Zero_Period= 0; RFIDlerConfig.RWD_One_Period= 0; RFIDlerConfig.RWD_Wait_Switch_RX_TX= 0; RFIDlerConfig.RWD_Wait_Switch_TX_RX= 0; switch(tag) { case TAG_TYPE_NONE: break; case TAG_TYPE_ASK_RAW: RFIDlerConfig.FrameClock= 800; // 125 KHz RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= 100; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataBits= RAW_TAGS_DATABITS; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_AWID_26: //RFIDlerConfig.FrameClock= 765; // 130.7 KHz (134KHz breaks emulation) RFIDlerConfig.FrameClock= 800; // 125 KHz RFIDlerConfig.Modulation= MOD_MODE_FSK2; RFIDlerConfig.PotHigh= 110; RFIDlerConfig.DataRate= 50; RFIDlerConfig.DataRateSub0= 8; RFIDlerConfig.DataRateSub1= 10; RFIDlerConfig.DataBits= 96; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.Sync[0]= 0x01; RFIDlerConfig.Sync[1]= 0x1D; RFIDlerConfig.Sync[2]= 0x80; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 18; RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_EM4X02: case TAG_TYPE_UNIQUE: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Manchester= TRUE; RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= 150; RFIDlerConfig.DataRate= 64; RFIDlerConfig.DataBits= 64; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.Sync[0]= 0xFF; RFIDlerConfig.Sync[1]= 0xFF; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 9; RFIDlerConfig.RWD_Wake_Period= 1000; break; // DEBUG: work in progress! case TAG_TYPE_EM4X05: RFIDlerConfig.FrameClock= 800; // 125 KHz RFIDlerConfig.Manchester= TRUE; RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= 130; RFIDlerConfig.DataRate= 64; RFIDlerConfig.DataBits= 53; // 45 bit OTA format + 8 bit preamble RFIDlerConfig.DataBlocks= EM4X05_DATABLOCKS; RFIDlerConfig.BlockSize= EM4X05_BLOCKSIZE; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Wake_Period= 1000; // docco says max 3 ms, but round up a bit RFIDlerConfig.RWD_Gap_Period= 55; // First Field Stop RFIDlerConfig.RWD_Sleep_Period= 2000; RFIDlerConfig.RWD_Zero_Period= 16; // note that em4x05 uses it's own PWM scheme RFIDlerConfig.RWD_One_Period= 32; // see em.c for details RFIDlerConfig.RWD_Wait_Switch_TX_RX= 60; // doc says 544us, (9.34 + 1.38 ms when eeprom write), but tests are much shorter! RFIDlerConfig.RWD_Wait_Switch_RX_TX= 80; // docs say 544, so about 68 fcs break; case TAG_TYPE_FDXB: RFIDlerConfig.FrameClock= 745; // 134.2 KHz RFIDlerConfig.BiPhase= TRUE; RFIDlerConfig.Invert= TRUE; RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= 130; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataBits= 128; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.Sync[0]= 0x00; RFIDlerConfig.Sync[1]= 0x20; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 11; RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_FSK1_RAW: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Modulation= MOD_MODE_FSK1; RFIDlerConfig.PotHigh= POTHIGH_DEFAULT; RFIDlerConfig.DataRate= 50; RFIDlerConfig.DataRateSub0= 8; RFIDlerConfig.DataRateSub1= 5; RFIDlerConfig.DataBits= RAW_TAGS_DATABITS; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_FSK2_RAW: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Modulation= MOD_MODE_FSK2; RFIDlerConfig.PotHigh= 90; RFIDlerConfig.DataRate= 50; RFIDlerConfig.DataRateSub0= 8; RFIDlerConfig.DataRateSub1= 10; RFIDlerConfig.DataBits= RAW_TAGS_DATABITS; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_HID_26: //RFIDlerConfig.FrameClock= 765; // 130.7 KHz (134KHz breaks emulation) RFIDlerConfig.FrameClock= 800; // 125 KHz RFIDlerConfig.Modulation= MOD_MODE_FSK2; RFIDlerConfig.PotHigh= 110; RFIDlerConfig.DataRate= 50; RFIDlerConfig.DataRateSub0= 8; RFIDlerConfig.DataRateSub1= 10; RFIDlerConfig.DataBits= 96; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.Sync[0]= 0x1D; RFIDlerConfig.Sync[1]= 0x55; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 16; RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_HITAG1: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Manchester= TRUE; RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= 170; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataBits= 33; // RFIDlerConfig.DataBlocks= HITAG1_DATABLOCKS; RFIDlerConfig.BlockSize= HITAG1_BLOCKSIZE; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Gap_Period= 4; // 4 - 10 RFIDlerConfig.RWD_Sleep_Period= 2000; RFIDlerConfig.RWD_Wake_Period= 500; // documentations says ~3ms, so round up a bit RFIDlerConfig.RWD_Zero_Period= 18; // 18 - 22 RFIDlerConfig.RWD_One_Period= 26; // 26 - 32 RFIDlerConfig.RWD_Wait_Switch_TX_RX= 180; // docs say 204, so stop a little earlier so we catch leading edge RFIDlerConfig.RWD_Wait_Switch_RX_TX= 120; // docs say 96, so give it a bit longer t0 be safe! RFIDlerConfig.SyncBits= 0; RFIDlerConfig.Sync[0]= 0x00; RFIDlerConfig.Sync[0]= 0x00; RFIDlerConfig.Sync[0]= 0x00; RFIDlerConfig.Sync[0]= 0x00; break; case TAG_TYPE_HITAG2: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Manchester= TRUE; RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= 160; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataBits= 37; // 5 bits leadin + 32 bits ID RFIDlerConfig.DataBlocks= HITAG2_DATABLOCKS; RFIDlerConfig.BlockSize= HITAG2_BLOCKSIZE; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Gap_Period= 3; // 4 - 10 (we use 3 to allow for sloppiness in RWD timings) RFIDlerConfig.RWD_Sleep_Period= 2000; // 2000; RFIDlerConfig.RWD_Wake_Period= 525; // (was 450) must be > 312.5 but less than 544 to allow reset of user modes RFIDlerConfig.RWD_Zero_Period= 18; // 18 - 22 RFIDlerConfig.RWD_One_Period= 26; // 26 - 32 RFIDlerConfig.RWD_Wait_Switch_TX_RX= 150; // docs say 199 - 206 but in practice it can be less RFIDlerConfig.RWD_Wait_Switch_RX_TX= 90; RFIDlerConfig.Sync[0]= 0xF8; RFIDlerConfig.Sync[1]= 0x00; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 5; break; case TAG_TYPE_INDALA_64: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Modulation= MOD_MODE_PSK1; RFIDlerConfig.PotLow= POTLOW_DEFAULT; RFIDlerConfig.PotHigh= 170; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataRateSub0= 2; RFIDlerConfig.DataBits= 64; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.PSK_Quality= 4L; RFIDlerConfig.Sync[0]= 0x00; RFIDlerConfig.Sync[1]= 0x00; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 24; RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_INDALA_224: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Modulation= MOD_MODE_PSK1; RFIDlerConfig.PotLow= POTLOW_DEFAULT; RFIDlerConfig.PotHigh= 170; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataRateSub0= 2; RFIDlerConfig.DataBits= 224; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.PSK_Quality= 4L; RFIDlerConfig.Sync[0]= 0x00; RFIDlerConfig.Sync[1]= 0x00; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 24; RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_PSK1_RAW: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Modulation= MOD_MODE_PSK1; RFIDlerConfig.PotLow= POTLOW_DEFAULT; RFIDlerConfig.PotHigh= POTHIGH_DEFAULT; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataRateSub0= 2; RFIDlerConfig.DataBits= RAW_TAGS_DATABITS; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.PSK_Quality= 4L; RFIDlerConfig.RWD_Wake_Period= 1000; break; case TAG_TYPE_Q5: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Manchester= TRUE; RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= 160; RFIDlerConfig.DataRate= 64; RFIDlerConfig.DataBits= 64; RFIDlerConfig.DataBlocks= Q5_DATABLOCKS; RFIDlerConfig.BlockSize= Q5_BLOCKSIZE; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.Sync[0]= 0xFF; RFIDlerConfig.Sync[1]= 0xFF; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 9; RFIDlerConfig.RWD_Sleep_Period= 13000; RFIDlerConfig.RWD_Wake_Period= 4000; // must be more than 3ms, but play it safe RFIDlerConfig.RWD_Gap_Period= 50; // 14 nominal, 8 - 50 normal, 8 - 25 fast write mode RFIDlerConfig.RWD_Zero_Period= 16; //24; // 24 nominal, 16 - 31 normal, 8 - 15 fast write mode RFIDlerConfig.RWD_One_Period= 48; //54; // 54 nominal, 48 - 63 normal, 24 - 31 fast write mode RFIDlerConfig.RWD_Wait_Switch_TX_RX= 48; //64; // q5 will exit downlink mode after 64 but may not yet be damped! RFIDlerConfig.RWD_Wait_Switch_RX_TX= 192; // the longer the better! PWD_Mode= FALSE; break; case TAG_TYPE_T55X7: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.Modulation= MOD_MODE_ASK_OOK; RFIDlerConfig.PotHigh= POTHIGH_DEFAULT; RFIDlerConfig.Manchester= TRUE; RFIDlerConfig.DataRate= 32; RFIDlerConfig.DataBits= 64; RFIDlerConfig.Sync[0]= 0xE0; RFIDlerConfig.Sync[1]= 0x15; RFIDlerConfig.Sync[2]= 0x00; RFIDlerConfig.Sync[3]= 0x00; RFIDlerConfig.SyncBits= 16; RFIDlerConfig.DataBlocks= T55X7_DATABLOCKS; RFIDlerConfig.BlockSize= T55X7_BLOCKSIZE; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Sleep_Period= 13000; // small tags such as keyfobs need a long sleep to reset RFIDlerConfig.RWD_Wake_Period= 4000; RFIDlerConfig.RWD_Gap_Period= 23; // 14; // 14 nominal, 8 - 30 normal, 8 - 25 fast write mode RFIDlerConfig.RWD_Zero_Period= 16; // 24; // 24 nominal, 16 - 31 normal, 8 - 15 fast write mode RFIDlerConfig.RWD_One_Period= 48; // 54; // 54 nominal, 48 - 63 normal, 24 - 31 fast write mode RFIDlerConfig.RWD_Wait_Switch_TX_RX= 64; // t55x7 will exit downlink mode after 64 but we mustn't read until t55x7 switches damping on RFIDlerConfig.RWD_Wait_Switch_RX_TX= 192; break; // special case - TAMAGOTCHI do not do anything but PWM, so most settings are irrelevant case TAG_TYPE_TAMAGOTCHI: RFIDlerConfig.FrameClock= 800; RFIDlerConfig.TagType= tag; RFIDlerConfig.Repeat= 20; RFIDlerConfig.Timeout= 13000; // timeout in uS (note with prescaler of 16 max is 13107) RFIDlerConfig.RWD_Sleep_Period= 13000; // small tags such as keyfobs need a long sleep to reset RFIDlerConfig.RWD_Wake_Period= 4000; RFIDlerConfig.RWD_Gap_Period= 23; // 14; // 14 nominal, 8 - 30 normal, 8 - 25 fast write mode RFIDlerConfig.RWD_Zero_Period= 16; // 24; // 24 nominal, 16 - 31 normal, 8 - 15 fast write mode RFIDlerConfig.RWD_One_Period= 48; // 54; // 54 nominal, 48 - 63 normal, 24 - 31 fast write mode RFIDlerConfig.RWD_Wait_Switch_TX_RX= 64; // t55x7 will exit downlink mode after 64 but we mustn't read until t55x7 switches damping on RFIDlerConfig.RWD_Wait_Switch_RX_TX= 192; break; default: return FALSE; } // stop clocks stop_HW_clock(); // configure potentiometers set_mcp414_wiper(WIPER_HIGH, VOLATILE, RFIDlerConfig.PotHigh, TmpBuff); set_mcp414_wiper(WIPER_LOW, VOLATILE, RFIDlerConfig.PotLow, TmpBuff); // delay to allow things to settle Delay_us(500000); // reset globals PWD_Mode= FALSE; memset(Password, '\0', sizeof(Password)); return TRUE; }
display_M() { //--------------col-1-------------- P2 = ON; // Turn ON diodes on PORT2 Delay_us(U_SEC); P2 = OFF; // Turn Off diodes on PORT2 //--------------col-2-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-3-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-4-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-5-------------- P2_0_bit = OFF; P2_1_bit = ON; Delay_us(U_SEC); //--------------col-6-------------- P2_1_bit = ON; Delay_us(U_SEC); //--------------col-7-------------- P2_1_bit = ON; Delay_us(U_SEC); //--------------col-8-------------- P2_1_bit = OFF; P2_2_bit = ON; Delay_us(U_SEC); //--------------col-9-------------- P2_2_bit = ON; Delay_us(U_SEC); //--------------col-10-------------- P2_2_bit = ON; Delay_us(U_SEC); //--------------col-11-------------- P2_2_bit = OFF; P2_3_bit = ON; Delay_us(U_SEC); //--------------col-12-------------- P2_3_bit = ON; Delay_us(U_SEC); //--------------col-13-------------- P2_3_bit = ON; Delay_us(U_SEC); //--------------col-14-------------- P2_3_bit = OFF; P2_2_bit = ON; Delay_us(U_SEC); //--------------col-15-------------- P2_2_bit = ON; Delay_us(U_SEC); //--------------col-16-------------- P2_2_bit = ON; Delay_us(U_SEC); //--------------col-17-------------- P2_2_bit = OFF; P2_1_bit = ON; Delay_us(U_SEC); //--------------col-18-------------- P2_1_bit = ON; Delay_us(U_SEC); //--------------col-19-------------- P2_1_bit = ON; Delay_us(U_SEC); //--------------col-20-------------- P2_1_bit = OFF; P2_0_bit = ON; Delay_us(U_SEC); //--------------col-21-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-22-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-23-------------- P2 = ON; // Turn ON diodes on PORT2 Delay_us(U_SEC); P2 = OFF; // Turn Off diodes on PORT2 //---------------------------------- }
/************************************************************************* Initialize display Input: none Returns: none *************************************************************************/ void lcd_init(void) { //Set All Pins as Output lcd_e_ddr_high(); lcd_rs_ddr_high(); #if RW_LINE_IMPLEMENTED==1 lcd_rw_ddr_high(); #endif lcd_db7_ddr_high(); lcd_db6_ddr_high(); lcd_db5_ddr_high(); lcd_db4_ddr_high(); #if LCD_BITS==8 lcd_db3_ddr_high(); lcd_db2_ddr_high(); lcd_db1_ddr_high(); lcd_db0_ddr_high(); #endif //Set All Control Lines Low lcd_e_port_low(); lcd_rs_port_low(); #if RW_LINE_IMPLEMENTED==1 lcd_rw_port_low(); #endif //Set All Data Lines High lcd_db7_port_high(); lcd_db6_port_high(); lcd_db5_port_high(); lcd_db4_port_high(); #if LCD_BITS==8 lcd_db3_port_high(); lcd_db2_port_high(); lcd_db1_port_high(); lcd_db0_port_high(); #endif //Startup Delay Delay_ms(DELAY_RESET); //Initialize Display lcd_db7_port_low(); lcd_db6_port_low(); Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); Delay_us(4100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); Delay_us(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); Delay_us(40); //Init differs between 4-bit and 8-bit from here #if (LCD_BITS==4) lcd_db4_port_low(); Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); Delay_us(40); lcd_db4_port_low(); Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); Delay_ns(500); #if (LCD_DISPLAYS==1) if (LCD_DISPLAY_LINES>1) lcd_db7_port_high(); #else unsigned char c; switch (ActiveDisplay) { case 1 : c=LCD_DISPLAY_LINES; break; case 2 : c=LCD_DISPLAY2_LINES; break; #if (LCD_DISPLAYS>=3) case 3 : c=LCD_DISPLAY3_LINES; break; #endif #if (LCD_DISPLAYS==4) case 4 : c=LCD_DISPLAY4_LINES; break; #endif } if (c>1) lcd_db7_port_high(); #endif Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); Delay_us(40); #else #if (LCD_DISPLAYS==1) if (LCD_DISPLAY_LINES<2) lcd_db3_port_low(); #else unsigned char c; switch (ActiveDisplay) { case 1 : c=LCD_DISPLAY_LINES; break; case 2 : c=LCD_DISPLAY2_LINES; break; #if (LCD_DISPLAYS>=3) case 3 : c=LCD_DISPLAY3_LINES; break; #endif #if (LCD_DISPLAYS==4) case 4 : c=LCD_DISPLAY4_LINES; break; #endif } if (c<2) lcd_db3_port_low(); #endif lcd_db2_port_low(); Delay_ns(100); lcd_e_port_high(); Delay_ns(500); lcd_e_port_low(); Delay_us(40); #endif //Display Off lcd_command(_BV(LCD_DISPLAYMODE)); //Display Clear lcd_clrscr(); //Entry Mode Set lcd_command(_BV(LCD_ENTRY_MODE) | _BV(LCD_ENTRY_INC)); //Display On lcd_command(_BV(LCD_DISPLAYMODE) | _BV(LCD_DISPLAYMODE_ON)); }
display_T() { //--------------col-1-------------- P2_0_bit = ON; P2_1_bit = ON; Delay_us(U_SEC); P2_1_bit = OFF; //--------------col-2-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-3-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-4-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-5-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-6-------------- P2_0_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-7-------------- P2 = ON; Delay_us(U_SEC); P2 = OFF; //--------------col-8-------------- P2_0_bit = ON; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-9-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-10-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-11-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-12-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-13-------------- P2_0_bit = ON; Delay_us(U_SEC); //--------------col-14-------------- P2_0_bit = ON; P2_1_bit = ON; Delay_us(U_SEC); P2_0_bit = OFF; P2_1_bit = OFF; //--------------------------------- }
void main() { int i; DDRA = 0xFF; DDRC = 0xFF; DDRD = 0xFF; Delay_us(2000); sendCommand(0x38) ; sendCommand(0x0C); sendCommand(0x01); Delay_us(2000) ; while(1) { PORTA = 0x06; //1 Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x5B; //2 Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x40; Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x5B; Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x06; Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x3F; Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x07; Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x5B; //2 Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x40; Delay_ms(1000); PORTA = 0x00; Delay_ms(500); PORTA = 0x06; //1 Delay_ms(1000); PORTA = 0x00; Delay_ms(500); sendString("Tasneem Ahmed Turash"); sendCommand(0xC0); sendString(" 12-21072-1"); Delay_ms(2000); sendCommand(0x01); Delay_ms(500); sendString(" EEE"); sendCommand(0xC0); sendString(" 119"); Delay_ms(2000); sendCommand(0x01); Delay_ms(500); } }
display_W() { //--------------col-1-------------- P2 = ON; // Turn ON diodes on PORT2 Delay_us(U_SEC); P2 = OFF; // Turn Off diodes on PORT2 zz //--------------col-2-------------- P2_7_bit = ON; Delay_us(U_SEC); //--------------col-3-------------- P2_7_bit = ON; Delay_us(U_SEC); //--------------col-4-------------- P2_7_bit = ON; Delay_us(U_SEC); //--------------col-5-------------- P2_7_bit = OFF; P2_6_bit = ON; Delay_us(U_SEC); //--------------col-6-------------- P2_6_bit = ON; Delay_us(U_SEC); //--------------col-7-------------- P2_6_bit = ON; Delay_us(U_SEC); //--------------col-8-------------- P2_6_bit = OFF; P2_5_bit = ON; Delay_us(U_SEC); //--------------col-9-------------- P2_5_bit = ON; Delay_us(U_SEC); //--------------col-10-------------- P2_5_bit = ON; Delay_us(U_SEC); //--------------col-11-------------- P2_5_bit = OFF; P2_4_bit = ON; Delay_us(U_SEC); //--------------col-12-------------- P2_4_bit = ON; Delay_us(U_SEC); //--------------col-13-------------- P2_4_bit = ON; Delay_us(U_SEC); //--------------col-14-------------- P2_4_bit = OFF; P2_5_bit = ON; Delay_us(U_SEC); //--------------col-15-------------- P2_5_bit = ON; Delay_us(U_SEC); //--------------col-16-------------- P2_5_bit = ON; Delay_us(U_SEC); //--------------col-17-------------- P2_5_bit = OFF; P2_6_bit = ON; Delay_us(U_SEC); //--------------col-18-------------- P2_6_bit = ON; Delay_us(U_SEC); //--------------col-19-------------- P2_6_bit = ON; Delay_us(U_SEC); //--------------col-20-------------- P2_6_bit = OFF; P2_7_bit = ON; Delay_us(U_SEC); //--------------col-21-------------- P2_7_bit = ON; Delay_us(U_SEC); //--------------col-22-------------- P2_7_bit = ON; Delay_us(U_SEC); //--------------col-23-------------- P2 = ON; // Turn ON diodes on PORT2 Delay_us(U_SEC); P2 = OFF; // Turn Off diodes on PORT2 //---------------------------------- }
// this routine accepts either binary arrays or binary strings BOOL rwd_send2(unsigned char *command, unsigned int length, BOOL reset, BOOL block, BYTE initial_state, unsigned long fc, unsigned long sleep, unsigned int wake, unsigned int pw0, unsigned int pw1, unsigned int gap, unsigned int post_wait, BOOL diff, unsigned int ogap, unsigned int zgap, BOOL barrier, unsigned int ob, unsigned int zb) { unsigned int i; RWD_Fc= fc; // convert FCs to system ticks RWD_Sleep_Period= CONVERT_TO_TICKS(sleep * fc); if (diff){ RWD_One_Gap_Period = ogap * 2; RWD_Zero_Gap_Period = zgap * 2; }else{ RWD_One_Gap_Period = gap * 2; RWD_Zero_Gap_Period = gap * 2; } if(barrier){ RWD_One_Barrier_Period = ob * 2; RWD_Zero_Barrier_Period = zb * 2; } RWD_Barrier = barrier; // convert FCs to OCM ticks RWD_Wake_Period= wake * 2; RWD_Zero_Period= pw0 * 2; RWD_One_Period= pw1 * 2; RWD_Post_Wait= post_wait * 2; if(!RWD_Zero_Period || !RWD_One_Period || (!RWD_Gap_Period && !diff)) return FALSE; // convert ascii string to bin if required if(command[0] == '0' || command[0] == '1') { if(!binstringtobinarray(RWD_Command_Buff, command)) return FALSE; } else memcpy(RWD_Command_Buff, command, length); RWD_Command_Buff[length]= '*'; RWD_Command_ThisBit= RWD_Command_Buff; // start clock and wait for TAG to wake if not already running // this is needed in case a non-resetting RWD command is issued before any other action has woken tag if(mGetLED_Clock() == mLED_OFF) { RWD_State= RWD_STATE_INACTIVE; InitHWReaderClock(OC_TOGGLE_PULSE, RWD_Fc / 2L, RWD_Fc, RWD_State); if(!reset) Delay_us((RFIDlerConfig.FrameClock * RFIDlerConfig.RWD_Wake_Period) / 100); } if(reset) RWD_State= RWD_STATE_GO_TO_SLEEP; else RWD_State= initial_state; // see if ISR has flagged RWD command finished if(block) while(RWD_State != RWD_STATE_ACTIVE) ; return TRUE; }
int main(void) { uint8_t i, x, y, xo, yo; uint8_t xaxis = 10, yaxis = 53; MCU_initialize(); // initialize MCU and kit Delay_ms(50); // wait for system stabilization LCD_initialize(); // initialize text LCD module Beep(); LCD_string(0x80, "Graphic LCD Test"); // display title on text LCD LCD_string(0xC0, " VR1 Voltage "); TCCR1A = 0x00; // CTC mode(4), don't output OC1A TCCR1B = _BV(WGM12) | _BV(CS12); // 16MHz/256/(1+6249) = 10Hz TCCR1C = 0x00; // (100ms interrupt period) OCR1A = 6249; TCNT1 = 0x0000; // clear Timer/Counter1 TIMSK = _BV(OCIE1A); // enable OC1A interrupt ETIMSK = 0x00; TIFR =_BV(ICF1) | _BV(OCF1A) | _BV(OCF1B) | _BV(TOV1);// clear all interrupt flags ETIFR = _BV(OCF1C); sei(); // global interrupt enable ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS0); // ADC enable, 500kHz ADMUX = _BV(REFS0) | _BV(MUX1) | _BV(MUX0); // select ADC3 with AVCC Delay_us(150); n = 0; // initial interrupt count AD_flag = 0; while (1) { Clear_screen(); // initialize GLCD screen Line(yaxis, xaxis - 1, yaxis, 125); // draw X axis Line(yaxis - 2, 123, yaxis, 125); Line(yaxis + 2, 123, yaxis, 125); for (y = xaxis + 10; y <= xaxis + 110; y += 10) Line(yaxis - 1, y, yaxis + 1, y); for (y = xaxis, i = 0; y <= xaxis + 80; y += 20, i += 2) { GLCD_xy(7, y - 2); GLCD_character(i + '0'); } GLCD_string(7, 108, "sec"); Line(0, xaxis, yaxis + 1, xaxis); // draw Y axis Line(2, xaxis - 2, 0, xaxis); Line(2, xaxis + 2, 0, xaxis); for (x = 3; x <= 43; x += 10) Line(x, xaxis - 1, x, xaxis + 1); GLCD_xy(6, 2); GLCD_character('0'); GLCD_xy(0, 2); GLCD_character('V'); yo = xaxis; // initial point of old data xo = yaxis; while (n) { while (!AD_flag) ; // wait until new A/D data AD_flag = 0; y = xaxis + n; // draw line from old point x = yaxis - AD_data; // to new point Line(xo, yo, x, y); yo = y; // old point <-- new point xo = x; } } return 0; }
void Delay_ms(uint32_t n) { Delay_us(1000*n); //return; }