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

📄 lcd.c

📁 Keil for Arm Philip2124系列
💻 C
字号:


#include "lcd.h"
#include "lpc21xx.h"
#include "inandout.h"

/*
struct LCD
{ 
    int addr[addr_num];
	uint8 ch_lcd[addr_num];
	int Set_addr;
	uint8 set_char;
	int IsSeting;  	
	int CurrentIndex;
} ;
*/

struct LCD g_lcd;


extern unsigned int AD_convert();
extern void SetYear( unsigned int year );
extern void SetMonth( unsigned int month ); 
extern void SetDay( unsigned int day );

void Show( int Flag );
void DisText( uint8 addr , uint8* p);
void WrDat( uint8 dat );
void WrOp( uint8 dat );

void _InitLCDStruct()
{
	int i; 
	for( i = 0 ; i < addr_num ; i++ )
	{
	   if( i < addr_num / 2 )
	   {
	   	   g_lcd.addr[i] = 0x80 + i ;
	   }
	   else
	   {
	       	g_lcd.addr[i]= 0xC0 + i - addr_num / 2 ;
	   }
	   g_lcd.ch_lcd[i] = ' ';
	}	

	g_lcd.CurrentIndex = 5;
	g_lcd.set_char = '_';
	g_lcd.IsSeting = 0;
	g_lcd.Set_addr = 0x85;
    
	g_lcd.ch_lcd[0] = 'D';
	g_lcd.ch_lcd[1] = 'A';
	g_lcd.ch_lcd[2] = 'D';
	g_lcd.ch_lcd[3] = 'A';
	g_lcd.ch_lcd[4] = ':';
	
	g_lcd.ch_lcd[5] = '2';
	g_lcd.ch_lcd[6] = '0';
	g_lcd.ch_lcd[7] = '0';
	g_lcd.ch_lcd[8] = '7';

	g_lcd.ch_lcd[9] = ':';
	g_lcd.ch_lcd[10] = '0';
	g_lcd.ch_lcd[11] = '5';
	g_lcd.ch_lcd[12] = ':';
	g_lcd.ch_lcd[13] = '2';
	g_lcd.ch_lcd[14] = '5';


	g_lcd.ch_lcd[20] = 'C';
	g_lcd.ch_lcd[21] = 'O';
	g_lcd.ch_lcd[22] = 'M';
	g_lcd.ch_lcd[23] = 'M';
	g_lcd.ch_lcd[24] = ':';

	g_lcd.ch_lcd[25] = '5';
	g_lcd.ch_lcd[26] = '6';
	g_lcd.ch_lcd[27] = '.';
	g_lcd.ch_lcd[28] = '5';
	g_lcd.ch_lcd[29] = '7';

	g_lcd.ch_lcd[30] = '%';	  
	
	WrOp( 0x80 );
	for( i = 0 ; i < addr_num / 2 ; i++ )
	{
	    WrDat( g_lcd.ch_lcd[i] ) ; 
	}

	WrOp( 0xC0 );
	for( i = addr_num / 2 ; i < addr_num ; i++ )
	{
	    WrDat( g_lcd.ch_lcd[i] ) ;
	}  
}




void delay_lcd()
{
   int i;
   for( i = 0 ; i < 500 ; i++ );
}


/*
   LCD functions:
   Methed: checkBusy
   Function: to check the line is busy or not!( but i think it has a bug )
*/


void checkBusy()
{
   IOPIN0 = 0x0005;
   IODIR0 =  0x700  << 2 ;
   while(1)
   {
       IOCLR0 = rs ;
	   IOSET0 = rw ; 
	   IOSET0 = en ;
	   if( ! ( IOPIN0 & busy ) ) break;
	   IOCLR0 = en;
   } 
   IODIR0 = 0x1FFC ;
}



void WrOp( uint8 dat )
{
    int x = 0;
	x = dat;
	x = x << 2;
    checkBusy();
	IOCLR0 = rs ;
	IOCLR0 = rw;
	IOCLR0 = 0x1FFC ;
	IOSET0 = x;
	IOSET0 = en ;
	IOCLR0 = en ;
	checkBusy();
	delay_lcd();
}




