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

📄 最后测试._c

📁 PS2控制代码123456789
💻 _C
📖 第 1 页 / 共 2 页
字号:
//******************************************************** //
   
#pragma interrupt_handler PS2_KEY:6
 
  void PS2_KEY(void)
  {
   
    if((count_jiema>0)&&(count_jiema<9))
              {  
			    data=data>>1;
                 if(PINE&DATA1)
	              data|=0x80;
              }
         count_jiema++;
		
		 while(!(PINE&0X10));	//

    if(count_jiema>10)
             {
			  putchar0(data);//测试键盘码用
              count_jiema=0;
              flag=1;
              EIMSK=0x00;
			
           }		 
  }

 //*********************************************************//
                     /*译码*/
 //******************************************************** // 
 
   void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
   {
	unsigned char TempCyc;	

	if (!Key_UP)                //
		{
			switch (ScanCode)
				{
					case 0xF0 :	                // 当收到0xF0,Key_UP置1表示断码开始,把Shift = 1;解锁。否则下次总是显示大写字母
					Key_UP = 1;
					break;

					case 0x12 :	                  // 左 SHIFT
						  Shift = 1;
					         break;
							 
                    case 0x58 :	  Shift=~Shift;break;
					case 0x59 :	                 // 右 SHIFT
						      Shift = 1;
					            break;
					case 0x66 :		//DEL键	
	                 if (DisNumx==-1)
					  {
					    DisNumy=DisNumy-8;
					    DisNumx=15;
					  }
					 else  
					  {  
					    write_asiic(DisNumx, DisNumy, UnShifted[40][1]);
					    DisNumx--;   
					  }	
                       break;
					default:						
							if (DisNumx > 15)
							{
                               DisNumy=DisNumy+8;
                                if( DisNumy==64)DisNumy=0;
								DisplayListChar(0, DisNumy);//清LCD第二行
                                 DisNumx=0;
								 
								                 
                             }
				    if(!Shift)	//如果SHIFT没按下
							{   
								for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<71); TempCyc++); //查表显示
								if (UnShifted[TempCyc][0] == ScanCode) 
                                   {  write_asiic(DisNumx, DisNumy, UnShifted[TempCyc][1]);
									  DisNumx++;
									  if((ScanCode==0x70)||(ScanCode==0x69)||(ScanCode==0x72)||(ScanCode==0x7A)||(ScanCode==0x6B)||
									  (ScanCode==0x73)||(ScanCode==0x74)||(ScanCode==0x6C)||(ScanCode==0x75)||(ScanCode==0x7D))
									   {DisNumx1++;
									  switch(ScanCode)
									   {
									   case 0x70: keytemp=0;break;//小键盘
                                       case 0x69: keytemp=1;break;
                                       case 0x72: keytemp=2;break;
                                       case 0x7A: keytemp=3;break;
                                       case 0x6B: keytemp=4;break;
                                       case 0x73: keytemp=5;break;
                                       case 0x74: keytemp=6;break;
                                       case 0x6C: keytemp=7;break;
                                       case 0x75: keytemp=8;break;
                                       case 0x7D: keytemp=9;break;
     	                               default:break;
									  }
									  switch(DisNumx1)
									  {
									   case 1:value=keytemp;break;
                                       case 2:value=value*10+keytemp;break;
     	                               case 3:value=value*10+keytemp;break;
     	                               case 4:value=value*10+keytemp;break;
     	                               case 5:value=value*10+keytemp;break;
     	                               case 6:value=value*10+keytemp;break;
     	                               case 7:value=value*10+keytemp;break;
     	                               case 8:value=value*10+keytemp;break;
     	                               default:break;
									  }
									  }
									if(ScanCode==0x79)//+
                                     {
									  valuefirst=value;value=0;
									  flag_add=1;DisNumx1=0;
									 } 
									if(ScanCode==0x7B)//-
                                    {
									 valuefirst=value;value=0;
									 flag_sub=1;DisNumx1=0;
									} 
									if(ScanCode==0x7c)//*
                                    {
									 valuefirst=value;value=0;
									 flag_mul=1;DisNumx1=0;
									}  
									if(ScanCode==0x4a)///
                                    {
									 valuefirst=value;value=0;
									 flag_mod=1;DisNumx1=0;
									}  
                                    if(ScanCode==0x5a)//enter
	                                {     
	                                if(flag_add==1)
									 {
									 rezult=valuefirst+value;DisNumx1=0;
									 flag_add=0;
									 datechuli();
		                             }
									 if(flag_sub==1)
									 {
									 rezult=valuefirst-value;DisNumx1=0;
									 flag_sub=0;
		                             datechuli();
		                             }
									 if(flag_mul==1)
									 {
									 rezult=valuefirst*value;DisNumx1=0;
									 flag_mul=0;
		                             datechuli();
		                             }
									 if(flag_mod==1)
									 {
									  flag_mod=0;
									  rezult=valuefirst/value;DisNumx1=0;
									  rezult1=(float)valuefirst/value;
									  if(rezult<=9)
									   {
									   rezult2=rezult1*10000;
									   ocmj_write(0xf4);
									   write_ASCII(0xf9,10,32,table1[rezult2/10000]);
									   write_ASCII(0xf9,11,32,46);//.
                                       write_ASCII(0xf9,12,32,table1[rezult2%10000/1000]);
                                       write_ASCII(0xf9,13,32,table1[rezult2%1000/100]);
									   write_ASCII(0xf9,14,32,table1[rezult2%100/10]);
                                       write_ASCII(0xf9,15,32,table1[rezult2%10]);
									   }  
									   else if(rezult<=99)
									   {
									    rezult2=rezult1*10000;
										ocmj_write(0xf4);
									    write_ASCII(0xf9,9,32,table1[rezult2/100000]);
                                        write_ASCII(0xf9,10,32,table1[rezult2%100000/10000]);
										write_ASCII(0xf9,11,32,46);//.
                                        write_ASCII(0xf9,12,32,table1[rezult2%10000/1000]);
									    write_ASCII(0xf9,13,32,table1[rezult2%1000/100]);
										write_ASCII(0xf9,14,32,table1[rezult2%100/10]);
                                        write_ASCII(0xf9,15,32,table1[rezult2%10]);
									   }
									   else if(rezult<=999)
									   {
									    rezult2=rezult1*10000;
										ocmj_write(0xf4);
									    write_ASCII(0xf9,8,32,table1[rezult2/1000000]);
                                        write_ASCII(0xf9,9,32,table1[rezult2%1000000/100000]);
                                        write_ASCII(0xf9,10,32,table1[rezult2%100000/10000]);
										write_ASCII(0xf9,11,32,46);//.
									    write_ASCII(0xf9,12,32,table1[rezult2%10000/1000]);
										write_ASCII(0xf9,13,32,table1[rezult2%1000/100]);
										write_ASCII(0xf9,14,32,table1[rezult2%100/10]);
                                        write_ASCII(0xf9,15,32,table1[rezult2%10]);
									   }
									   else if(rezult<=9999)
									   {
									    rezult2=rezult1*10000;
										ocmj_write(0xf4);
									    write_ASCII(0xf9,7,32,table1[rezult2/10000000]);
                                        write_ASCII(0xf9,8,32,table1[rezult2%10000000/1000000]);
                                        write_ASCII(0xf9,9,32,table1[rezult2%1000000/100000]);
									    write_ASCII(0xf9,10,32,table1[rezult2%100000/10000]);
										write_ASCII(0xf9,11,32,46);//.
										write_ASCII(0xf9,12,32,table1[rezult2%10000/1000]);
										write_ASCII(0xf9,13,32,table1[rezult2%1000/100]);
										write_ASCII(0xf9,14,32,table1[rezult2%100/10]);
                                        write_ASCII(0xf9,15,32,table1[rezult2%10]);
									   }
									   else if(rezult<=99999)
									   {
									    rezult2=rezult1*10000;
										ocmj_write(0xf4);
									    write_ASCII(0xf9,6,32,table1[rezult2/100000000]);
                                        write_ASCII(0xf9,7,32,table1[rezult2%100000000/10000000]);
                                        write_ASCII(0xf9,8,32,table1[rezult2%10000000/1000000]);
									    write_ASCII(0xf9,9,32,table1[rezult2%1000000/100000]);
										write_ASCII(0xf9,10,32,table1[rezult2%100000/10000]);
										write_ASCII(0xf9,11,32,46);//.
										write_ASCII(0xf9,12,32,table1[rezult2%10000/1000]);
										write_ASCII(0xf9,13,32,table1[rezult2%1000/100]);
										write_ASCII(0xf9,14,32,table1[rezult2%100/10]);
                                        write_ASCII(0xf9,15,32,table1[rezult2%10]);
									   }
									   else	 datechuli();
		                                   
		                              }
		 
                                 }
   										 
                                  }
							} 
						else  //按下SHIFT
							{
								for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
								if (Shifted[TempCyc][0] == ScanCode) 
                                     {  write_asiic(DisNumx, DisNumy, Shifted[TempCyc][1]);
								        DisNumx++;	
										
                                     } 
							}

					break;
				}
		}
	else
		{	
			Key_UP = 0;
			switch (ScanCode) //当键松开时不处理断码,SHIFT+G为12H 34H F0H 34H F0H 12H,按下(12H 34H),松开(F0H 34H F0H 12H)
				{
					case 0x12 :	// 左 SHIFT
						Shift = 0;
					break;
                    
					case 0x59 :	// 右 SHIFT
						Shift = 0;
					break;
				}
		}
	flag = 0; //标识字符处理完了
} 
//**************************************************//
                  /*初始化****/
