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

📄 main.c

📁 读卡器 fm1702实现收发 zlg7290实现按键与显示控制
💻 C
字号:
#include "I2C.h"
#include "ZLG7290.h"

uchar code  duanma[10] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; // 0-9段码
uchar data  add1[4]={0,0,0,0};      //  加数一
uchar data  add2[4]={0,0,0,0};  	//  加数二   且和值存放在这里面
uchar data  money[5]={1,9,9,0,0};   //  卡里的钱数
uchar data  jw=2;       			//   右边第几个显示
bit Clear=0;  
bit Flag=0;            				 //小数点按键标志 0 上次没按       1  上次按了
bit Add=0;           				 //加号键标志     0 上次没按加键   1  上次按了加键
bit Ka_lab=0;        				 //放卡取卡标志   0 没放卡          1   放上卡
void  Clearall(void); 				// 全清除显示
void Reset(void)       				// 右边四位显示 0.00
{
  ZLG7290_cmd(0x64,0x1F);
  Delay(1);
  ZLG7290_cmd(0x65,0x80);
  Delay(1);
  ZLG7290_cmd(0x66,0x00);
  Delay(1);
  ZLG7290_cmd(0x67,0x00);
  Delay(1);
}

void KeyFun(uchar num,uchar *d)  //重编键值 且执行功能键
{
  uint data i,j;
  switch(num)
  {
    case 1:  {*d=0;break;}
  	case 2:  {*d=1;break;}
  	case 10: {*d=2;break;}
  	case 6:  {*d=3;break;}
  	case 3:  {*d=4;break;}
  	case 11: {*d=5;break;}
  	case 7:  {*d=6;break;}
  	case 4:  {*d=7;break;}
  	case 12: {*d=8;break;}
  	case 8:  {*d=9;break;}                   //按键0-9
  
  	case 9:  {*d=10;Flag=1;break;}            //小数点按键
 
  	case 5:                                   // " + "号键
  	case 13:                                  // " = "号键  确认功能
	{
	  *d=12;
	  add1[3]+=add2[3];
      i=add1[3]/10;j=i;
	  i=add1[3]%10;
	  add2[3]=i;

	  add1[2]=add1[2]+add2[2]+j;
      i=add1[2]/10;j=i;
	  i=add1[2]%10;
	  add2[2]=i;

	  add1[1]=add1[1]+add2[1]+j;
      i=add1[1]/10;j=i;
	  i=add1[1]%10;
	  add2[1]=i;

	  add1[0]=add1[0]+add2[0]+j;
      i=add1[0]/10;j=i;
	  i=add1[0]%10;
	  add2[0]=i;

      add1[0]=add1[1]=add1[2]=add1[3]=0;     // 加数一清零

	  if(add2[0])
	  ZLG7290_WriteReg(0x14,duanma[add2[0]]);        
	  Delay(1);
	  ZLG7290_cmd(0x65,0x80+add2[1]);
      Delay(1);
	  ZLG7290_WriteReg(0x16,duanma[add2[2]]);
	  Delay(1);
	  ZLG7290_WriteReg(0x17,duanma[add2[3]]);
	  Delay(1);    									//显示和值
	  
	  Flag=0;jw=2;Add=1;break;
	}
 
  	case 14: 
	{
		*d=13;
		Reset();
		for(i=0;i<4;i++)
		{
			add1[i]=add2[i]=0;
		}
		Flag=0;
		Add=0;
		jw=2;
		D1=1;
		Clear=1;
		break;
	} // 清除键 所有标志复位
 
  	case 15:                                                                   // 确认键 饭卡减值               
    {
		*d=14;
		i=money[1]*1000+money[2]*100+money[3]*10+money[4];                    
		j=add2[0]*1000+add2[1]*100+add2[2]*10+add2[3];
		if(money[0])
		{
			if(i>=j)
			{
				money[1]=(i-j)/1000;
				money[2]=((i-j)%1000)/100;
				money[3]=((i-j)%100)/10;
				money[4]=(i-j)%10;
			}
			else
			{
				money[0]=money[0]-1;
				money[1]=(i+10000-j)/1000;
				money[2]=((i+10000-j)%1000)/100;
				money[3]=((i+10000-j)%100)/10;
				money[4]=(i+10000-j)%10;
			}
			if(money[0])
			{
				ZLG7290_WriteReg(0x10,duanma[money[0]]);
				Delay(1);
				ZLG7290_WriteReg(0x11,duanma[money[1]]);        
	  			Delay(1);
	  			ZLG7290_cmd(0x62,0x80+money[2]);
      			Delay(1);
	  			ZLG7290_WriteReg(0x13,duanma[money[3]]);
				Delay(1);
			}
			else if(money[1])
		    {
				ZLG7290_WriteReg(0x10,duanma[money[1]]);        
	  			Delay(1);
	  			ZLG7290_cmd(0x61,0x80+money[2]);
      			Delay(1);
	  			ZLG7290_WriteReg(0x12,duanma[money[3]]);
				Delay(1);
				ZLG7290_WriteReg(0x13,duanma[money[4]]);
      			Delay(1);	
			}
			else
			{
				ZLG7290_cmd(0x60,0x1F);
				Delay(1);
				ZLG7290_cmd(0x61,0x80+money[2]);
				Delay(1);
				ZLG7290_WriteReg(0x12,duanma[money[3]]);        
      			Delay(1);
	  			ZLG7290_WriteReg(0x13,duanma[money[4]]);
				Delay(1);
			}
		}
		else if(i>=j)
		{
			money[1]=(i-j)/1000;
			money[2]=((i-j)%1000)/100;
			money[3]=((i-j)%100)/10;
			money[4]=(i-j)%10;
        	if(money[1])
			{
				ZLG7290_WriteReg(0x10,duanma[money[1]]);        
	  			Delay(1);
	  			ZLG7290_cmd(0x61,0x80+money[2]);
      			Delay(1);
	  			ZLG7290_WriteReg(0x12,duanma[money[3]]);
				Delay(1);
				ZLG7290_WriteReg(0x13,duanma[money[4]]);
      			Delay(1);	
			}
			else
			{
				ZLG7290_cmd(0x60,0x1F);
				Delay(1);
				ZLG7290_cmd(0x61,0x80+money[2]);        
	  			Delay(1);
	  			ZLG7290_WriteReg(0x12,duanma[money[3]]);
      			Delay(1);
	  			ZLG7290_WriteReg(0x13,duanma[money[4]]);
				Delay(1);
			}
		}
		else D1=0;                              // 卡值不足 二极管1亮
		break;
	}
 
  	case 16:                                                         // 放卡显示卡值 取卡退出
    {
       *d=15;
	   if(Ka_lab==0)                     // 放卡
	   {	
	   	 for(i=0;i<4;i++)
	     {
		   ZLG7290_cmd(0x60+i,0x1F);
		   Delay(1);	   
	     }
		 if(money[0])
		 {
			ZLG7290_WriteReg(0x10,duanma[money[0]]);
			Delay(1);
			ZLG7290_WriteReg(0x11,duanma[money[1]]);        
	  		Delay(1);
	  		ZLG7290_cmd(0x62,0x80+money[2]);
      		Delay(1);
	  		ZLG7290_WriteReg(0x13,duanma[money[3]]);
			Delay(1);
		 }
		 else if(money[1])
		 {
			ZLG7290_WriteReg(0x10,duanma[money[1]]);        
	  		Delay(1);
	  		ZLG7290_cmd(0x61,0x80+money[2]);
      		Delay(1);
	  		ZLG7290_WriteReg(0x12,duanma[money[3]]);
			Delay(1);
			ZLG7290_WriteReg(0x13,duanma[money[4]]);
        	Delay(1);			
		 }
		 else
		 {
			ZLG7290_cmd(0x60,0x1F);
			Delay(1);
			ZLG7290_cmd(0x61,0x80+money[2]);
			Delay(1);
			ZLG7290_WriteReg(0x12,duanma[money[3]]);        
      		Delay(1);
	  		ZLG7290_WriteReg(0x13,duanma[money[4]]);
			Delay(1);
		 }
		 Ka_lab=~Ka_lab;	 	 		
 	     break;
	   }
       else                        // 取卡清除显示
	   Ka_lab=~Ka_lab;      
	   for(i=0;i<4;i++)
	   {
		   ZLG7290_cmd(0x60+i,0x1F);
		   Delay(1);	   
	   }
     }
    default: break;
  }
}