void WrDat( uint8 dat )
{
    int x = 0;
	x = dat;
	x = x<<2;
    checkBusy();
	IOSET0 = rs ;
	IOCLR0 = rw ;
	IOCLR0 = 0xFF<<2;	//No p
	IOSET0 = x ;
	IOSET0 = en;
	IOCLR0 = en;
	delay_lcd();
}

// 
void lcd_init()
{
    WrOp( 0x38 );
	WrOp( 0x06 );
	WrOp( 0x0C );
	 _InitLCDStruct();
}


void DisText( uint8 addr , uint8* p )
{
    WrOp( addr );
	while( *p != '\0' )
	{
	    WrDat( *p );
		p++; 
	}	  
}

/*
   LCD control function:
*/

void BeginSet()
{
    g_lcd.IsSeting = 1;
	g_lcd.Set_addr = 0x85;
	g_lcd.CurrentIndex = 5;
}


int IsSetting()
{
    return g_lcd.IsSeting ;
}


void EndSet()
{
    unsigned int year = 0 , month = 0 , day = 0 , temp = 0; 
    int i;
	for( i = 0 ; i < 4 ; i++ )
	{
	    temp = g_lcd.ch_lcd[i+5] - '0';
		year = year * 10 + temp;   		
	}
	SetYear( year );

	for( i = 0 ; i < 2 ; i++ )
	{
	   	temp = g_lcd.ch_lcd[i+10] - '0';
		month = month * 10 + temp;
	} 
	SetMonth( month );

	for( i = 0 ; i < 2 ; i++ )
	{
	    temp = g_lcd.ch_lcd[i+13] - '0';
		day = day * 10 + temp;
	}
	SetDay( day );

    g_lcd.IsSeting = 0;
	Show( 1 ); 
}

void Show( int Flag )
{
    int i;
    if( Flag == 0 )
	{
	    WrOp( 0x80 );
		for( i = 0 ; i < addr_num / 2 ; i++ )
		{
		    if( i == g_lcd.CurrentIndex )
			{
			    WrDat( g_lcd.set_char );
			}
			else
			{
		        WrDat( g_lcd.ch_lcd[i]);
			} 			
		}
		WrOp( 0xC0 ); 
		for( i = addr_num /2 ; i < addr_num ; i++ )
		{
		    WrDat( g_lcd.ch_lcd[i] );
		}  
	}
	if( Flag == 1 )
	{
	    WrOp( 0x80 );
		for( i = 0 ; i < addr_num / 2 ; i++ )
		{
		    WrDat( g_lcd.ch_lcd[i]); 			
		}
		WrOp( 0xC0 )  ;
		for( i = addr_num /2 ; i < addr_num ; i++ )
		{
		    WrDat( g_lcd.ch_lcd[i] );
		}  
	}
}

int Judge2Day()
{
    int result=0, year=0 ,tmp = 0;
	year += ( g_lcd.ch_lcd[8] - '0' );
	tmp = ( g_lcd.ch_lcd[7] - '0' )	;
	year += tmp << 8;
	tmp = 0; 
	tmp = ( g_lcd.ch_lcd[6] - '0' )	 ;
	year += tmp << 16;
	tmp = g_lcd.ch_lcd[5]- '0';
	year += ( tmp << 24 ) ;	    //
	if( year % 100 == 0)
	{
	    if( year % 400 == 0 )
		  result = 29;
		else 
		   result = 28; 
	}
	else
	{
	   if( year % 4 == 0)
	     result = 29;
	   else 
	     result = 28; 
	}
	return result ;
}

int JudgeDage( uint8 dat1,uint8 dat2 )
{
    int result ;
    if( dat1 == '1' )
	{						   
	   if( dat2 == '0' || dat2 == '2' )
	     result = 31;
	   if( dat2 == '1' )
	     result = 30;
	}
	if( dat1 == '0' )						   
	{
	   if( dat2 == '1' || dat2 =='3'|| dat2	=='5'|| dat2 == '7' || dat2==8)
	      result = 31;
	   if( dat2 == '4' || dat2 == '6' || dat2 == '9')
	      result = 30;
	   if ( dat2 == '2' )
	      return Judge2Day();
	}
	return result;
}

 
//
uint8 Increase( uint8 val )
{
    val = ( ( val ) - '0' + 1 ) % 10 + '0';
	return val;
}

