O_嵌入式专题目录


STCLockSCode.c

#include "Header.h"

uchar Lat_ROM[]={"3614.3948"};
uchar Long_ROM[]={"12026.3911"};

void main()
{
    ATY_Init();

    Clear_Ram();
    Show_Line(X2,"Searching GPS...");
    //Show_Line(X2,Lat_ROM);

    while(1)
    {
        parseGpsBuffer();
        printGpsBuffer();
        if(Save_Data.isShowData)
        {
            UartPrintf("\r\nSuccess!");
            //Uart_End();
            break;
        }
    }
    /* Electronic fence */
    if(((int)Lat_ROM[5]-(int)Save_Data.latitude[5])>1 || ((int)Long_ROM[6]-(int)Save_Data.longitude[6])>1)
    {
        Show_Line(X2,"Location  Wrong!");
        DelayMs(3000);
    }
    else
        Judge_Password();
}

Header.h

#ifndef _HEADER_H_
#define _HEADER_H_

#include <reg52.h>
#include "90.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <intrins.h>    //_nop_()

#include "Delay.h"
#include "Alarm.h"
#include "Infrared.h"
#include "KeyControl.h"
#include "UART.h"
#include "AT24C02.h"
#include "Index.h"
#include "DHT11.h"
#include "JudgePassword.h"
#include "GPS.h"
#include "Infrared.h"

void ATY_Init()
{
    P42=0;
    Relay=1;
    Uart_Init();
    Delay_ms(10);
    clrStruct();
    //SP=0x5f;
    Init_Lcd();
    CloseLock=1;
    OpenLock=0;
    RR_DATA=0;
    F_Scan=1;
    F_Input=1;
    F_Success=1;
    F_Fail=1;
}


/*
sbit Alarm = P1^0;    //Alarm

sbit CS   = P1^1;       //LCD
sbit STD  = P1^2;
sbit SCLK = P1^3;
sbit PSB  = P0^0;
sbit RST  = P0^1;

sbit SCL = P1^4;        //24C02 Serial clock
sbit SDA = P1^5;        //24C02 Serial data

sbit CloseLock = P1^6;
sbit OpenLock = P1^7;

Keyboard P2             //Keyboard

GPS UART P3^0;          //GPS

sbit Relay = P3^1;      //Relay

sbit RR_DATA = P3^2;    //Infrared

sbit Data = P3^3;       //DHT11

sbit F_Scan = P3^4;     //Finger
sbit F_Input = P3^5;
sbit F_Success = P3^6;
sbit F_Fail = P3^7;

*/

#endif

90.h

#ifndef __STC89C5xRC_RDP_H_
#define __STC89C5xRC_RDP_H_

/////////////////////////////////////////////////

/* The following is STC additional SFR */

/* sfr  AUXR  = 0x8e; */
/* sfr  AUXR1 = 0xa2; */
/* sfr  IPH   = 0xb7; */

sfr  P4  = 0xe8;
sbit P46 = P4^6;
sbit P45 = P4^5;       //ISP下载需勾选"ALE脚用作P4.5口"
sbit P44 = P4^4;
sbit P43 = P4^3;
sbit P42 = P4^2;
sbit P41 = P4^1;
sbit P40 = P4^0;

sfr  XICON = 0xc0;

sfr  WDT_CONTR = 0xe1;

sfr ISP_DATA  = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD   = 0xe5;
sfr ISP_TRIG  = 0xe6;
sfr ISP_CONTR = 0xe7;

/* Above is STC additional SFR */

/*--------------------------------------------------------------------------
REG51F.H

Header file for 8xC31/51, 80C51Fx, 80C51Rx+
Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.

Modification according to DataSheet from April 1999
 - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
--------------------------------------------------------------------------*/

/*  BYTE Registers  */
sfr P0   = 0x80;
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1   = 0x90;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2   = 0xA0;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3   = 0xB0;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr PSW  = 0xD0;
sfr ACC  = 0xE0;
sfr B    = 0xF0;
sfr SP   = 0x81;
sfr DPL  = 0x82;
sfr DPH  = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0  = 0x8A;
sfr TL1  = 0x8B;
sfr TH0  = 0x8C;
sfr TH1  = 0x8D;
sfr IE   = 0xA8;
sfr IP   = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;

/*  80C51Fx/Rx Extensions  */
sfr AUXR   = 0x8E;
sfr AUXR1  = 0xA2;
sfr SADDR  = 0xA9;
sfr IPH    = 0xB7;
sfr SADEN  = 0xB9;
sfr T2CON  = 0xC8;
sfr T2MOD  = 0xC9;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;

/* PCA SFR
sfr CCON   = 0xD8;
sfr CMOD   = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;
sfr CCAPM3 = 0xDD;
sfr CCAPM4 = 0xDE;
sfr CL     = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CCAP3L = 0xED;
sfr CCAP4L = 0xEE;
sfr CH     = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;
sfr CCAP3H = 0xFD;
sfr CCAP4H = 0xFE;
*/

