📄 lcd.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 + -