uint8 Decrease( uint8 val )
{
    val = ( ( val ) - '0' -1 + 10 ) % 10 + '0' ;
	return val;
}

void SetCursor( int direction )
{
    uint8 tmp = 0 ;
    switch ( direction )
	{
	 case Flag_Cursor_Move_left:  	     
	     if( g_lcd.Set_addr > 0x85 && g_lcd.Set_addr <= 0x8E )
		 {
		     if( g_lcd.Set_addr == 0x8A )
	       	 {
		         g_lcd.Set_addr = 0x88;
		    	 g_lcd.CurrentIndex = 8;
	    	 }
		     else if( g_lcd.Set_addr == 0x8D )
		     {
		         g_lcd.Set_addr = 0x8B;
		    	 g_lcd.CurrentIndex = 11;
	    	 }
			 else
			 {
			     g_lcd.Set_addr = g_lcd.Set_addr - 1 ;
			     g_lcd.CurrentIndex--;
			 }
		 }
         break;
	 case Flag_Cursor_Move_right:
	     if( g_lcd.Set_addr >=0x85 && g_lcd.Set_addr < 0x8E )
		 {								 
		     if( g_lcd.Set_addr == 0x88 )
			 {
			     g_lcd.Set_addr = g_lcd.Set_addr + 2;
				 g_lcd.CurrentIndex = 10;
			 }
			 else if( g_lcd.Set_addr == 0x8B )
			 {
			     g_lcd.Set_addr = 0x8D;
				 g_lcd.CurrentIndex = 13;
			 }
			 else
			 {
			     g_lcd.Set_addr++ ;
			     g_lcd.CurrentIndex++;
			 }
		 }
	     break;
	 case Flag_Value_Increase:
	     tmp = Increase( g_lcd.ch_lcd[g_lcd.CurrentIndex] );
		 if( (g_lcd.CurrentIndex == 10 ) && (tmp == '2' ) )//	 
		 {
		    tmp = '0';
		 }
		 else if( g_lcd.CurrentIndex == 11 && g_lcd.ch_lcd[g_lcd.CurrentIndex-1] == '1' && tmp > '2' )
		 {
		     tmp = '0';
		 }
		 else if( (g_lcd.CurrentIndex == 13 ) && tmp == '4' )
		 {
		     tmp = '0';
		 }
		 
		 g_lcd.ch_lcd[g_lcd.CurrentIndex] = tmp;
	     break;
	 case Flag_Value_Decrease:
	     tmp = Decrease( g_lcd.ch_lcd[g_lcd.CurrentIndex] ) ;
		 if( g_lcd.CurrentIndex == 10 && tmp == '9' )
		 { 		     
		     tmp = '1';
		 }
		 else if( g_lcd.CurrentIndex == 11 && g_lcd.ch_lcd[g_lcd.CurrentIndex-1] == '1' && tmp > '2' )
		 {
		     tmp = '2';
		 }
		 else if ( g_lcd.CurrentIndex == 13 && g_lcd.ch_lcd[g_lcd.CurrentIndex] == '0' && tmp == '9' )
		 {
		     tmp = '3';
		 }
		 g_lcd.ch_lcd[g_lcd.CurrentIndex] = tmp ;
	     break;
	}
	Show( 1 );
}

void ShowND( int data )
{ 			 
    char tmp;
	data = data & 0x03FF;
	data = data * 10000;
	data = data / 0x03FF;

	tmp = data % 10;
	data = ( data - tmp )/10;
	tmp = tmp + '0';
	g_lcd.ch_lcd[29] = tmp;
    
	tmp = data % 10 ;
	data = (data - tmp) / 10;
	tmp = tmp + '0';
	g_lcd.ch_lcd[28] = tmp;

	tmp = data %10;
	data = ( data - tmp ) / 10;
	tmp = tmp + '0';
	g_lcd.ch_lcd[26] = tmp;

	tmp = data%10;
	g_lcd.ch_lcd[25] = tmp + '0';
}

void ShowComm( char* data )
{   
} 

⌨️ 快捷键说明

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