//**************************************************//   
   
   void initial_Exinterup(void)
       {
	   DDRE&=~BIT(4);
	   DDRE&=~BIT(5);//输入
	   PORTE|=BIT(4);
	   PORTE|=BIT(5);//都置高
	   MCUCR=0X00;
	   EICRB=0X00; 
       EIMSK=0X10;	//INT4标志 
       }

/*********************计算机通讯***********************/

void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//8bit+1bit stop
 UBRR0L=(fosc/16/(BAUD+1))%256;
 UBRR0H=(fosc/16/(BAUD+1))/256;
 UCSR0B =(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//RXCEN TXCEN
}

void putchar0(unsigned char c)
	{	
	   UDR0=c;  
	 while (!(UCSR0A&(1<<UDRE0)));
	}
 void puts0(char *s)
	{
	while (*s)
		{
		putchar0(*s);
		s++;
		}	
    putchar0(0x0a);
	putchar0(0x0d);
	}
unsigned char getchar0(void)
  	{
	 while(!(UCSR0A& (1<<RXC0)));
     return UDR0;
	}	
void delay_us(int time)
 {     
  do
	{
	time--;
	}	
  while (time>1);
 }
void delay_ms(unsigned int time)
	 {
	  while(time!=0)
	  	  {		
		   delay_us(1000);
		   time--;
		  }
	 }	