void int1() interrupt 2 using 0
{
   	unsigned char data KeyValue,p;
	//读取键值
    Delay(1);
	KeyValue=ZLG7290_ReadReg(ZLG7290_Key);
	Delay(1);
   
	//显示键值
	KeyFun(KeyValue,&p);
	if(p<10)
	{
      if(Add==1)
	  {
		Reset();
		Add=0;
		add1[0]=p;
		ZLG7290_cmd(0x65,0x80+add1[1]);
	  }   // 上次按的加键 先复位显示 加标志清除
      else if(Flag==1)                  // 上两次中按过小数点  
	  {
	    if(jw<5)
	    {
	      add1[jw++]=p;
	      ZLG7290_WriteReg(0x13+jw,duanma[p]);
	    }
	  }
	  else if(Clear)
	  {
		add1[0]=p;
		ZLG7290_cmd(0x65,0x80+add1[1]);
		Clear=0;
	  }
	  else 
	  {
	    add1[0]=add1[1];
	    add1[1]=p;
	    if(add1[0]!=0)
	    ZLG7290_WriteReg(ZLG7290_DpRam+4,duanma[add1[0]]);
	    Delay(5);
	    ZLG7290_cmd(0x65,0x80+add1[1]);
       }	
     }	
}

void main(void)
{
   uchar data  i=0;
   EA = 0;
   EX1 = 1; 
   EA = 1;                               //开中断1  
I2C_Wait();
I2C_Wait();
 Delay(1);
 Delay(1);
   Clearall();               
   Reset();                  
   ZLG7290_cmd(0x60,0x88);              //第一位显示8.  
   Delay(5);
 //  PCON |= 0x01;                       //使CPU 进入空闲状态,任一中断可唤醒   
   while(1)
   {

     if(Ka_lab==0)                           // 没卡时循环显示
	 {	
     	if(i<3)
	 	{
       		i++;
	   		ZLG7290_cmd(0x60+i-1,0x1F);
	   		Delay(1);
       		ZLG7290_cmd(0x60+i,0x88);
	   		Delay(2);
	 	}
     	else 
     	{
	   		ZLG7290_cmd(0x63,0x1F);   
	   		Delay(1);
       		ZLG7290_cmd(0x60,0x88);
       		Delay(2);
       		i=0; 
	 	}
	 }
	 Delay(10);                       //有卡时
	}
}

⌨️ 快捷键说明

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