/*  BIT Registers  */
/*  PSW   */
sbit CY   = PSW^7;
sbit AC   = PSW^6;
sbit F0   = PSW^5;
sbit RS1  = PSW^4;
sbit RS0  = PSW^3;
sbit OV   = PSW^2;
sbit F1   = PSW^1;
sbit P    = PSW^0;

/*  TCON  */
sbit TF1  = TCON^7;
sbit TR1  = TCON^6;
sbit TF0  = TCON^5;
sbit TR0  = TCON^4;
sbit IE1  = TCON^3;
sbit IT1  = TCON^2;
sbit IE0  = TCON^1;
sbit IT0  = TCON^0;

/*  IE   */
sbit EA   = IE^7;
sbit EC   = IE^6;
sbit ET2  = IE^5;
sbit ES   = IE^4;
sbit ET1  = IE^3;
sbit EX1  = IE^2;
sbit ET0  = IE^1;
sbit EX0  = IE^0;

/*  IP   */ 
/*  sbit PPC  = IP^6;*/
sbit PT2  = IP^5;
sbit PS   = IP^4;
sbit PT1  = IP^3;
sbit PX1  = IP^2;
sbit PT0  = IP^1;
sbit PX0  = IP^0;

/*  P3  */
sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD  = P3^1;
sbit RXD  = P3^0;

/*  SCON  */
sbit SM0  = SCON^7; // alternatively "FE"
sbit FE   = SCON^7;
sbit SM1  = SCON^6;
sbit SM2  = SCON^5;
sbit REN  = SCON^4;
sbit TB8  = SCON^3;
sbit RB8  = SCON^2;
sbit TI   = SCON^1;
sbit RI   = SCON^0;
             
/*  P1  */
/* PCA
sbit CEX4 = P1^7;
sbit CEX3 = P1^6;
sbit CEX2 = P1^5;
sbit CEX1 = P1^4;
sbit CEX0 = P1^3;
sbit ECI  = P1^2;
*/

sbit T2EX = P1^1;
sbit T2   = P1^0;

/*  T2CON  */
sbit TF2   = T2CON^7;
sbit EXF2  = T2CON^6;
sbit RCLK  = T2CON^5;
sbit TCLK  = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2   = T2CON^2;
sbit C_T2  = T2CON^1;
sbit CP_RL2= T2CON^0;

/*  CCON  */
/*  PCA
sbit CF    = CCON^7;
sbit CR    = CCON^6;

sbit CCF4  = CCON^4;
sbit CCF3  = CCON^3;
sbit CCF2  = CCON^2;
sbit CCF1  = CCON^1;
sbit CCF0  = CCON^0;
*/

/////////////////////////////////////////////////

#endif

Delay.h

#ifndef _DELAY_H_
#define _DELAY_H_

#include "Header.h"
#define uint unsigned int
#define uchar unsigned char

/*-----Delay-----*/
void DelayUs(uint us)       //Delay time us
{
    while(us--);
}
void DelayMs(uint ms)       //Delay time ms
{
  uint i,j;
  for(i=0;i<ms;i++)
        for(j=0;j<15;j++)
            DelayUs(1);
}

void DHT11_delay_us(uchar n)
{
    while(--n);
}
void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}

void Delay_10Us(uchar us)   //Delay for infrared
{
    while(us--);
}

#endif

Alarm.h

#ifndef _ALARM_H_
#define _ALARM_H_

#include "Header.h"

sbit Alarm = P1^0;  //Alarm Pin

uchar Alarm_Switch=0;

/*-----One Buzz-----*/
void OneAlarm()
{
    Alarm=0;
    DelayMs(Alarm_Switch);
    Alarm=1;
}
/*-----Two Buzz-----*/
void TwoAlarm()
{
    Alarm=0;
    DelayMs(Alarm_Switch);
    Alarm=1;
    DelayMs(120);
    Alarm=0;
    DelayMs(Alarm_Switch);
    Alarm=1;
}

#endif

Infrared.h

#ifndef _INFRARED_H_
#define _INFRARED_H_

#include "Header.h"

sbit RR_DATA = P3^2;
uchar RR_Value[4]=0;
uchar RR_Time=0;
uchar RR_Check=0;

void UART_Send_Byte(uchar c)
{
    SBUF=c;
    while(TI==0);
    TI=0;
}
void UART_Send_String(uchar *str)
{
    while(*str!='\0')
    {
        UART_Send_Byte(*str++);
    }
}

void RR_Init(void)
{
    IT0=1;
    EX0=1;
    EA=1;
    RR_DATA=1;
}
void RR_Read() interrupt 0
{
    uchar j,k;
    uint err;
    RR_Time=0;
    Delay_10Us(700);
    if(RR_DATA==0)
    {
        err=1000;
        while((RR_DATA==0)&&(err>0))
        {
            Delay_10Us(1);
            err--;
        }
        if(RR_DATA==1)
        {
            err=500;
            while((RR_DATA==1)&&(err>0))
            {
                Delay_10Us(1);
                err--;
            }
            for(k=0;k<4;k++)
            {
                for(j=0;j<8;j++)
                {
                    err=60;
                    while((RR_DATA==0)&&(err>0))
                    {
                        Delay_10Us(1);
                        err--;
                    }
                    err=500;
                    while((RR_DATA==1)&&(err>0))
                    {
                        Delay_10Us(10);
                        RR_Time++;
                        err--;
                        if(RR_Time>30)
                        {
                            return;
                        }
                    }
                    RR_Value[k]>>=1;
                    if(RR_Time>=8)
                    {
                        RR_Value[k]|=0x80;
                    }
                    RR_Time=0;
                }
            }
        }
        if(RR_Value[2]==~RR_Value[3])
        {
            RR_Check=1;
            UART_Send_String(RR_Value);     //Show uart data at hex, don't use text type
            UART_Send_String("\r\n\r\n");
        }
        else
        {
            RR_Check=0;
            UART_Send_String("Error\r\n");
        }
    }
}


#endif

KeyControl.h

#ifndef _KEYCONTROL_H_
#define _KEYCONTROL_H_

#include "Header.h"

uchar code Keyboard_Control[]={0xfe,0xfd,0xfb,0xf7};    //List of keyboard scanning
uchar RowCol=0;

/*-----Scan the key and return the value-----*/
uchar Key_Check()
{
    uchar Row,Col,i;
    P2=0xf0;
    RR_Init();
    if((P2&0xf0)!=0xf0)
    {
        DelayMs(10);
        if((P2&0xf0)!=0xf0)
        {
            Row=P2^0xf0;
            i=0;
            P2=Keyboard_Control[i];
            while(i<4)
            {
                if((P2&0xf0)!=0xf0)
                {
                    Col=~(P2&0xff);
                    break;
                }
                else
                {
                    i++;
                    P2=Keyboard_Control[i];
                }
            }
        }
        else
        {
            RowCol=0;
            return 0;
        }
        while((P2&0xf0)!=0xf0);
        OneAlarm();
        //P0=Row|Col;
        RowCol=Row|Col;
        return RowCol;
    }
    else if(RR_Check)
    {
        RR_Check=0;
        switch(RR_Value[2])
        {
            case 0x01: RowCol=0x11;break;
            case 0x02: RowCol=0x21;break;
            case 0x03: RowCol=0x41;break;
            case 0x04: RowCol=0x12;break;
            case 0x05: RowCol=0x22;break;
            case 0x06: RowCol=0x42;break;
            case 0x07: RowCol=0x14;break;
            case 0x08: RowCol=0x24;break;
            case 0x09: RowCol=0x44;break;
            case 0x00: RowCol=0x28;break;
            case 0x40: RowCol=0x84;break;   //Cancel
            case 0x0A: RowCol=0x88;break;   //OK
            case 0x19: RowCol=0x81;break;   //A up
            case 0x1D: RowCol=0x82;break;   //B down
            case 0x46: RowCol=0x18;break;   //* left
            case 0x47: RowCol=0x48;break;   //# right
            case 0x10:
                if(Alarm_Switch)
                    Alarm_Switch=0;
                else
                    Alarm_Switch=200;
                break;
        }
        OneAlarm();
        //RR_DATA=0;
        return RowCol;
    }
    else
    {
        RowCol=0;
        return 0;
    }
}
/*-----Coding the key value to number-----*/
uchar Coding_Key(uchar RowCol)
{
    uchar Coded_Key;
    switch(RowCol)
    {
        case (0x11): Coded_Key='1';break;
        case (0x21): Coded_Key='2';break;
        case (0x41): Coded_Key='3';break;
        case (0x81): Coded_Key='A';break;
        case (0x12): Coded_Key='4';break;
        case (0x22): Coded_Key='5';break;
        case (0x42): Coded_Key='6';break;
        case (0x82): Coded_Key='B';break;
        case (0x14): Coded_Key='7';break;
        case (0x24): Coded_Key='8';break;
        case (0x44): Coded_Key='9';break;
        case (0x84): Coded_Key='C';break;
        case (0x18): Coded_Key='*';break;
        case (0x28): Coded_Key='0';break;
        case (0x48): Coded_Key='#';break;
        case (0x88): Coded_Key='D';break;
    }
    return Coded_Key;
}

#endif

UART.h

#ifndef __UART_H__
#define __UART_H__

#include "Header.h"

#define GPS_Buffer_Length 80
#define latitude_Length 11
#define longitude_Length 12

typedef struct SaveData
{
    char GPS_Buffer[GPS_Buffer_Length];
    char isGetData;                     //If got the GPS data
    char isParseData;                   //If the data has analysis success
    char latitude[latitude_Length];     //WeiDu
    char longitude[longitude_Length];   //JingDu
    char isUsefull;                     //If the position info is useful
    char isShowData;                    //Has shown the data
} xdata _SaveData;


#define gpsRxBufferLength  76
char idata gpsRxBuffer[gpsRxBufferLength];
unsigned char RX_Count = 0;
_SaveData Save_Data;

void Uart_Init()
{
    SCON = 0X50;  //UART type 1, 8 bit UART
    REN  = 1;     //Allow the serial port get data
    PCON = 0x00;  //SMOD=0; No doubling of baud rate
    TMOD = 0x20;  //T1 type 2, to generate baud rate
    TH1  = 0xFD;  //Filling initial value
    TL1  = 0xFD;
    TR1  = 1;     //Open timer 1
    EA   = 1;     //Open global interrupt control
    ES   = 1;     //Open serial port interrupt
}
void Uart_End()
{
    REN  = 0;     //Forbid the serial pin get data
    TR1  = 0;     //Close timer 1
    ES   = 0;     //Close serial port interrupt
    EA   = 0;     //Close global interrupt control
}

void UartPrintf(unsigned char *p)       //Send a string
{
    while(*p)
    {
        SBUF=*(p++);
        while(TI==0);
        TI=0;
    }
}

void UartPrintASCII(unsigned char c)    //Send a character
{
    TI=0;
    SBUF=c;
    while(TI==0);
    TI=0;
}


void RECEIVE_DATA(void) interrupt 4 using 3
{
    unsigned char temp = 0;
    char i = 0;
    ES=0;
    temp = SBUF;
    RI = 0;

    if(temp == '$')
    {
        RX_Count = 0;
    }

    if(RX_Count <= 5)
    {
       gpsRxBuffer[RX_Count++] = temp;
    }
    else if(gpsRxBuffer[0] == '$' &gpsRxBuffer[4] == 'M' && gpsRxBuffer[5] == 'C')  //Make sure got the frame:"GPRMC/GNRMC"
    {
        gpsRxBuffer[RX_Count++] = temp;
        if(temp == '\n')
        {
            memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);     //Clear buf
            memcpy(Save_Data.GPS_Buffer, gpsRxBuffer, RX_Count);    //Save data
            Save_Data.isGetData = 1;
            RX_Count = 0;
            memset(gpsRxBuffer, 0, gpsRxBufferLength);              //Clear buf
        }

        if(RX_Count >= 75)
        {
            RX_Count = 75;
            gpsRxBuffer[RX_Count] = '\0';                           //Adding an End Character
        }
    }
    ES=1;
}

void clrStruct()
{
    Save_Data.isGetData = 0;
    Save_Data.isParseData = 0;
    Save_Data.isUsefull = 0;
    Save_Data.isShowData = 0;
    memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);
    memset(Save_Data.latitude, 0, latitude_Length);
    memset(Save_Data.longitude, 0, longitude_Length);
}
void Delay_ms(unsigned int n)
{
    unsigned int  i,j;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

void errorLog(int num)
{

    while (1)
    {
      UartPrintf("ERROR");
        UartPrintASCII(num+0x30);
        UartPrintf("\r\n");
    }
}

#endif

AT24C02.h

#ifndef _AT24C02_H_
#define _AT24C02_H_

#include "Header.h"

sbit SCL = P1^4;            //24C02 Serial clock
sbit SDA = P1^5;            //24C02 Serial data

/*-----Do Nop-----*/
void Nop()
{
    _nop_();                //About 1us per command
    _nop_();
    _nop_();
    _nop_();
}
/*-----Start condition-----*/
void Start()
{
    SDA=1;
    SCL=1;
    Nop();
    SDA=0;
    Nop();
}
/*-----Stop condition-----*/
void Stop()
{
    SDA=0;
    SCL=1;
    Nop();
    SDA=1;
    Nop();
}
/*-----Acknowledgement-----*/
void Ack()
{
    SDA=0;
    Nop();
    SCL=1;
    Nop();
    SCL=0;
}
/*-----DeAcknowledgement-----*/
void DeAck()
{
    SDA=1;
    Nop();
    SCL=1;
    Nop();
    SCL=0;
}

/*-----Send data-----*/
void Send(uchar Data_Send)
{
    uchar BitCounter=8;
    uchar Temp;
    do
    {
        Temp=Data_Send; //Save getted data to 'Temp' temporary
        SCL=0;
        Nop();
        if((Temp&0x80)==0x80)
                SDA=1;
        else
                SDA=0;
        SCL=1;
        Temp=Data_Send<<1;
        Data_Send=Temp;
        BitCounter--;   //Data send over when Bitcounter subtracted to 0
    }
    while(BitCounter);  //Judge whether it is completed or not
    SCL=0;
}
/*-----Read one byte data and return-----*/
uchar Read()
{
  uchar Data_Read=0;
    uchar Temp=0;
    uchar BitCounter=8;
    SDA=1;
    do
    {
        SCL=0;
        Nop();
        SCL=1;
        Nop();
        if(SDA)
            Data_Read=Data_Read|0x01;   //Data_Read's minimum bit is 1(|0x01,is change the minimum bit to 1)
        else                            //If SDA = 0
            Data_Read=Data_Read&0xfe;   //Data_Read's minimum bit is 0(&0xfe 11111110 is change the bit position to 0)
        if(BitCounter-1)                //Judge the BitCounter is true or not after subtracted 1
        {
            Temp=Data_Read<<1;
            Data_Read=Temp;
        }
        BitCounter--;                   //Getting data over while BitCounter subtract to 0
    }
    while(BitCounter);                  //Judge whether it is completed or not
    return Data_Read;
}

/*-----Write data to ROM-----*/
void Write_ROM(uchar Data_Write[],uchar Address,uchar Num)
{
  uchar i;
  uchar *PData;
  PData=Data_Write;
  for(i=0;i<Num;i++)
  {
        Start();
        Send(0xa0);
        Ack();
        Send(Address+i);
        Ack();
        Send(*(PData+i));
        Ack();
        Stop();
        DelayMs(20);
  }
}
/*-----Read data from ROM-----*/
void Read_ROM(uchar Data_Read[],uchar Address,uchar Num)
{
  uchar i;
  uchar *PData;
  PData=Data_Read;
  for(i=0;i<Num;i++)
  {
        Start();
        Send(0xa0);
        Ack();
        Send(Address+i);
        Ack();
        Start();
        Send(0xa1);
        Ack();
        *(PData+i)=Read();
        SCL=0;
        DeAck();
        Stop();
  }
}

#endif

Index.h

#ifndef _INDEX_H_
#define _INDEX_H_

#include "Header.h"

#define X1 0x80 //X first line
#define X2 0x90 //X second line
#define X3 0x88 //X third line
#define X4 0x98 //X fourth line
#define Y 0x80
#define COMMAND 0
#define DATA 1

sbit CS   = P1^1;
sbit STD  = P1^2;   //Data port
sbit SCLK = P1^3;
sbit PSB  = P0^0;   //H=Parallel; L=Serial;
sbit RST  = P0^1;   //Reset Signal Low effective

void WriteRead_Lcd (uchar DATA_COMMAND,uchar Content);

uchar code Index[]=
{
    "I              :"  //The first line
    "  - - -  - - -  "  //The third line
    "    Einstein    "  //The second line
    "----------------"  //The fource line
};


/*-----Initialization-----*/
void Init_Lcd()
{
  RST=1;
  PSB=0;
  WriteRead_Lcd(COMMAND,0x30);  //Basic command action
  WriteRead_Lcd(COMMAND,0x01);  //Clear screen, address pointer points to 00H
  DelayUs(100);
  WriteRead_Lcd(COMMAND,0x06);  //Moving direction of cursor
  WriteRead_Lcd(COMMAND,0x0c);  //Open display, close cursor
}
/*-----Clear DDRAM-----*/
void Clear_Ram ()
{
  WriteRead_Lcd(COMMAND,0x30);
  WriteRead_Lcd(COMMAND,0x01);
  DelayUs(180);
}
/*-----Show characters on the whole screen-----*/
void Show_Screen(uchar *Content)
{
  uchar i,j;
    Clear_Ram();
  WriteRead_Lcd(COMMAND,X1);    //Specify the first address of DDRAM
  for(j=0;j<4;j++)
    for(i=0;i<16;i++)
            WriteRead_Lcd(DATA,Content[j*16+i]);
}
/*-----Show characters on designated line-----*/
void Show_Line(uchar Line,uchar *Content)
{
    uchar i;
  //Clear_Ram();
  WriteRead_Lcd(COMMAND,Line);
  for(i=0;i<16;i++)
        WriteRead_Lcd(DATA,Content[i]);
}
/*-----Write or read DDRAM-----*/
void WriteRead_Lcd(uchar DATA_COMMAND,uchar Content)
{
  uchar a,i,j;
  DelayUs(50);
  a=Content;
  CS=1;
  SCLK=0;
  STD=1;
  for(i=0;i<5;i++)
  {
    SCLK=1;
    SCLK=0;
  }
  STD=0;
  SCLK=1;
  SCLK=0;
  if(DATA_COMMAND)
    STD=1;   //read from DDRAM - data
  else
    STD=0;   //write - COMMAND
  SCLK=1;
  SCLK=0;
  STD=0;
  SCLK=1;
  SCLK=0;
  for(j=0;j<2;j++)
  {
    for(i=0;i<4;i++)
    {
      a=a<<1;
      STD=CY;   //CY->Carry
      SCLK=1;
      SCLK=0;
    }
    STD=0;
    for(i=0;i<4;i++)
    {
      SCLK=1;
      SCLK=0;
    }
  }
}

void Change_Screen(uchar *Num)
{
    uchar Changed_Index[]=
    {
        "I              :"
        "  - - -  - - -  "
        "    Einstein    "
        "----------------"
    };
    Clear_Ram();
    Changed_Index[18]=Num[0];
    Changed_Index[20]=Num[1];
    Changed_Index[22]=Num[2];
    Changed_Index[25]=Num[3];
    Changed_Index[27]=Num[4];
    Changed_Index[29]=Num[5];
    Show_Screen(Changed_Index);
}
void Change_Password(uchar *Num)
{
    uchar Changed_Password[]=
    {
        "C              :"
        "  - - -  - - -  "
        "    Einstein    "
        "----------------"
    };
    Clear_Ram();
    Changed_Password[18]=Num[0];
    Changed_Password[20]=Num[1];
    Changed_Password[22]=Num[2];
    Changed_Password[25]=Num[3];
    Changed_Password[27]=Num[4];
    Changed_Password[29]=Num[5];
    Show_Screen(Changed_Password);
}
void Show_Menu()
{
    Clear_Ram();
    Show_Line(X1,"Menu            ");
    Show_Line(X2,"1:Reset A:Finger");
    Show_Line(X3,"2:Alter B:GPS   ");
    Show_Line(X4,"    C:ReLock    ");
}
void Show_Finger()
{
    Clear_Ram();
    Show_Line(X1,"Finger          ");
    Show_Line(X2,"    1:Scan      ");
    Show_Line(X3,"    2:Input     ");
    Show_Line(X4,"    C:Cancel    ");
}
void Show_GPS()
{
    Clear_Ram();
    Show_Line(X1,"GPS             ");
    Show_Line(X2,"  1:CurrentGPS  ");
    Show_Line(X3,"  2:SetCurrent  ");
    Show_Line(X4,"  C:Cancel      ");
}
void Show_LatLong()
{
    uchar LatLong[]=
    {
        "Latitude:       "
        "Longitude:      "
        "                "
        "                "
    };
    Clear_Ram();
    LatLong[39]=Save_Data.latitude[0];
    LatLong[40]=Save_Data.latitude[1];
    LatLong[41]=Save_Data.latitude[2];
    LatLong[42]=Save_Data.latitude[3];
    LatLong[43]=Save_Data.latitude[4];
    LatLong[44]=Save_Data.latitude[5];
    LatLong[45]=Save_Data.latitude[6];
    LatLong[46]=Save_Data.latitude[7];
    LatLong[47]=Save_Data.latitude[8];
    LatLong[54]=Save_Data.longitude[0];
    LatLong[55]=Save_Data.longitude[1];
    LatLong[56]=Save_Data.longitude[2];
    LatLong[57]=Save_Data.longitude[3];
    LatLong[58]=Save_Data.longitude[4];
    LatLong[59]=Save_Data.longitude[5];
    LatLong[60]=Save_Data.longitude[6];
    LatLong[61]=Save_Data.longitude[7];
    LatLong[62]=Save_Data.longitude[8];
    LatLong[63]=Save_Data.longitude[9];
    Show_Screen(LatLong);
}

#endif

DHT11.h

#ifndef _DHT11_H_
#define _DHT11_H_

#include "Header.h"

sbit Data = P3^3;

void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(20);
   Data=1;
   DHT11_delay_us(30);
}

uchar DHT11_rec_byte()
{
    uchar i,dat=0;
    for(i=0;i<8;i++)
    {
        while(!Data);
        DHT11_delay_us(8);
        dat<<=1;
        if(Data==1)
            dat+=1;
        while(Data);
    }
    return dat;
}

uint DHT11_receive()
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);
        DHT11_delay_us(40);
        R_H=DHT11_rec_byte();
        R_L=DHT11_rec_byte();
        T_H=DHT11_rec_byte();
        T_L=DHT11_rec_byte();
        revise=DHT11_rec_byte();
        DHT11_delay_us(25);

        if((R_H+R_L+T_H+T_L)==revise)
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        }
                RH='0'+(RH/10);
                if(RH>'7')
                    return 1;
    }
        return 0;
}

#endif

JudgePassword.h

#ifndef _JUDGEPASSWORD_H_
#define _JUDGEPASSWORD_H_

#include "Header.h"

sbit CloseLock = P1^6;
sbit OpenLock = P1^7;
sbit Relay = P3^1;

sbit F_Scan = P3^4;     //Finger
sbit F_Input = P3^5;
sbit F_Success = P3^6;
sbit F_Fail = P3^7;

uchar Lat[]={0};
uchar Long[]={0};

/*-----Judge password from keyboard-----*/
void Judge_Password()
{
    uint N=0;
    uint i;
    uchar Init_ROM_Flag[]={"0"};
    uchar Password_ROM[]={"26262626"};
    uchar Password_Input[]={"------"};
    uint Right_Wrong=0;
    uint Success_Flag=0;
    uint N_Reset=0;

    Read_ROM(Init_ROM_Flag,0,1);
    if(Init_ROM_Flag[0]!='1')
    {
        Init_ROM_Flag[0]='1';
        Write_ROM(Init_ROM_Flag,0,1);
        Write_ROM(Password_ROM,1,6);
        Clear_Ram();
        Show_Line(X2,"    00000000    ");
        DelayMs(1000);
    }
    else
    {
        Read_ROM(Password_ROM,1,6);
        Clear_Ram();
        Show_Line(X2,"    11111111    ");
        DelayMs(1000);
    }
    Show_Screen(Index);

    while(1)
    {
        while(Key_Check())
        {
            if(N<6&&(RowCol==0x11||RowCol==0x21||RowCol==0x41||RowCol==0x12||RowCol==0x22||RowCol==0x42||RowCol==0x14||RowCol==0x24||RowCol==0x44||RowCol==0x18||RowCol==0x28||RowCol==0x48))
            {
                Password_Input[N]=Coding_Key(RowCol);
                P0=RowCol;
                N++;
                Change_Screen(Password_Input);
            }
            else if(RowCol==0x88&&N==6) //Got 6 bit number and the button has been pressed
            {
                Right_Wrong=1;
                for(i=0;i<N;i++)
                {
                    if(Password_Input[i]!=Password_ROM[i])
                        Right_Wrong=0;
                }
                if(Right_Wrong)
                {
                    for(i=0;i<6;i++)    //Clear up the value just entered
                        Password_Input[i]='-';
                    N=0;
                    Clear_Ram();
                    Show_Line(X2,"    Welcome:    ");
                    Show_Line(X3,"    Einstein    ");
                    OneAlarm();
                    CloseLock=0;
                    OpenLock=1;
                    Relay=0;
                    DelayMs(3000);
                    Show_Menu();

                    while(1)
                    {
                        if(DHT11_receive())
                        {
                            TwoAlarm();
                            goto Key_Cancel;
                        }
                        Key_Check();
                        if(RowCol==0x11)    //Press 1 to reset the password
                        {
                            if(!Success_Flag)   //If never reset
                            {
                                for(i=0;i<6;i=i+2)
                                    Password_ROM[i]='2';
                                for(i=1;i<6;i=i+2)
                                    Password_ROM[i]='6';
                                Write_ROM(Password_ROM,1,6);
                                Clear_Ram();
                                Show_Line(X2," Reset  Success ");
                                Show_Line(X3,"  2 6 2  6 2 6  ");
                                Success_Flag=1;
                                OneAlarm();
                                DelayMs(5000);
                                Show_Menu();

                            }
                            else if(Success_Flag)   //If reset
                            {
                                Show_Menu();
                                //break;
                            }
                        }
                        else if(RowCol==0x21)   //Press 2 to change the password
                        {
                            Success_Flag=0; //Set reset flag to unreset
                            Change_Password(Password_Input);
                            while(1)
                            {
                                Key_Check();
                                if(RowCol==0x11||RowCol==0x21||RowCol==0x41||RowCol==0x12||RowCol==0x22||RowCol==0x42||RowCol==0x14||RowCol==0x24||RowCol==0x44||RowCol==0x18||RowCol==0x28||RowCol==0x48)
                                {
                                    Password_ROM[N_Reset]=Coding_Key(RowCol);
                                    Password_Input[N_Reset]=Coding_Key(RowCol);
                                    N_Reset++;
                                    Change_Password(Password_Input);
                                }
                                else if(RowCol==0x88&&N_Reset==6)
                                {
                                    Write_ROM(Password_ROM,1,6);
                                    N_Reset=0;
                                    Clear_Ram();
                                    Show_Line(X2," Change Success ");   //Change password success
                                    OneAlarm();
                                    DelayMs(2000);
                                    Show_Menu();
                                    break;
                                }
                                else if(RowCol==0x84)
                                {
                                    N_Reset=0;
                                    for(i=0;i<6;i++)
                                        Password_Input[i]='-';
                                    Show_Menu();
                                    break;
                                }
                            }
                        }
                        else if(RowCol==0x81)   //Press A to enter the fingerprint page
                        {
                            Show_Finger();
                            while(1)
                            {
                                if(DHT11_receive())
                                {
                                    TwoAlarm();
                                    goto Key_Cancel;
                                }
                                Key_Check();
                                if(RowCol==0x11)
                                {
                                    Clear_Ram();
                                    Show_Line(X2,"    Scanning    ");
                                    F_Scan=0;
                                    DelayMs(200);
                                    F_Scan=1;
                                    while(F_Success && F_Fail);
                                    OneAlarm();

                                    if(!F_Success && F_Fail)
                                    {
                                        Clear_Ram();
                                        Show_Line(X2,"    Success!    ");
                                        DelayMs(2000);
                                        Clear_Ram();
                                        Show_Finger();
                                    }
                                    else if(F_Success && !F_Fail)
                                    {
                                        Clear_Ram();
                                        Show_Line(X2,"     Fail!!     ");
                                        DelayMs(2000);
                                        Clear_Ram();
                                        Show_Finger();

                                    }
                                }
                                else if(RowCol==0x21)
                                {
                                    Clear_Ram();
                                    Show_Line(X2,"     InputF     ");
                                    F_Input=0;
                                    DelayMs(200);
                                    F_Input=1;
                                    while(F_Success && F_Fail);
                                    OneAlarm();

                                    if(!F_Success && F_Fail)
                                    {
                                        Clear_Ram();
                                        Show_Line(X2,"    Success!    ");
                                        DelayMs(2000);
                                        Clear_Ram();
                                        Show_Finger();
                                    }
                                    else if(F_Success && !F_Fail)
                                    {
                                        Clear_Ram();
                                        Show_Line(X2,"     Fail!!     ");
                                        DelayMs(2000);
                                        Clear_Ram();
                                        Show_Finger();
                                    }
                                }
                                else if(RowCol==0x84)
                                {
                                    Show_Menu();
                                    break;
                                }
                            }
                        }
                        else if(RowCol==0x82)   //Press B to enter the GPS page
                        {
                            if(DHT11_receive())
                            {
                                TwoAlarm();
                                goto Key_Cancel;
                            }
                            Show_GPS();
                            while(1)
                            {
                                Key_Check();
                                if(RowCol==0x11)
                                {
                                    Clear_Ram();
                                    Show_LatLong();
                                }
                                if(RowCol==0x21)
                                {
                                    Clear_Ram();
                                    Show_Line(X2,"     0000B2     ");
                                    DelayMs(2000);
                                    Clear_Ram();
                                    Show_GPS();
                                }
                                else if(RowCol==0x84)
                                {
                                    Show_Menu();
                                    break;
                                }
                            }
                        }
                        else if(RowCol==0x84)   //Press C to jump to the end C
                            goto Key_Cancel;
                    }
                }
                else
                {
                    Clear_Ram();
                    Show_Line(X2,"Password  Wrong!");
                    TwoAlarm();
                    DelayMs(3000);
                    for(i=0;i<6;i++)
                        Password_Input[i]='-';
                    N=0;
                    Clear_Ram();
                    Change_Screen(Password_Input);

                }
            }
            else if(RowCol==0x84)   //Press C to cancel input or reclock
            {
                Key_Cancel: for(i=0;i<6;i++)
                    Password_Input[i]='-';
                N=0;
                Clear_Ram();
                Change_Screen(Password_Input);
                CloseLock=1;
                OpenLock=0;
                Relay=1;
            }
        }
    }
}

