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

📄 pp.c.bak

📁 ICC刷卡C语言程序
💻 BAK
字号:
/*****************0XDFE4*****************************库定义*/
#include <iom8v.h>
#include <macros.h>
#include <eeprom.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=200;
		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=0;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 1;
	  }
	return 0;  
	}	   
//**************************************************************比较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 1;
	  }
	return 0;  
	}	
//***************************************************************毫秒级延时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)
    {
	switch(RxGsmAddr)
	{
	case(0)://接收停止
	  {
	  RxGsmAddr=0;return;
	  }
	case(1)://接收初始
	  {
	  RxUartAddr=1;RxGsmAddr=2;return;
	  }
	case(2)://接收是否完成
	  {
	  if(RxUartAddr) return;
	  if(CmpsRom(RxUartDbuf,RxUartLeng,"AA",2)) {RxGsmAddr=1;return;}
	  RxGsmAddr=0;return;
	  }
	}  
	}  
//***************************************************************接收卡信息42//
void RxCal(void)
    {
	switch(RxCalAddr)
	{
	case(0)://检测停止
	  {
	  RxCalAddr=0;return;
	  }
	case(1)://检测是否有卡
	  {
	  if(!(PIND&0x04)) return;
	  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=20;TxRomUart(readcal1,13);return;
	  }
	case(3)://判断读卡是否成功
	  {
	  if(RxUartAddr) return;
	  /*RxUartDbuf[0]=0x31;
	  RxUartDbuf[1]=0x32;
	  RxUartDbuf[2]=0x33;
	  RxUartDbuf[3]=0x34;*/
	  TxRamUart(RxUartDbuf,RxUartLeng);
	  if(CmpsRom(RxUartDbuf,RxUartLeng,readcal1,2)) {RxGsmAddr=1;OutToneCount=4;RxCalAddr=1;return;}
	  //if(CmpsRom(RxUartDbuf+3,RxUartLeng,readcal1+3,1)) {RxGsmAddr=1;OutToneCount=4;RxCalAddr=1;return;}
	  //RxUartAddr=1;RxUartWait=0;
	  //if(!RxUartLeng) return;
	  //TxRomUart(RxUartDbuf,RxUartLeng);
	  /*CopyRam(RxUartDbuf+4,RxUartLeng,NameBuf,11); 
	  CopyRam(RxUartDbuf+15,RxUartLeng,NameBuf,12); */
	  RxCalAddr=1;OutToneCount=2;RxUartAddr=1;//接收处理
	  return;
	  }  
	case(4):
	  {
	  /*DisplayListChar(0, 0, Name);
	  DisplayListChar1(5, 0, NameBuf);
	  DisplayListChar(0, 1, Num);
	  DisplayListChar1(4, 1, NumBuf);*/
	  RxCalAddr=1;return;
	  }  
	}
	}	
//*********************************************调用分时任务//					
void Time0(void)
    {
	while(TCNT0<(fosc/64/500));//毫秒
	TCNT0=0;
	//ScanKey();
	//RxGsm();//远程接收
	RxCal();
	}	
//***************************************************主程序//
void main(void)
{
 init_atmega();
 delay_ms(400); //启动等待,等LCM讲入工作状态
 //LCMInit(); //LCM初始化
 //delay_ms(10); //延时片刻
 //TxRomUart("jkkfda",6);
 //DisplayListChar(0, 0, table_1,12);
 RxCalAddr=2;
 OutLedAddr=1;
 //delay_ms(5);
 //DisplayListChar(0, 1, table_2);
 /*
 delay_ms(400); //启动等待,等LCM进入工作状态
 WriteCommandLCM(0x08,1); //关闭显示
 WriteCommandLCM(0x01,1); //显示清屏
 WriteCommandLCM(0x06,1); // 显示光标移动设置
 WriteCommandLCM(0x0f,1); // 显示开及光标设置,闪
 for(i=0;i<8;i++)
 {
  DisplayOneChar(i, 0, table_1[i]); //显示单个字符
 }
 //WriteCommandLCM(0x07,1); // 显示光标移动设置
 
 for(i=0;i<8;i++)
 {
  DisplayOneChar(i+8, 0, table_2[i]); //显示单个字符
 }
 WriteCommandLCM(0x0c,1); // 显示开及光标设置,不闪
 //ReadDataLCM();//测试用句无意义*/
 while(1)
 {
 Time0();
 }
}
   		

⌨️ 快捷键说明

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