⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pp.c

📁 ICC刷卡C语言程序
💻 C
字号:
/*****************0XDFE4*****************************库定义*/
#include <iom8v.h>
#include <macros.h>
#include "define.h"
//*******************************************************************写数据11//
void WriteDataLCM(unsigned char WDLCM)
{
 ReadStatusLCM(); //检测忙
 PORTB = WDLCM;
 SET_LCD_RS;CLR_LCD_RW;SET_LCD_RS;CLR_LCD_RW;
 CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;
 SET_LCD_E;SET_LCD_E;
}
//********************************************************************写指令12//
void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC为0时忽略忙检测
{
 if (BuysC) ReadStatusLCM(); //根据需要检测忙
 PORTB = WCLCM;
 CLR_LCD_RS;CLR_LCD_RW; 
 CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;
 SET_LCD_E;SET_LCD_E; 
}
//*******************************************************************读状态13//
unsigned char ReadStatusLCM(void)
{
 DDRB=0x00; //输入
 CLR_LCD_RS;SET_LCD_RW;
 CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;
 SET_LCD_E;SET_LCD_E;
 while (PINB&0x80); //检测忙信号
 DDRB=0xff;//变回输出
 return(PINB);
}
//*************************************************************显示一个字符14//
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
 Y &= 0x1; X &= 0xF;
 if (Y) X |= 0x40;
 X |= 0x80;
 WriteCommandLCM(X, 1);
 WriteDataLCM(DData);
 WriteCommandLCM(X, 1);
}
//************************************************************显示ROM字符串15//
void DisplayListChar(unsigned char X, unsigned char Y, const unsigned char *DData,unsigned char Leng)
{
 unsigned char j;
 Y &= 0x01;X &= 0x0F;
 for(j=0;j<Leng;X++,j++)
  {
  if(X<=0xf)DisplayOneChar(X,Y,DData[j]);
  }
}
//************************************************************显示RAM字符串16//
void DisplayListChar1(unsigned char X, unsigned char Y, unsigned char *DData,unsigned char Leng)
{
 unsigned char j;
 Y &= 0x01;X &= 0x0F;
 for(j=0;j<Leng;X++,j++)
  {
  if(X<=0xf)DisplayOneChar(X,Y,DData[j]);
  }
}		
//****************************************************************LCM初始化17//
void LCMInit(void) 
{
 PORTB = 0;
 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 delay_ms(5); 
 WriteCommandLCM(0x38,0);
 delay_ms(5); 
 WriteCommandLCM(0x38,0);
 delay_ms(5); 
 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 WriteCommandLCM(0x08,1); //关闭显示
 WriteCommandLCM(0x01,1); //显示清屏
 WriteCommandLCM(0x06,1); // 显示光标移动设置
 WriteCommandLCM(0x0C,1); // 显示开及光标设置
}

//***************************************************中断任务//
//*************************************************************接收串口数据21//
void RxUart(void)
    {
	switch(RxUartAddr)
	{
	case(0)://接收关闭
	  {
	  RxUartTemp=UDR;RxUartAddr=0;return;
	  }
	case(1)://接收初始
	  {
	  RxUartLeng=0;RxUartDely=200;RxUartAddr=2;return;
	  }
	case(2)://接收处理
	  {
	  if((UCSRA)&(1<<RXC))
	    {
		RxUartTemp=UDR;RxUartWait=2;RxUartDely=100;
		if(RxUartLeng>=250) return;
		RxUartDbuf[RxUartLeng++]=RxUartTemp;		
	    return;
		}
	  else
	    {
		if(!RxUartWait) return;		
		if(--RxUartDely) return;
		RxUartDely=200;
		if(--RxUartWait) return;
		RxUartAddr=0;return;
		}
	  }
    }		
	}
//***************************************************************输出三色灯22//
void OutLed(void)
    {
	switch(OutLedAddr)
	{
	case(0)://停止闪烁
	  {
	  OutLedAddr=0;return;
	  }
	case(1)://绿灯闪
	  {
	  if(++OutLedDely<1000) return;
	  OutLedDely=0;PORTC|=0x08;PORTC^=0x06;return;
	  }
    case(2)://红灯闪
	  {
	  if(++OutLedDely<1000) return;
	  OutLedDely=0;PORTC|=0x06;PORTC^=0x08;return;
	  }
	case(3)://关灯
	  {OutLedDely=0;PORTC|=0x0C;return;}
	}
	}  
//***************************************************************输出提示声23//
void OutTone(void)
    {	
	switch(OutToneAddr)
	{
	case(0)://关闭
	  {
	  OutToneAddr=0;return;
	  }
	case(1)://判断是否开提示声
	  {
	  if(!OutToneCount) return;
	  OutToneDely=0;OutToneAddr=2;return;
	  }
	case(2):
	  {
	  if(++OutToneDely<400) return;
	  if(!(--OutToneCount)) {PORTC|=0x01;OutToneCount=0;OutToneAddr=1;return;}
	  OutToneDely=0;PORTC^=0x01;return;
	  }
	}
	}  
#pragma interrupt_handler Time2:iv_TIMER2_COMP			
//****************************************************************调用中断任务//	      	
void Time2(void)
    {
	RxUart();
	OutLed();
	OutTone();
	}		 
//****************************************************单时任务//	
//********************************************************发送ROM数据到串口31//
void TxRomUart(const unsigned char *data,unsigned int leng)
    {
	while(leng)
	  {
	  while(!((UCSRA)&(1<<UDRE)));
	  UDR=*data;data++;leng--;
	  }  
	}  	
//********************************************************发送RAM数据到串口32//
void TxRamUart(unsigned char *data,unsigned int leng)
    {
	while(leng)
	  {
	  while(!((UCSRA)&(1<<UDRE)));
	  UDR=*data;data++;leng--;
	  }  
	}  					
//**************************************************************拷贝ROM数据33//
unsigned char CopyRom(const unsigned char *data1,unsigned char leng1,unsigned char *data2,unsigned char leng2)
    {
    while(leng1)
	  { 
	  *data2=*data1;data2++;leng2--;data1++;leng1--;
	  if(!leng2) return 1;
	  }
	return 0;
	}  	
//**************************************************************拷贝RAM数据34//
unsigned char CopyRam(unsigned char *data1,unsigned char leng1,unsigned char *data2,unsigned char leng2)
    {
    while(leng1)
	  { 
	  *data2=*data1;data2++;leng2--;data1++;leng1--;
	  if(!leng2) return 1;
	  }
	return 0;
	} 
//**************************************************************比较ROM数据35//
unsigned char CmpsRom(unsigned char *data1,unsigned char leng1,const unsigned char *data2,unsigned char leng2)
    {
	while(leng1)
	  {
	  if(*data1!=*data2) return 1;
	  data1++;data2++;leng1--;leng2--;
	  if(!leng2) return 0;
	  }
	return 1;  
	}	   
//**************************************************************比较RAM数据36//
unsigned char CmpsRam(unsigned char *data1,unsigned char leng1,unsigned char *data2,unsigned char leng2)
    {
	while(leng1)
	  {
	  if(*data1!=*data2) return 1;
	  data1++;data2++;leng1--;leng2--;
	  if(!leng2) return 0;
	  }
	return 1;  
	}	 	
//***************************************************************毫秒级延时37//   
void delay_ms(unsigned int time)
    {
	while(time)
	  {
	  while(TCNT0<(fosc/64/1000));
	  TCNT0=0;
	  time--;	
	  }	
    }		   		 	
//************************************************************ATMEGA8初始化38//
void init_atmega(void)
    {
	SFIOR&=(~(1<<PUD));//上拉SFIOR
	DDRB=0xFF;	
	DDRD=0xF8;//,PD7(E),PD6(RW),PD5(RS),PD4(SPS),PD2(ICC),PD1(TXD),PD0(RXD);
	PORTD=0xFB;
	DDRC=0x0F;//PC4,PC3(REN),PC2(GREEN),PC0(BUZZER)
	PORTC=0x01;
	UCSRB=(1<<RXEN)|(1<<TXEN);
    UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	UBRRH=(fosc/16/(baud+1))/256;
	UBRRL=(fosc/16/(baud+1))%256;
	TCCR2=0x0a;
	TCNT2=0x00;
	OCR2=fosc/8/2000;//500us
	TIMSK=1<<OCIE2;
	TCCR0=(1<<CS01)|(1<<CS00);//64分频
	TCNT0=0;
	SEI();
	}
//*****************************************************************接收远程41//
void RxGsm(void)
    {
	unsigned char i;
	switch(RxGsmAddr)
	{
	case(0)://接收停止
	  {
	  RxGsmAddr=0;return;
	  }
	case(1)://接收初始
	  {
	  if(!(PIND&0x04)&&(RxCalAddr==1))
	  {RxGsmAddr=2;RxUartWait=0;RxUartAddr=1;return;}
	  else return;
	  }
	case(2)://接收是否完成
	  {
	  if(!(PIND&0x04)&&(RxCalAddr==1))
	   {
	   if(RxUartAddr) return;	   
	   if(CmpsRom(RxUartDbuf,RxUartLeng,"DD",2)) {RxGsmAddr=1;OutToneCount=4;return;}//DD 
	   OutToneCount=2;
	   CopyRam(RxUartDbuf+2,RxUartLeng,writecaltemp,16);//写信息到卡
	   checktemp=0;
	   for(i=2;i<=11;i++){checktemp^=writecal1[i];}
       for(i=0;i<16;i++){checktemp^=writecaltemp[i];} 
	   RxGsmAddr=3;RxUartAddr=1;RxUartWait=20;
	   TxRomUart(writecal1,12);TxRamUart(writecaltemp,16);TxRamUart(&checktemp,1);
	   return;
	   }
	   else {RxGsmAddr=1;return;}
	  }
	case(3)://判断写卡是否成功
	  {
	  if(RxUartAddr) return;
	  if(CmpsRom(RxUartDbuf,RxUartLeng,writecal1,2)) {RxCalAddr=1;RxGsmAddr=1;OutToneCount=4;TxRomUart("EEWriteERROR ",13);TxRomUart("                ",16);return;}
	  if(CmpsRom(RxUartDbuf+3,RxUartLeng,writecal1+3,1)) {RxCalAddr=1;RxGsmAddr=1;OutToneCount=4;TxRomUart("EEWriteERROR ",13);TxRomUart("                ",16);return;}
	  TxRomUart("EEWrite   OK ",13);//EE
	  TxRomUart("                ",16);
	  RxGsmAddr=1;return;
	  }
	}  
	}  
//***************************************************************接收卡信息42//
void RxCal(void)
    {
	switch(RxCalAddr)
	{
	case(0)://检测停止
	  {
	  RxCalAddr=0;return;
	  }
	case(1)://检测卡是否还在
	  {
	  if(!(PIND&0x04)) return;
	  TxRomUart("EE           ",13);//GG
	  TxRomUart("                ",16);
	  WriteCommandLCM(0x01,1); //清屏
	  DisplayListChar(0, 0, table_1,12);
	  RxCalAddr=2;RxCalDely=0;return;
	  }
	case(2)://检测100ms去抖动读卡
	  {
	  if(PIND&0x04) RxCalDely=0;
	  if(++RxCalDely<100) {OutLedAddr=1;return;} 
	  RxCalAddr=3;RxUartAddr=1;OutLedAddr=2;RxUartWait=0;TxRomUart(readcal1,13);TxRomUart("                ",16);
	  return;
	  }
	case(3)://判断读卡是否成功
	  {
	  if(RxUartAddr) return;
	  if(CmpsRom(RxUartDbuf,RxUartLeng,readcal1,2)) {TxRomUart("EERead ERROR ",13);TxRomUart("                ",16);RxCalAddr=1;OutToneCount=4;return;}//EE
	  if(CmpsRom(RxUartDbuf+3,RxUartLeng,readcal1+3,1)) {TxRomUart("EERead ERROR ",13);TxRomUart("                ",16);RxCalAddr=1;OutToneCount=4;return;}//EE
	  CopyRam(RxUartDbuf+4,RxUartLeng,NameBuf,7); 
	  CopyRam(RxUartDbuf+11,RxUartLeng,NumBuf,9);
	  TxRomUart("DD",2);//DD
	  TxRamUart(NameBuf,7);
	  //TxRomUart("CC",2);//CC
	  TxRamUart(NumBuf,9);	  
	  TxRomUart("Read    OK ",11);//EE
	  RxCalAddr=4;OutToneCount=2;RxUartAddr=1;//接收处理
	  return;
	  }  
	case(4):
	  {
	  DisplayListChar(0, 0, Name,5);
	  DisplayListChar1(5, 0, NameBuf,7);
	  DisplayListChar(0, 1, Num,4);
	  DisplayListChar1(4, 1, NumBuf,9);
	  RxCalAddr=1;return;
	  }  
	}
	}	
//*********************************************调用分时任务//					
void Time0(void)
    {
	while(TCNT0<(fosc/64/500));//毫秒
	TCNT0=0;
	RxCal();
	RxGsm();//远程接收
	
	}	
//***************************************************主程序//
void main(void)
{
 unsigned char i,j;
 init_atmega();
 delay_ms(400); //启动等待,等LCM讲入工作状态
 LCMInit(); //LCM初始化
 delay_ms(10); //延时片刻
 DisplayListChar(0, 0, table_1,12);
 RxCalAddr=2;
 RxGsmAddr=1;
 OutLedAddr=1;
 OutToneAddr=1;
 while(1)
 {
 Time0();
 }
}
   		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -