📄 main.c
字号:
/*
项目: 人员定位:读卡器
文件: main.c
日期: 2007.09.12
作者: 邵子扬
说明: 主程序,完成初始化,开始运行,低功耗等
*/
#include <avr/io.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include "common.h"
struct Timer tmr;
struct uCard card[MAX_CARD_NO];
struct Config cfg;
uint8 DataReady = 0;//有数据需要读取
uint8 dat __attribute__ ((section (".noinit")));
//使用环形缓冲区管理卡片
uint16 cdHead = 0, cdTail = 0; //首尾卡片地址
uint8 cdRTNum = 0;
void init()
{
wdt_disable();
io_init();
spi_init();
timer_init();
uart_init();
isr_init();
//sleep_enable();
nRF2401_init();
//延时,8MHz
tmr0delay(3);
nRF2401_config();
}
void readTimeFromBuf(uint8 *buf, struct Timer time)
{
time.day = buf[0] >> 3;
time.hour = ((buf[0] & 0x07) << 2) | (buf[1] >> 6);
time.min = buf[1] & 0x3F;
time.sec = buf[2] >> 2;
}
void WriteTimeToBuf(uint8 *buf, struct Timer time)
{
buf[0] = (time.day << 3) | (time.hour >>2);
buf[1] = (time.hour <<6) | time.min;
buf[2] = time.sec << 2;
}
//删除记录
void deleteID(uint16 ID)
{
uint16 i;
if(cdHead == cdTail)
return;
//不在有效范围之内
if(cdHead < cdTail)// 0 H T MAX
{
if((cdHead > ID)||(ID >= cdTail))
return;
else
{
for(i = ID; i < cdTail; i++)
{
card[i] = card[i+1];
//card[i].ID = card[i+1].ID;
//card[i].time[0] = card[i+1].time[0];
//card[i].time[1] = card[i+1].time[1];
//card[i].time[2] = card[i+1].time[2];
}
cdTail--;
}
}
else
{
if((cdHead > ID)&&(ID >= cdTail))// 0 T H MAX
return;
else
{
for(i = ID; i < (cdTail + MAX_CARD_NO); i++)
{
card[i % MAX_CARD_NO] = card[(i + 1) % MAX_CARD_NO];
//card[i % MAX_CARD_NO].ID = card[(i + 1) % MAX_CARD_NO].ID;
//card[i % MAX_CARD_NO].time[0] = card[(i + 1) % MAX_CARD_NO].time[0];
//card[i % MAX_CARD_NO].time[1] = card[(i + 1) % MAX_CARD_NO].time[1];
//card[i % MAX_CARD_NO].time[2] = card[(i + 1) % MAX_CARD_NO].time[2];
}
cdTail = (cdTail - 1) % MAX_CARD_NO;
}
}
}
//查找ID号是否已经记录
uint16 findID(uint16 ID)
{
uint16 i;
i = cdHead;
while(i != cdTail)
{
if((card[i].ID % 1024) == (ID % 1024))
{
return i;
}
i = (i + 1) % MAX_CARD_NO;
}
return -1;
}
//添加卡片
void addCard(uint16 id)
{
uint16 pos;
pos = findID(id);
if(pos == -1) //没有记录
{
pos = cdTail;//记录到最后位置
}
else
{
if(cdHead < cdTail)// 0 H T MAX
{
if()
}
else // 0 T H MAX
{
}
}
card[pos].ID = id; //卡号
WriteTimeToBuf(card[pos].time, tmr);//保存当前时间
if(pos == cdTail)
{
cdTail = (cdTail + 1) % MAX_CARD_NO;
if(cdTail == cdHead)//缓冲区回绕
{
cdHead = (cdHead + 1) % MAX_CARD_NO;
}
}
}
int main(void)
{
init();
ce_high();
cfg.addr=0;
while(1)
{
//读取卡片信息
if(DataReady)
{
DataReady = 0;
nRF2401_receiver();
addCard((uint16)RFBuf[0]*256 + RFBuf[1]);
LEDPORT ^= (1 << LED);
}
//处理串口数据
if(RTflag == 2)
{
RTflag = 3;//改变状态标志
if(FrameAnalyse(RTBuf))
{
RTflag = 0;
RTptr = 0;
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -