user-0 提问: RFID考试问题！！！明天补考了！！求大神！！！！

回复:
user: user-1
content: 在读IC卡号的卡号时，需要提供密匙吗？经过哪些过程就可以读出卡号。 IC卡需要秘钥，目前市面上最流行的Mifare1卡。 可以去看下潘春伟的博客，讲的挺详细的。 http://blog.sina.com.cn/s/articlelist_2664458157_0_1.html

user: user-1
content: 创业公司不管是女的还是男的去，都会让你酸爽的，会让你觉得生无可恋。 上了规模的公司，男的女的感觉区别不是太大。

user: user-1
content: 我也不知道女性适不适合编程，反正我公司女性程序员有差不多7个

user: user-2
content: 懒得动手的人和拖延症患者不适合编程。 跟性别无关。

user: user-0
content: block_read(  INT8U block_read( INT8U KeyBlockAddr ,INT8U *Money )		   // 参数“1”和“Money”指要读的是块 1 和将信息存放在 Money 中。 { 	INT8U CardReadBuf[16],i; 	INT8U CardKeyABuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};		//   白卡默认密码是 6 个 0xff。     /*	if( KeyBlockAddr % 4 == 3 )	//  这里锁定密码块 	{ 		psUartDataRevSend->UartErrCode = ERROR_BLOCK_ADDR; 		memset( &psUartDataRevSend->UartDataBuf[1], 0x00, 16 ); 		bWarn = 1; 		return FALSE;	 	}   */  	if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡，返回卡片类型 2字节	 	{ 		if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡，返回卡片类型 2字节	 		{ 			return FALSE; 		}	 	}  	if( PcdAnticoll( Card_SN ) != MI_OK ) //防冲撞，返回卡的序列号 4字节  	{ 		bWarn = 1; 		return FALSE;	 	}  	if( PcdSelect( Card_SN ) != MI_OK )//选卡 	{  		bWarn = 1; 		return FALSE; 	}   	if( PcdAuthState( PICC_AUTHENT1A, KeyBlockAddr, CardKeyABuf, Card_SN ) != MI_OK )// 验证密码 	{ 		bWarn = 1; 		return FALSE;	 	}  	if( PcdRead( KeyBlockAddr, CardReadBuf ) != MI_OK )// 读卡	 读块 1 数据。16 字节数据存放在 CardReadBuf[16]中。 	{ 		bWarn = 1; 		return FALSE; 	}     	send_bytes(CardReadBuf,16);	 //串口发送数据  	for(i=0;i<3;i++)			//将有用的前 3 个字节数据取出来放在 Money[3]里面。  	Money[i]=CardReadBuf[i];  //用于写操作  	bPass = 1; 			 	return TRUE; }			   block_write( INT8U block_write(  INT8U KeyBlockAddr,INT16U Money_1,INT8U Money_2 )	             //参数“1”、“Money_1”和“Money_2”指要写的是块 1 和内容是金额             //的整数（Money_1）和小数（Money_2）。 { 	INT8U CardWriteBuf[16]; 	INT8U CardKeyABuf[6]={0xff,0xff,0xff,0xff,0xff,0xff}; 	CardWriteBuf[0]=  Money_1 /256;								 	//	将数据转换成16进制放在缓冲区CardWriteBuf[16]的前3字节里面内，                    //准备用来写进卡。 	CardWriteBuf[1]=  Money_1 %256; 	CardWriteBuf[2]=  Money_2 ; //<9的数 	if( KeyBlockAddr % 4 == 3 )	 //	 这里锁定密码块,不让修改	不让修改各个扇区的 03 块（密码块）。 	{ 		bWarn = 1; 		return FALSE;	 	} 	 	if( PcdRequest( PICC_REQIDL,Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡，返回卡片类型 2字节	 	{ 		if( PcdRequest( PICC_REQIDL,Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡，返回卡片类型 2字节	 		{ 			return FALSE; 		}	 	}  	if( PcdAnticoll( Card_SN ) != MI_OK ) //防冲撞，返回卡的序列号 4字节  	{ 		bWarn = 1; 		return FALSE;	 	}  	if( PcdSelect( Card_SN ) != MI_OK )//选卡 	{  		bWarn = 1; 		return FALSE; 	}   	if( PcdAuthState( PICC_AUTHENT1A, KeyBlockAddr, CardKeyABuf, Card_SN ) != MI_OK )// 验证密码 	{ 		bWarn = 1; 		return FALSE;	 	}  	if( PcdWrite( KeyBlockAddr, CardWriteBuf ) != MI_OK )//写卡	 将 CardWriteBuf[16]写进 IC 卡，实际只用到前 3 字节。 	{ 		bWarn = 1; 		return FALSE; 	} 	bPass = 1; 	 	return TRUE;    一个一个按键打的  辣么多！！

user: user-0
content: 功能选择函数 void ctrl_process( void ) {		      INT8U           back_count=0,//退格记录          key_value=16, 		 Money_2=0,          Money_select=1, 	//整数 		 Money_BUF[7]={'0','0','0','0','0','.','0'}, //5位整数+1个小数	  定义显示缓存    		 Money[3], 		 statesbuf;     INT16U Money_1=0;    	    if(states!=statesbuf)  //状态改变，清屏	   当状态改变，也就是功能改变时，清屏 	  { 	    display_clear_line(2); 	    display_clear_line(3); 	    statesbuf=states; 	  }      switch(states) 	{        case 0:	       //余额显示		   状态“0”，进入余额显示状态。  		  	  display(1,0,1); 			  if( block_read(1,Money)) /*	执行 block_read(1,Money)函数， 			                                这里我们稍后会详细说明一下这个函数， 			                                现在先知道这个函数的功能，那就是读取第 1 块数据， 			                             	将前3 个字节存放在 Money[3]数组中，我们将前 2 个字节划分为电子钱包金额的整数， 		                            		后 1 字节作为小数。所以最大的金额为：65535.9 元。*/	    			  { 			    Money_1=Money[0]*256+Money[1];		  //按前面说的把 3 字节数据分离，得到余额的整数和小数部分。  				Money_2=Money[2];  				Money_BUF[0]=Money_1/10000+'0';		 //将余额数据分解，并用于 LCD 显示。这样余额就被显示到 LCD 上面 	            Money_BUF[1]=Money_1%10000/1000+'0'; 	            Money_BUF[2]=Money_1%1000/100+'0'; 	       		Money_BUF[3]=Money_1%100/10+'0'; 				Money_BUF[4]=Money_1%10+'0'; 				Money_BUF[5]='.'; 				Money_BUF[6]=Money_2+'0';      	     			display2(3,0,Money_BUF,7);	  				display2(3,4,"元",2); 				display(2,0,5);	 //成功 			  } 			 		//	else 	 display(2,0,6);   //失败 			 			  break;          case 1:							   //状态“1”，进入消费程序。  		       display(1,0,2);    //消费 			   display2(3,0,Money_BUF,7);	  	           display2(3,4,"元",2);                	while(1) 				{ 				  key_value=key_scan();  				  if(key_value==12)   //上一功能 				   {  				     states--; 	                 return; 					}  				  if(key_value==13)	  //下一功能 				  { 				   states++; 				   return; 				  }	 				   				  if(key_value==15)	  //确认键		 确认键被按下，通常是完成数据的输入后再按确认键，此时 IC 卡应提前放到模块上。  				  {			 				 				   if(block_read(1,Money))	  //我们先读出 IC 卡的余额，block_read(1,Money)。 				   { 				   if((Money_1 > (Money[0]*256+Money[1]))||((Money_1 == (Money[0]*256+Money[1])) && Money_2 > Money[2])) 				   /*   余额小于消费额  这里分了 3 种情况： 				      1.IC 卡余额小于消费额，则显示扣费失败  				      2.IC 卡余额整数大于消费额，小数小于消费额，则需要借位。 					  3. IC 卡 余额整数和小数部分均大于消费额，直接做减法。  */ 				     { 					   display(2,0,6); 					   					 } 				   else  				   { 				     if(Money_2 > Money[2])//需要借位 					   { 					      Money_1= (Money[0]*256+Money[1] )-Money_1-1; 						  Money_2=Money[2]+10 -Money_2 ; 					   } 				   	 else  					   { 					      Money_1=(Money[0]*256+Money[1] )-Money_1; 						  Money_2=Money[2]-Money_2;	   					   } 					 block_write(1,Money_1,Money_2 );//写卡		执行写卡操作，将原来余额减去消费额后的新余额写进 IC 卡块 1 里 						 //显示余额						    					Money_BUF[0]=Money_1/10000+'0';		   //在 LCD 上面显示新的余额。                   	Money_BUF[1]=Money_1%10000/1000+'0';  	                Money_BUF[2]=Money_1%1000/100+'0';                     Money_BUF[3]=Money_1%100/10+'0';                     Money_BUF[4]=Money_1%10+'0';                     Money_BUF[5]='.';                     Money_BUF[6]=Money_2+'0';                          display2(3,0,Money_BUF,7);  					   display(2,0,5); 		  				   } 				   	Delay_ms(3000); 					return; 				  }	 				  } 				   if(key_value==10)  //Money小数		小数点按键被按下，下一个数据输入的是小数。  				    { 					  Money_select=0; 					  back_count=0; 	//不影响退格使用 					}  				   if(key_value==11)	  //退格			 退格，这里增加了处理小数点的功能，请大家自行分析。  				    {   				 					   if( Money_select  ) 					   { 					     Money_1=Money_1/10; 					   } 					   else	 if(Money_select==0 && back_count==0) 					   { 					     Money_2=0;        	       			 back_count=1; 			           } 					   else if(Money_select==0 && back_count==1) 					   { 					   	 Money_1=Money_1/10; 						 Money_select=1; 						 back_count=0; 					   }			 				   					   	 				    	Money_BUF[0]=Money_1/10000+'0';                      	Money_BUF[1]=Money_1%10000/1000+'0';     	                Money_BUF[2]=Money_1%1000/100+'0';  	                    Money_BUF[3]=Money_1%100/10+'0';  	                    Money_BUF[4]=Money_1%10+'0'; 	                    Money_BUF[5]='.'; 	                    Money_BUF[6]=Money_2+'0';      	                         display2(3,0,Money_BUF,7);	  	                    display2(3,4,"元",2);	 					 } 				   				   if(key_value>=0 && key_value <=9)//有按键输入 ，包括小数点	  检测到按键是 0~9 的时候判定为有数字输入。  				  {	 			    				     								 					if(Money_select)		//整数				  判断是整数输入还是小数输入，进行相应操作。 					     Money_1=Money_1*10+key_value;  					else  					{  Money_2=key_value; 					   back_count=0;	//不影响退格使用 					}  						Money_BUF[0]=Money_1/10000+'0';				  //把刚刚输入的金额实时显示出来。                       	Money_BUF[1]=Money_1%10000/1000+'0';     	                Money_BUF[2]=Money_1%1000/100+'0';  	                    Money_BUF[3]=Money_1%100/10+'0';  	                    Money_BUF[4]=Money_1%10+'0'; 	                    Money_BUF[5]='.'; 	                    Money_BUF[6]=Money_2+'0';      	                         display2(3,0,Money_BUF,7);	  	                    display2(3,4,"元",2);	 				  }			   				} 		       break ; 		   		 case 2:		 		       display(1,0,3);      //充值	  状态“2”，充值功能。 			   display2(3,0,Money_BUF,7);	  	           display2(3,4,"元",2); 	           	while(1) 				{ 				  key_value=key_scan();  				  if(key_value==12)   //上一功能 				   {  				     states--; 	                 return; 					} 				   				  if(key_value==15)	  //确认键 				  {			 				 				   if(block_read(1,Money))				   	//		 先读出 IC 卡余额。 				   { 				   	                  if((Money[2]+Money_2)>9)                /*进位	这里分了 2 种情况： 	        1.IC 卡余额小数部分和充值金额小数部分的和大于 9，则相加后做进位处理。 	        2.IC 卡 IC 卡余额小数部分和充值金额小数部分的和<=9，则直接做加法出来。 	   */ 					 { 					  Money_1=(Money[0]*256+Money[1] )+Money_1+1; 				      Money_2=Money[2]+Money_2-10;	   					 } 					  else 					  { 					  Money_1=(Money[0]*256+Money[1] )+Money_1; 				      Money_2=Money[2]+Money_2;	   					 }  					 block_write(1,Money_1,Money_2 );//写卡	 						 //显示余额 					Money_BUF[0]=Money_1/10000+'0';		                   	Money_BUF[1]=Money_1%10000/1000+'0';  	                Money_BUF[2]=Money_1%1000/100+'0';                     Money_BUF[3]=Money_1%100/10+'0';                     Money_BUF[4]=Money_1%10+'0';                     Money_BUF[5]='.';                     Money_BUF[6]=Money_2+'0';                          display2(3,0,Money_BUF,7);  					   display(2,0,5); 		  				   } 				   	Delay_ms(3000); 					return; 			 				  } 				   if(key_value==10)  //Money小数 				    { 					  Money_select=0; 					  back_count=0; 	//不影响退格使用 					}  				   if(key_value==11)	  //退格 				    {   				 					   if( Money_select  ) 					   { 					     Money_1=Money_1/10; 					   } 					   else	 if(Money_select==0 && back_count==0) 					   { 					     Money_2=0;        	       			 back_count=1; 			           } 					   else if(Money_select==0 && back_count==1) 					   { 					   	 Money_1=Money_1/10; 						 Money_select=1; 						 back_count=0; 					   }			 				   					   	 				    	Money_BUF[0]=Money_1/10000+'0';                      	Money_BUF[1]=Money_1%10000/1000+'0';     	                Money_BUF[2]=Money_1%1000/100+'0';  	                    Money_BUF[3]=Money_1%100/10+'0';  	                    Money_BUF[4]=Money_1%10+'0'; 	                    Money_BUF[5]='.'; 	                    Money_BUF[6]=Money_2+'0';      	                         display2(3,0,Money_BUF,7);	  	                    display2(3,4,"元",2);	 					 }//退格 				   				   if(key_value>=0 && key_value <=9)//有按键输入 ，包括小数点 				  {	 			    				     								 					if(Money_select)		//整数 					     Money_1=Money_1*10+key_value;  					else  					{  Money_2=key_value; 					   back_count=0;	//不影响退格使用 					}  						Money_BUF[0]=Money_1/10000+'0';                      	Money_BUF[1]=Money_1%10000/1000+'0';     	                Money_BUF[2]=Money_1%1000/100+'0';  	                    Money_BUF[3]=Money_1%100/10+'0';  	                    Money_BUF[4]=Money_1%10+'0'; 	                    Money_BUF[5]='.'; 	                    Money_BUF[6]=Money_2+'0';      	                         display2(3,0,Money_BUF,7);	  	                    display2(3,4,"元",2);	 				  }			   				} 		       break ;   		default : break;  	 }	  		  	if( bPass )		 //处理成功 	{ 		bPass = 0; 		pass();	 	 	}  	if( bWarn )	     //处理失败 	{ 		bWarn = 0; 		warn(); 	}  } 	       因为文字超字数了 所以放到这里来了