📄 main.c
字号:
}
Lcd_Mask=RightMask[p];
a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2&Lcd_Mask);
lcdwd(a1);
ly+=p;
Lcd_CurrentY+=p;
}
else
{
lcdwd(a2);
ly+=8;
Lcd_CurrentY+=8;
}
//a1=*s;
a1 = pgm_read_byte(s);
}
Lcd_CurrentY=y;
}
}
//显示汉字
void displaychinesechardot(unsigned int Index)
{
unsigned char *s;
s =(unsigned char *)(ChineseCharDot + Index * CHINESECHARDOTSIZE); //赋值汉字点阵首地址(数组名+ )
if(Lcd_CurrentX > LCD_RIGHT-CHINESECHARSIZE+1)
{
Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY>LCD_BOTTOM-CHINESECHARSIZE+1)
{
Lcd_CurrentY=LCD_TOP;
}
}
putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,s);
}
//显示英文字符
void displayenglishchardot(unsigned char english)
{
unsigned char *s;
s=(unsigned char *)(EnglishCharDot+((english-32)*ENGLISHCHARDOTSIZE));
if(Lcd_CurrentX>LCD_RIGHT-ENGLISHCHARSIZE+1)
{
Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY>LCD_BOTTOM-CHINESECHARSIZE+1)
{
Lcd_CurrentY=LCD_TOP;
}
}
putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,s);
}
//信息显示
void put_char(unsigned int ucdata)
{
unsigned int i;
if(ucdata < 128)
{
displayenglishchardot((unsigned char)ucdata);
}
else
{
for(i = 0;i != (CHINESECHARNUMBER * 2);i++)
{
if(ucdata == pgm_read_word(ChineseCode + i))
{
displaychinesechardot(i);
break;
}
}
}
}
//显示汉字或英文字符
void put_str(unsigned char *s)
{
unsigned int i;
for(;*s != 0;s++)
{
i = *s;
if(*s > 127)
{
s++;
i = i * 256 + *s;
}
if(i == '\n')
{
Lcd_CurrentX = LCD_LEFT;
if(Lcd_CurrentY > LCD_BOTTOM - CHINESECHARSIZE + 1)
{
Lcd_CurrentY = LCD_TOP;
}
else
{
Lcd_CurrentY += CHINESECHARSIZE;
}
}
put_char(i);
}
}
//显示汉字或英文字符
void put_str_xy(unsigned char x,unsigned char y,unsigned char *s)
{
Lcd_CurrentX = x;
Lcd_CurrentY = y;
put_str(s);
}
void put_num(unsigned char x,unsigned char y,unsigned long num,unsigned char dec,unsigned char spc)
{
unsigned char i;
unsigned char buf1[10];
Lcd_CurrentX=x;
Lcd_CurrentY=y;
unsigned long temp = 1000000000;
unsigned char out = 0;
for(i = 0;i < 10;i++)
{
out = num / temp;
num %= temp;
temp /= 10;
// put_c(out + 48);
put_char(out + 48);
}
/*
for(i=0;i<spc;i++)
{
buf1[i]=(char)48+ num-((num/10)*10);
num=num/10;
}
for(i = spc;i != 0;i--)
{
if(dec==i)
{
put_char('.');
}
put_char(buf1[i-1]);
}
*/
}
//端口初始化
void port_init(void)
{
PORTB = 0x02;
DDRB = 0x3e;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x03;
DDRD = 0x02;
}
//定时T1初始化
void timer1_init(void)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x24;//中断允许
TCNT1H = 0xFF;
TCNT1L = 0xF8;//初始值
OCR1AH = 0xFE;
OCR1AL = 0xFF;//匹配A值
OCR1BH = 0xFE;
OCR1BL = 0xFF;//匹配B值
ICR1H = 0xFF;
ICR1L = 0xFF;//输入捕捉匹配值
TCCR1A = 0x00;
TCCR1B = 0xC5;//启动定时器
}
ISR(TIMER1_OVF_vect)
{
TCCR1B = 0x00;
PORTB |= 0x02;
put_str_xy(40,16," Ready! ");
}
//定时器T1输入捕捉中断服务程序
//#pragma interrupt_handler timer1_capt_isr:6
//void timer1_capt_isr(void)
ISR(TIMER1_CAPT_vect)
{
//timer 1 input capture event, read (int)value in ICR1 using;
// value=ICR1L; //Read low byte first (important)
// value|=(int)ICR1H << 8; //Read high byte and shift into top byte
// TIFR|=BIT(ICF1);//软件写1清中断标志
static unsigned char tr = 0;
static unsigned int bit_no = 0;
static unsigned char one_time = 0;
TCCR1B = 0;
TCNT1 = 0;
if((ICR1 > 6) || (ICR1 == 1) || (ICR1 == 4))
{
bit_no = 0;
return;
}
if(test_end == 0)
{
if(tr == 1)
{
// put_c(ICR1L);
bit_array[bit_no] = 1;
bit_no++;
if(bit_no >= 255)
{
test_end = 1;
}
// put_c('1');
if(ICR1L > 4)
{
bit_array[bit_no] = 1;
bit_no++;
if(bit_no >= 255)
{
test_end = 1;
}
// put_c('1');
}
// TCCR1B = 0xC5; //上升沿触发
TCCR1B = 0x85; //下降沿触发
tr = 0;
}
else
{
// bit_array[bit_no] = '0';
bit_array[bit_no] = 0;
bit_no++;
if(bit_no >= 255)
{
test_end = 1;
}
// put_c('0');
if(ICR1L > 4)
{
// bit_array[bit_no] = '0';
bit_array[bit_no] = 0;
bit_no++;
if(bit_no >= 255)
{
test_end = 1;
}
// put_c('0');
}
// TCCR1B = 0x85; //下降沿触发
TCCR1B = 0xC5; //上升沿触发
tr = 1;
}
}
}
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式
TCNT2 = 0x00;//初始值
OCR2 = 0x2B;//匹配值
TIMSK |= 0x00;//中断允许
TCCR2 = 0x19;//启动定时器
}
//串口通信初始化
void usart_init(void)
{
UCSRB = 0x00;//禁止中断
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x47;
UBRRH = 0x00;
UCSRB = 0x98;
}
void put_c(unsigned char dat)
{
while(!(UCSRA & (1 << UDRE)));
UDR = dat;
}
void put_s(unsigned char *dat,unsigned char enter)
{
while(*dat)
{
put_c(*dat);
dat++;
}
if(enter == 1)
{
put_c(0x0d);
put_c(0x0a);
}
}
void put_long(unsigned long dat)
{
unsigned long temp = 1000000000;
unsigned char i = 0;
unsigned char out = 0;
for(i = 0;i < 10;i++)
{
out = dat / temp;
dat %= temp;
temp /= 10;
put_c(out + 48);
}
// out = dat % temp;
// put_c(out + 48);
}
void init_devices(void)
{
cli(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
timer1_init();
timer2_init();
// usart_init();
lcdreset();
sei();//开全局中断
}
//主函数
int main(void)
{
unsigned char i = 0;
init_devices();
lcdfill(0xff);
delay_ms(250);
lcdfill(0x00); //清屏
// put_str_xy(0,0,"RFID CardReader");
put_str_xy(21,0,"RFID读卡器");
// put_str_xy(0,16,"NO.");
put_str_xy(0,16,"卡号:");
// put_num(0,16,123456789,0,10);
put_s("RFID Card Reader",1);
while(1)
{
if(test_end == 1)
{
/*
cli();
i = 0;
for(i = 0;i < 255;i++)
{
put_c(bit_array[i] + 48);
}
put_c(bit_array[i] *48);
put_s("end.",1);
put_s("",1);*/
i = Manchester_decode();
if(i != 0)
{
for(i = 0;i < 255;i++)
{
put_c(bit_array[i] + 48);
}
put_c(bit_array[i] *48);
put_s("end.",1);
put_s("",1);
}
test_end = 0;
// sei();
}
}
return 0;
}
unsigned char Manchester_decode(void)
{
unsigned char i,j,k;
unsigned char col_parity = 0;
unsigned char row_parity = 0;
unsigned char temp = 0;
unsigned char start_data[20] = {1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
unsigned long rfid = 0;
for(i = 0;i < 128;i++)
{
for(j = 0;j < 20;j++)
{
if(bit_array[i+j] != start_data[j])
{
break;
}
}
if(j == 20)
{
put_s("",1);
put_s("Find RFID Card.",1);
i += 20;
for(k = 0;k < 11;k++)
{
row_parity = 0;
// 读出五位数据
temp = 0;
for(j = 0;j < 5;j++)
{
temp <<= 1;
if((bit_array[i] == 0) && (bit_array[i+1] == 1))
{
temp |= 0x01;
if(j < 4)
{
row_parity++;
}
}
else if((bit_array[i] == 1) && (bit_array[i+1] == 0))
{
temp &= 0xfe;
}
else
{
put_s("解码错误。",1);
PORTB |= 0x02;
return(decode_error);
}
i += 2;
}
id_code[k] = (temp >> 1);
temp &= 0x01;
row_parity %= 2;
if(k < 10)
{
if(row_parity != temp)
{
put_s("奇偶校验错误。",1);
put_s("k=",0);
put_c(k + 0x30);
put_s("",1);
put_s("id_code[k]=",0);
put_c(id_code[k] + 0x30);
put_s("",1);
put_s("row_parity=",0);
put_c(row_parity + 0x30);
put_s("",1);
put_s("temp=",0);
put_c(temp + 0x30);
put_s("",1);
PORTB |= 0x02;
return(odd_parity_error);
}
}
else
{
if(temp != 0)
{
put_s("最后一位错误。",1);
put_s("temp=",0);
put_c(temp + 0x30);
put_s("",1);
return(last_bit_error);
}
}
}
col_parity = 0;
for(i = 0;i < 4;i++)
{
temp = 0;
col_parity >>= 1;
for(j = 0;j < 10;j++)
{
if((id_code[j] & (1 << i)) == (1 << i))
{
temp++;
}
}
temp %= 2;
if(temp == 1)
{
col_parity |= 0x08;
}
}
if(col_parity == id_code[10])
{
// put_str_xy(0,0,"OK");
if(k == 11)
{
put_s("ID Card :",0);
for(j = 2;j < 10;j++)
{
/*
if(id_code[j] < 10)
{
put_c(id_code[j] + 0x30);
}
else
{
put_c(id_code[j] + 0x37);
}*/
rfid += (((unsigned long)(id_code[j])) << (4 * (9 - j)));
}
}
// put_long(rfid);
put_num(40,16,rfid,0,10);
return(good);
}
else
{
// put_str_xy(0,0,"NG");
return(col_parity_error);
}
}
}
if(i == 128)
{
put_s("找不到开始信息.",1);
return(nofind_start);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -