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

📄 课程设计.c

📁 PS2控制代码123456789
💻 C
📖 第 1 页 / 共 2 页
字号:
	    ocmj_write(y1);
 	    xerr += delta_x ;
		yerr += delta_y ;
		if( xerr > distance )
		    {
			xerr-=distance;
 		    x1+=incx;
		    }
		if( yerr > distance )
		    {
			yerr-=distance;
 		    y1+=incy;
    		}
  	  }
}	     

/**********************************************/
	   /* 键盘子程序  */
/**********************************************/
unsigned char scan_key(void)
{
 unsigned char i;
 DDRB=0x0f;	//列接低位,输出
 PORTB=0xff;	
 for(i=0;i<4;i++)
  {
   PORTB=~(1<<i); //键盘线扫描
   delay_ms(20);  //等待低电平稳定
   temp1=PINB&0xf0;//读取键盘扫描信号,屏蔽低四位
   if (temp1!=0xf0)//如果有键按下,延时10ms消抖
    {              //本程序用display代替10ms延时,
    delay_ms(30); //可消除显示抖动
     temp1=PINB&0xf0;//再读键盘
     if (temp1!=0xf0)
      {
        temp1&=0xf0;
        switch(temp1) //计算键值
         {
		  case 0x70:temp1=15-(3-i)*4;break;
          case 0xb0:temp1=14-(3-i)*4;break;
          case 0xd0:temp1=13-(3-i)*4;break;
          case 0xe0:temp1=12-(3-i)*4;break;
          default:break;				
          }
		 return temp1;
		}
	  }
    }
   return 0x00;//无键按下
}	
/**********************************************/
	          /*查键盘*/
/**********************************************/	
unsigned char ks(void)
{
 unsigned char m,n;
 DDRB=0x0f;	
 PORTB=0xff;
 for(n=0;n<4;n++)
 {
 PORTB=~(1<<n);
 delay_ms(10);
 m=PINB&0xf0;
 if(m!=0xf0)
  return 0xff;
 }
 return 0x00;
}

//*********************************************************//

//******************************************************** //
   
#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++;
									  
									  
																	 
                                  }
							} 
						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 computer(void)
{ 
  if((scan_key()<=9)&&(scan_key()>=0))
      { 
	    write_ASCII(0xf9,jy,16,table1[scan_key()]);
		jy++;
		//count_comp++;
		putchar0(jy);	
     /* switch(jy)
       {  
        case 1:value=scan_key();break;
        case 2:value=scan_key()*10+scan_key();break;
     	case 3:value=scan_key()*10+scan_key();break;
     	case 4:value=scan_key()*10+scan_key();break;
     	case 5:value=scan_key()*10+scan_key();break;
     	case 6:value=scan_key()*10+scan_key();break;
     	case 7:value=scan_key()*10+scan_key();break;
     	case 8:value=scan_key()*10+scan_key();break;
     	default:break;
       }*/
     }
	    
   if(scan_key()==10)//A
   {valuefirst=value;value=0;flag_add=1;count_comp=0;jy=0;ocmj_write(0xf4);} //'+',
   if((ks()==0xff)&&(scan_key()==11))//B
   {valuefirst=value;value=0;flag_sub=1;count_comp=0;jy=0;ocmj_write(0xf4);}  // -
   if((ks()==0xff)&&(scan_key()==12))//c
   {valuefirst=value;value=0;flag_mul=1;count_comp=0;jy=0;ocmj_write(0xf4);}//  *
   if((ks()==0xff)&&(scan_key()==13))//D
   {valuefirst=value;value=0;flag_mod=1;count_comp=0;jy=0;ocmj_write(0xf4);}//  /
   if(scan_key()==14)//E
	  {     
	    if(flag_add==1) {rezult=valuefirst+value;count_comp=0;flag_add=0;ocmj_write(0xf4);jy=0;
		                 write_ASCII(0xf9,6,32,table1[rezult/100]);
	                     write_ASCII(0xf9,7,32,table1[rezult%100/10]);
	                     write_ASCII(0xf9,8,32,table1[rezult%10]);
		                }
	    if(flag_sub==1) {rezult=valuefirst-value;count_comp=0;flag_sub=0;ocmj_write(0xf4);jy=0; write_ASCII(0xf9,6,32,table1[rezult/100]);
	                     write_ASCII(0xf9,7,32,table1[rezult%100/10]);
	                     write_ASCII(0xf9,8,32,table1[rezult%10]);} 
	    if(flag_mul==1) {rezult=valuefirst*value;count_comp=0;flag_mul=0;ocmj_write(0xf4);jy=0;write_ASCII(0xf9,6,32,table1[rezult/100]);
	                     write_ASCII(0xf9,7,32,table1[rezult%100/10]);
	                     write_ASCII(0xf9,8,32,table1[rezult%10]); }  
		if(flag_mod==1) {rezult=valuefirst/value;count_comp=0;flag_mod=0; }  
      }
   

}
/********************电压采集**********************/
void test_v(void)
{
 hz_tran(1,1,"你爱你");
}

/**************主函数**********************************/ 
  void   main(void)
        {
          uart0_init();//串口初始化
		  timer0_init();//T0初始
          initail_ocmj();
          ocmj_write(0xf4);     
          initial_Exinterup();
		  TIMSK=0X01;
		  SREG|=0X80;
		  while(1)
		  {  
	      initial_Exinterup(); 
	      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; }//开中断
			 EIMSK=0X10;	     
			    flag=0;//打开外部中断
				computer(); 
			if(data==0x76) {ocmj_write(0xf4);flag_computer=0;rezult=0;break;}
		    }
		   }
	    /**********************************************/
		              /*电压采集*/
		/***********************************************/		    
		   if(flag_test_v)//电压采集
		   {
		    ocmj_write(0xf4);
		    for(;;)
			{
			 EIMSK=0X10;	     
			 flag=0;
		     test_v();
			 if(data==0x76) {ocmj_write(0xf4);flag_test_v=0;break;}
		   }
		  } 
		   
		  
		  }	
		  
		}
		
		  
			/*  if (flag)
				 Decode(data);
			 else
				  EIMSK=0X10; //开中断
	
				
		  }  while(1);
	         
        }



⌨️ 快捷键说明

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