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

📄 clcd.c

📁 AVR单片机完成128×64点阵液晶显示器的驱动控制程序和一些具体显示应用
💻 C
📖 第 1 页 / 共 3 页
字号:

//------------    主程序    ------------//
void main(void)
{
// Declare your local variables here
    unsigned int i,j;
    
// Input/Output Ports initialization
// Port A initialization
// Func0=Out Func1=Out Func2=Out Func3=In Func4=In Func5=In Func6=In Func7=In 
// State0=0 State1=0 State2=0 State3=T State4=T State5=T State6=T State7=T 
    PORTA=0x00;
    DDRA=0xFF;
    
// Port B initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=1 State1=1 State2=1 State3=1 State4=1 State5=1 State6=1 State7=1
	PORTB=0xFF;
	DDRB=0x7F;

// Port C initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=1 State1=1 State2=1 State3=1 State4=1 State5=1 State6=1 State7=1
	PORTC=0xFF;
	DDRC=0xFF;                                                    
                                                                                 
// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=P State1=P State2=P State3=P State4=P State5=P State6=P State7=P
	PORTD=0xFF;
	DDRD=0x00;
	
                                                                                 
// Timer/Counter 0 initialization                                                
// Clock source: System Clock                                                    
// Clock value: 62.500 kHz                                                       
// 溢出中断周期: 4ms                                                            
    TCCR0=0x03;                                                                  
    TCNT0=0x05;                                                                  
                                                                                 
// Timer/Counter 1 initialization                                                
// Clock source: System Clock                                                    
// Clock value: Timer 1 Stopped                                                  
// Mode: Normal top=FFFFh                                                        
// OC1A output: Discon.                                                          
// OC1B output: Discon.                                                          
// Noise Canceler: Off                                                           
// Input Capture on Falling Edge                                                 

    TCCR1A=0x00;                                                                 
    TCCR1B=0x00;                                                                 
    TCNT1H=0x00;                                                                 
    TCNT1L=0x00;                                                                 
    OCR1AH=0x00;                                                                 
    OCR1AL=0x00;                                                                 
    OCR1BH=0x00;                                                                 
    OCR1BL=0x00;                                                                 
                                                                                 
// External Interrupt(s) initialization                                          
// INT0: Off                                                                     
// INT1: Off  
                                                                   
    GICR=0x00;  
//	GIMSK=0x00;                                                                

    MCUCR=0x00;                                                                  
                                                                                 
// Timer(s)/Counter(s) Interrupt(s) initialization                               
    TIMSK=0x02;                                                                  
                                                                                 
// Analog Comparator initialization                                              
// Analog Comparator: Off                                                        
// Analog Comparator Input Capture by Timer/Counter 1                            
// Analog Comparator Output: Off                                                 
    ACSR=0x80;                                                                   
                                                                                 
// Global enable interrupts           : Off                   

    
//    #asm("sei")		//开总中断
    old_Key=PIND;
    oldcru=0;
    Crusor=0;
    hMenu=0;
    
    CS2=1;
    CS1=1;
    E=0; 
    
  	delay_ms(200);   

    
	for(i=0;i<8;i++)
	{
		tset[i]=E_Time[i];
		temp=tset[i]&0x000F;
		if (temp>9)
		{
			tset[i]=tset[i]&0x0FF9;
			E_Time[i]=tset[i];
		}
		temp=tset[i]&0x00F0;
		if (temp>0x0090)
		{
			tset[i]=tset[i]&0x0F9F;
			E_Time[i]=tset[i];
		}
		temp=tset[i]&0x0F00;
		if (temp>0x0900)
		{
			tset[i]=tset[i]&0x09FF;
			E_Time[i]=tset[i];
		}
		temp=tset[i]&0xF000;
		if (temp>0x0000)
		{
			tset[i]=tset[i]&0x0FFF;
			E_Time[i]=tset[i];
		}
		
		Timeset[i]=tset[i];
		Time[i]=0;		
	}  


/********************** 测试功能  ***********************
开机时按下,且仅按下 "确定"和"右"键时,进入测试模式
测试模式中的LCD显示:
	第一行:	显示"提示"字样,后面显示提示按键,根据所提示的按键,
			每按一次,执行步骤加1 . 
			(注:此步骤号与方案中的流程号不同)
			提示键主要有四个:上、下、左、红(红即是确定键)
			其代表的含义分别是:
			上:	托盘上升到顶点
			下:	托盘下降到底点
			左;	延时时间执行完毕
			红(确定):托盘转动到下一个位置
	第二行:	显示从RD0到RD9的状态,打开状态时,数字没有下划线
			关闭状态,数字有下划线,数字代表,RD0到RD9
	第三行: 显示当前执行的步骤号
	第四行:	显示"按取消键退出",在执行模式中,按下取消键,
			就会退出测试模式,进入到程序正常的执行模式中.  
			
	注:	当第三行显示“21”时,此时全部测试已经完成,
			提示按键没有刷新,此时需按下“取消键退出测试模式。
			其它按键没有响应。若要重新进入测试模式,需要再次开机。

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

	test=0;
	if (!(PIND&0x82))
	{
		delay_ms(1000);
		if (!(PIND&0x82))
		{
			test=1;
//			old_Step=0xff;
			Step=0xFF;
		
			LCD_Init(); //LCD初始化
   			LCD_Clr();  //LCD清屏
		    for(i=0;i<2;i++) LCD_WrCHr16x16(0,i*2,i+25);   //第1行显示"提示"  
	  	  	for(i=0;i<6;i++) LCD_WrCHr16x16(6,i*2,i+18);    //第4行显示"按取消键退出"  
			
		}
		else 
			test=0;
	}

	
	while(test)
	{          
		KeyTemp=keyscan();
		KT1= KeyTemp;  //键状态
		KT2=KeyTemp>>8; 
		KT2=KT1&KT2;      //键按下   

       	if(KT2&0x10)		//上   
        {
         	s_up=1;
        }
            
		if(KT2&0x20)		//下 
        {  
        	s_down=1;
        }
   
       	if(KT2&0x40)		//左
        {
        	for(i=0;i<8;i++)
        	{
        		Time[i]=0;
        	}
        }
            
		if(KT2&0x80)		//右
        {
        }

		if(KT2&0x02)		//确认 
        {
        	s_sp=1;
        }

		if(KT2&0x01)		//取消
        {
        	test=0;
		}
		
		execute();
		j=0;     		
		
		for (i=0;i<7;i++)
		{
			if (Time[i])
			{
				LCD_WrCHr16x16(0,6,29);
				j=1;
			}
		}
		
		if (j==0)
			{
				LCD_WrCHr8x16(0,6,0);
				LCD_WrCHr8x16(0,7,0);

			}
			
		switch(roll)
		{
			case 0:
			case 1:
		   			LCD_WrCHr16x16(0,10,28)	;	
		   			break;
			case 2:
			case 3:
					LCD_WrCHr16x16(0,10,30)	;	
					break;
			case 4:
			case 5:
			case 10:
					LCD_WrCHr16x16(0,10,27);
					break;
			
			default:	
					break;
		} 

		
		for (i=0;i<10;i++)
		{
			j=1<<i;
			j=j&RD;
			if(j)
			{
			   	LCD_WrCHr6x16(2,i*8,10+i);
			}
			else
			{
				LCD_WrCHr6x16(2,i*8,i);	
			}
        }
			DispStep();
//			old_Step=Step;
 	}
	

//------------ 测试结束 ------------//

   
    LCD_Init(); //LCD初始化
    LCD_Clr();  //LCD清屏   
 
    for(i=0;i<3;i++) LCD_WrCHr16x16(0,i*2+6,i);    //第1行显示"主菜单"  
    

	Time[8]=0;

	R_OFF();
 
 /*	
 	delay_ms(20);
   
    #asm("sei")		//开总中断
    MotoIni();
    #asm("cli")		//关总中断
 */
 
while (1)
{
      //   定义按键: Kcancle,Kok,Kup,Kdown,Kleft,Kright key0..5
    
		KeyTemp=keyscan();
		KT1= KeyTemp;  //键状态
		KT2=KeyTemp>>8; 
		KT2=KT1&KT2;      //键按下   
		
/*		
//		
    for(j=0;j<8;j++)
    {
      LCD_Write_ComL(0xb8|j);   //页PAGE(j)	设置指令
      LCD_Write_ComL(0x40);     //列地址Y(0)	Address	设置指令
      LCD_Write_ComR(0xb8|j);  
      LCD_Write_ComR(0x40);
      for(i=0;i<64;i++)			//64列清0
      {       
        LCD_Write_DatL(0xFF);  
        LCD_Write_DatR(0xFF); 
      }
    } 
    
    	delay_ms(1000);		
*/                               
/*	
// dubug
		error=Err_Msg;
		mm=hMenu;
		cc=Crusor;
		kkkk=KeyTemp;    
  */		
		
/***************************************************************************
						主   菜   单
***************************************************************************/
		if (hMenu==0) 
		{
			#asm("cli")		//关总中断
			if(oldcru != Crusor)   //显示光标
			{
				LCD_WrCHr8x16(oldcru<<1,0,0);
				LCD_WrCHr8x16(Crusor<<1,0,1);
				oldcru=Crusor;
			}

				
			if(Crusor==0)
			{
				R_OFF();
				LCD_Init(); //LCD初始化
    			LCD_Clr();  //LCD清屏
				Crusor=1;
				oldcru=0;
				
			    for(i=0;i<3;i++) LCD_WrCHr16x16(0,i*2+6,i);    //第1行显示"主菜单"  
			    for(i=0;i<2;i++) LCD_WrCHr16x16(2,i*2+4,i+3);  //第2行显示"执行"  

			    for(i=0;i<2;i++) LCD_WrCHr16x16(4,i*2+4,i+6);  //第3行显示"显示"  
			    for(i=0;i<4;i++) LCD_WrCHr16x16(4,i*2+8,i+10); //第3行显示"工作参数"  

			    for(i=0;i<6;i++) LCD_WrCHr16x16(6,i*2+4,i+8);  //第4行显示"工作参数"  

				for(i=1;i<4;i++) LCD_WrCHr6x16(i*2,8,i);       //显示"123"  
				for(i=1;i<4;i++) LCD_WrCHr4x16(i*2,16,1);      //显示"..."  
			}
			
			if(KT2&0x10)//上   
            {
                //RD7=0;
                oldcru=Crusor;
                if(Crusor==2)
                	Crusor=1;
                else if(Crusor==3)
                	Crusor=2;
            }
            
			if(KT2&0x20)//下 
            {
                //RD6=0;
                oldcru=Crusor;
                if(Crusor==1)
                	Crusor=2;
                else if(Crusor==2)
                	Crusor=3;
            }

			if(KT2&0x02)//确认 
            {
                hMenu=Crusor;
                if (Crusor==3)
                {
                	M3Done=1;
                }
                Crusor=0;
                oldcru=0;
            //    RD5=0;
            }
        }


/***************************************************************************
						执  行  菜  单
***************************************************************************/
        else if(hMenu==1)    
        {
		    #asm("sei")		//开总中断 
		    if(Crusor==1)
		    {
				execute(); 
//				DispStep();
			}  
			
			if (Crusor==0)
			{
				Crusor=1;
  				LCD_Init(); //LCD初始化
    			LCD_Clr();  //LCD清屏
			    for(i=0;i<3;i++) LCD_WrCHr16x16(0,i*2+4,i+3);   //第1行显示"执行中"  
		  	  	for(i=0;i<4;i++) LCD_WrCHr16x16(2,i*2,i+14);    //第2行显示"处理溶液"  
		  	  	for(i=0;i<6;i++) LCD_WrCHr16x16(6,i*2,i+18);    //第4行显示"按取消键退出"  
		  	  	MotoIni();
		  	  	roll=0;
			}

			else if (roll==9)			//执行结束
			{
				hMenu=0;
				Err_Msg=0;
				Crusor=0;
				oldcru=0;
				R_OFF();
				roll=0;  
			}
 /*			else if(Step>=0x80)
			{
				MotoIni();
			}
*/
			
			if(old_Step!=Step)
			{
//				Time[8]=0x0500;    //每步执行时间上限128秒,超时有误
				DispStep();

				switch(Step)
				{
					case 1:
			 				LCD_WrCHr8x16(2,10,2);	//显示A
                    		break;
		   			case 4 : 
							LCD_WrCHr8x16(2,10,3);	//显示B	
							break;
		   			case 6 :
			  			 	LCD_WrCHr8x16(2,10,4); 	//显示C
			  				break;
		   			case 8 :  
					   		LCD_WrCHr8x16(2,10,5); 	//显示D
				   			break;	
		   			default:
				   			break;
	   			} 

			}
			
			if (roll==8)          
			{
				Err_Msg=Step|0x80;
				hMenu=0;
				Crusor=0;
				oldcru=0;
				R_OFF();
			}
			
			
			if(KT2&0x01)//取消
            {
                hMenu=0;
                Crusor=0;
                oldcru=0;
            }
            
            old_Step=Step;
        } 
          
        
/***************************************************************************
				显  示  参  数  菜  单
***************************************************************************/
        else if (hMenu==2)  
        {
			if (Crusor==0)
			{
				R_OFF();
				Crusor=1;
				LCD_Init(); //LCD初始化
    			LCD_Clr();  //LCD清屏
        		for(i=0;i<8;i++)
        		{
        			tset[i]=Timeset[i];
        		}
        		//初始参数显示
        		DispFrame();
        		for(i=0;i<24;i++)
        		{
        			DispTime(i,0);
        		}   				
			}
			
			if(KT2&0x01)//取消
            {
                hMenu=0;
                Crusor=0;
            }
        }
          
  
/***************************************************************************
				设  置  参  数  菜  单
***************************************************************************/
		
		else if (hMenu==3)  
        { 
			if(oldcru != Crusor)   //刷新显示光标
			{
        		DispTime(oldcru,0); 
				DispTime(Crusor,10); 
				oldcru=Crusor;
			}

        	if(M3Done==1)
        	{
        		M3Done=0;
        		oldcru=0;
        		for(i=0;i<8;i++)
        		{
        			tset[i]=Timeset[i];
        		}
        		//初始参数显示 
        		
				LCD_Init(); //LCD初始化
    			LCD_Clr();  //LCD清屏
        		DispFrame();
        		DispTime(0,10);
        		
        		for(i=1;i<24;i++)
        		{
        			DispTime(i,0);
        		} 
        		
//        		MotoKey();       		
//        		R_OFF();
			}
      	
           	if(KT2&0x10)		//上   
            {
                F_TimeSet(Crusor,1);
                DispTime(Crusor,10);  		//显示刷新  
                
        		j=250;
          		while((KT1&0x10)&&j)
        		{
  					KeyTemp=keyscan();
					KT1= KeyTemp;  		//键状态
					j--;
					delay_ms(2);
				}
        		j=9;
				delay_ms(3);
				KeyTemp=keyscan();
				KT1= KeyTemp;  		//键状态

        		while((KT1&0x10)&&j)
        		{
  					delay_ms(300);
	                F_TimeSet(Crusor,1);
	                DispTime(Crusor,10);  	//显示刷新
  					KeyTemp=keyscan();
					KT1= KeyTemp;  		//键状态
					j--;
				}
            }
            
			if(KT2&0x20)		//下 
            {
                F_TimeSet(Crusor,0);
                DispTime(Crusor,10);  		//显示刷新

        		j=250;
       			while((KT1&0x20)&&j)
        		{
  					KeyTemp=keyscan();
					KT1= KeyTemp;  		//键状态
					delay_ms(2);
					j--;
				}

        		j=9;
				delay_ms(3);
				KeyTemp=keyscan();
				KT1= KeyTemp;  		//键状态

        		while((KT1&0x20)&&j)
        		{
  					delay_ms(300);
	                F_TimeSet(Crusor,0);
	                DispTime(Crusor,10);  	//显示刷新
  					KeyTemp=keyscan();
					KT1= KeyTemp;  		//键状态
					j--;
				}
           }
   
           	if(KT2&0x40)		//左
            {
                if((Crusor-(ceil(Crusor/3-0.5))*3)>0)
                {
                	oldcru=Crusor;
                	Crusor--;
                }
            }
            
			if(KT2&0x80)		//右
            {
                if((Crusor-(ceil(Crusor/3-0.5))*3)<2)
                {
                	oldcru=Crusor;
                	Crusor++;
                }
            }


			if(KT2&0x02)		//确认 
            {
                if (Crusor>20)
                {	
                	oldcru=Crusor;
                	Crusor=0;
                }
                else
                {
                	oldcru=Crusor;
                	Crusor=(ceil(Crusor/3+0.5))*3;

        		}
            }

			if(KT2&0x01)//取消
            {
                hMenu=0;
                Crusor=0;
                oldcru=0;
      		  	for(i=0;i<8;i++)
        		{
        	   		if (Timeset[i]!=tset[i])
        	   		{
        	   			Timeset[i]=tset[i];
        	   			E_Time[i]=tset[i];     
        	   		}
        		}
            }
		}
	}
}               

⌨️ 快捷键说明

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