#endif

GPS.h

#ifndef __GPS_H__
#define __GPS_H__

#include "Header.h"

void printGpsBuffer()
{
    if (Save_Data.isParseData)
    {
        Save_Data.isParseData = 0;
        if(Save_Data.isUsefull)
        {
            Save_Data.isUsefull = 0;
            UartPrintf("Save_Data.latitude = ");
            UartPrintf(Save_Data.latitude);
            UartPrintf("\r\n");

            UartPrintf("Save_Data.longitude = ");
            UartPrintf(Save_Data.longitude);
            UartPrintf("\r\n");

            Save_Data.isShowData=1;
        }
        else
        {
            UartPrintf("GPS DATA is not usefull!\r\n");
        }
    }
}

void parseGpsBuffer()
{
    char *subString;
    char *subStringNext;
    char i = 0;
    if (Save_Data.isGetData)
    {
        Save_Data.isGetData = 0;
        UartPrintf("**************\r\n");
        UartPrintf(Save_Data.GPS_Buffer);

        for (i = 0 ; i <= 6 ; i++)
        {
            if (i == 0)
            {
                if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
                    errorLog(1);    //Analysis wrong
            }
            else
            {
                subString++;
                if ((subStringNext = strstr(subString, ",")) != NULL)
                {
                    char usefullBuffer[2];
                    switch(i)
                    {
                        //case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break; //Get UTC time
                        case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;   //Get status code
                        case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;  //Get latitude
                        //case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break; //Get N/S
                        case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break; //Get longitude
                        //case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break; //Get E/W
                        default:break;
                    }

                    subString = subStringNext;
                    Save_Data.isParseData = 1;
                    if(usefullBuffer[0] == 'A')
                        Save_Data.isUsefull = 1;
                    else if(usefullBuffer[0] == 'V')
                        Save_Data.isUsefull = 0;
                }
                else
                {
                    errorLog(2);    //Analysis wrong
                }
            }
        }
    }
}

#endif

评论已关闭

Loading...
Fullscreen Image