/**************主函数**********************************/ 
  void   main(void)
        {
		  
          uart0_init();//串口初始化
		  timer0_init();//T0初始
          initail_ocmj();
		  kaiji_main();
          ocmj_write(0xf4);     
          initial_Exinterup();
		  TIMSK=0X01;
		  SREG|=0X80;
		  hz_tran(1,0,"电子计算器");
		  hz_tran(0,1,"组员");
		  write_ASCII(0xf9,9,16,58);//:
		  hz_tran(3,1,"李");
		  hz_tran(5,1,"伟");
		  hz_tran(3,2,"潘良才");
		  hz_tran(3,3,"陈杰彪");
		  while(1)
		  { initial_Exinterup();   
	       if(data==0x05)//F1进入
		    {
		     ocmj_write(0xf4);
loop:		for(;;)
			{
			EIMSK=0X10;	     
			flag=0;//打开外部中断
	        write_ASCII(0xf9,4,16,49);//1
		    write_ASCII(0xf9,5,16,46);//.  
		    write_ASCII(0xf9,4,32,50);//2
		    write_ASCII(0xf9,5,32,46);//. 
		    write_ASCII(0xf9,4,48,51);//3
		    write_ASCII(0xf9,5,48,46);//. 
		    hz_tran(3,0,"主菜单");
		    hz_tran(1,1,"电子时钟");
		    hz_tran(1,2,"电子计算器");
		    hz_tran(1,3,"计算器通讯");
		  switch(data)
		   {
		     case 0x16:
			 case 0x69: flag_time=1; break;
			 case 0x1E:
			 case 0x72: flag_computer=1;ocmj_write(0xf4);flag=0;break;
		     case 0x7A: flag_test_v=1 ; ocmj_write(0xf4);break;
		     default:break;
		   }
		/**********************************************/
		             /*电子时钟*/
		/***********************************************/			 
		   if(flag_time)
		   {
		    ocmj_write(0xf4);
			for(;;)
			{
			EIMSK=0X10;	     
			flag=0;//打开外部中断
		    time();
			if(data==0x76) {ocmj_write(0xf4);flag_time=0;break;}
			if(data==0x05) 
			  {ocmj_write(0xf4);
			   for(;;)
			    {
			    EIMSK=0X10;	     
			    flag=0;//打开外部中断
			    instruction();//说明书
				if(data==0x76) {ocmj_write(0xf4);break;}
			   }
			  }	
			}
		   }
		/**********************************************/
		             /*电子计算器*/
		/***********************************************/		 
		   if(flag_computer)
		    {
		    ocmj_write(0xf4);
		    for(;;)
			{
			 if (flag)
				{ 
				Decode(data);
				}
			 else
			{EIMSK=0X10; }//开中断
			if(data==0x76) {ocmj_write(0xf4);flag_computer=0;rezult=0;DisNumx=0;DisNumy=0;break;}
		    }
		    }
	    /**********************************************/
		              /*计算机串口通讯*/
		/***********************************************/		    
		   if(flag_test_v)//
		    {
		    ocmj_write(0xf4);
			hz_tran(1,1,"正在连接通讯");
			delay_nms(1500);
			ocmj_write(0xf4);
			hz_tran(2,2,"请稍等");
			delay_nms(1500);
			ocmj_write(0xf4);
		    for(;;)
			{
			 hz_tran(2,2,"开始通讯");
			 EIMSK=0X10;     
			 flag=0;
			 if(data==0x76) {ocmj_write(0xf4);flag_test_v=0;goto loop;}
		   }
		   } 
		   
		
		}  
		}  
		  
		  }	 //while(1)对应
		  
		}
		
		  
			


⌨️ 快捷键说明

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