Files

307 lines
6.0 KiB
C
Executable File

#include <string.h>
#include <stdio.h>
#include "../inc/type.h"
#include "../inc/config.h"
#include "../inc/lcd.h"
#include "../inc/os_task.h"
#include "../inc/delay.h"
#include "../inc/isys_com.h"
#if USE_LCD_CACHE
static char lcd_cache[2][42];
#endif
#define LCD_HW_SUPPORT_CHAR_TYPE 88
uint8 lcd_show_char[LCD_HW_SUPPORT_CHAR_TYPE] =
{
'!','$','$','%','&','(',')','*','+',',','-','.',
'0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?',
'@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
'P','Q','R','S','T','U','V','W','X','Y','Z','[',']','^','_',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',
'q','r','s','t','u','v','w','x','y','z','{','|','}'
};
const uint32 c_lcd_gpio_arry[8]=
{
LCD_D0_GP_NUM,
LCD_D1_GP_NUM,
LCD_D2_GP_NUM,
LCD_D3_GP_NUM,
LCD_D4_GP_NUM,
LCD_D5_GP_NUM,
LCD_D6_GP_NUM,
LCD_D7_GP_NUM
};
static void LCD_EN_SET(void)
{
set_gpio_value(LCD_E_GP_NUM, E_IO_H);
}
static void LCD_EN_CLEAR(void)
{
set_gpio_value(LCD_E_GP_NUM, E_IO_L);
}
static void LCD_RW_CLEAR(void)
{
set_gpio_value(LCD_RW_GP_NUM, E_IO_L);
}
static void LCD_RS_SET(void)
{
set_gpio_value(LCD_RS_GP_NUM, E_IO_H);
}
static void LCD_RS_CLEAR(void)
{
set_gpio_value(LCD_RS_GP_NUM, E_IO_L);
}
static void LCD_EN_Write(void)
{
LCD_EN_SET();
delay_us(20);
LCD_EN_CLEAR();
delay_us(20);
}
static void Lcd_Write_Data(uint8 LCD_DATA)
{
uint16 data;
uint8 temp;
uint8 i;
LCD_RW_CLEAR();
LCD_RS_SET();
for (i = 0; i < 8; i++)
{
temp = (LCD_DATA >> i) & 0x01;
set_gpio_value(c_lcd_gpio_arry[i], (E_IO_VAL)temp);
}
LCD_EN_Write();
}
static void Lcd_Write_Cmd(uint8 LCD_CMD)
{
uint16 data;
uint8 temp;
uint8 i;
LCD_RW_CLEAR();
LCD_RS_CLEAR();
for (i = 0; i < 8; i++)
{
temp = (LCD_CMD >> i) & 0x01;
set_gpio_value(c_lcd_gpio_arry[i], (E_IO_VAL)temp);
}
LCD_EN_Write();
}
#define LCD_INIT_TIME 3//
void lcd_init(void)
{
int i = 0;
log_printf(LOG_INFO, I_SYS_STATUS, "init lcd display.\n");
do {
//delay_ms(150);
Lcd_Write_Cmd(0x38);
delay_ms(1);
Lcd_Write_Cmd(0x0c);
delay_ms(1);
Lcd_Write_Cmd(0x01);
delay_ms(500);
}while(++i<LCD_INIT_TIME);
log_printf(LOG_INFO, I_SYS_STATUS, "over. init lcd display.\n");
}
static void LCD_SET_XY(uint8 x,uint8 y)
{
if(x==0)
{
Lcd_Write_Cmd(0x80+y);
}
else
{
Lcd_Write_Cmd(0xc0+y);
}
}
void lcd_write_arrow(uint32 x,uint32 y,ARROW_DIRECTON direct)
{
#if USE_LCD_CACHE
if(direct==ARROW_LEFT)
{
lcd_cache[x][y]=0x7f;
#if ARROW_CHAR_NUM==2
lcd_cache[x][y+1]=0x2d;
#endif
}
else if(direct==ARROW_RIGHT)
{
#if ARROW_CHAR_NUM==2
lcd_cache[x][y]=0x2d;
lcd_cache[x][y+1]=0x7e;
#else
lcd_cache[x][y]=0x7e;
#endif
}
#else
if(direct==ARROW_LEFT)
{
LCD_SET_XY(x,y);
delay_us(5);
Lcd_Write_Data(0x7f);
#if ARROW_CHAR_NUM==2
Lcd_Write_Data(0x2D);
#endif
}
else if(direct==ARROW_RIGHT)
{
LCD_SET_XY(x,y);
delay_us(5);
#if ARROW_CHAR_NUM==2
Lcd_Write_Data(0x2D);
#endif
Lcd_Write_Data(0x7e);
}
#endif
}
void lcd_write_temp_f(uint8 x,uint8 y)
{
#if USE_LCD_CACHE
if((x==LINE_1)||(x==LINE_2))
{
lcd_cache[x][y]=0xdf;
lcd_cache[x][y+1]='F';
}
#else
LCD_SET_XY(x,y);
delay_us(5);
Lcd_Write_Data(0xdf);
Lcd_Write_Data('F');
#endif
}
void lcd_write_temp_c(uint8 x,uint8 y)
{
#if USE_LCD_CACHE
if((x==LINE_1)||(x==LINE_2))
{
lcd_cache[x][y]=0xdf;
lcd_cache[x][y+1]='C';
}
#else
LCD_SET_XY(x,y);
delay_us(5);
Lcd_Write_Data(0xdf);
Lcd_Write_Data('C');
#endif
}
void lcd_write_string(uint8 X,uint8 Y,void *s)
{
#if USE_LCD_CACHE
uint32 i = 0;
char *pstr = (char*)s;
if(1)//sys_ready
{
if(X==LINE_1)
{
i = strlen((const char *)pstr)>LCD_CHAR_NUM-Y?LCD_CHAR_NUM-Y:strlen((const char *)pstr);
memcpy(&lcd_cache[0][Y],pstr,i);
}
if(X==LINE_2)
{
i = strlen((const char *)pstr)>LCD_CHAR_NUM-Y?LCD_CHAR_NUM-Y:strlen((const char *)pstr);
memcpy(&lcd_cache[1][Y],pstr,i);
}
}
else
{
LCD_SET_XY( X, Y );
delay_us(10);
while(*pstr)
{
Lcd_Write_Data(*pstr++);
}
}
#else
char *pstr = (char*)s;
LCD_SET_XY( X, Y );
delay_us(10);
while(*pstr)
{
Lcd_Write_Data(*pstr++);
}
#endif
}
void lcd_write_cache(void)
{
#if USE_LCD_CACHE
uint32 i = 0;
if(1)//sys_ready
{
LCD_SET_XY(0,0);
delay_us(10);
for(i=0;i<LCD_CHAR_NUM;i++)
{
Lcd_Write_Data(lcd_cache[0][i]);
}
LCD_SET_XY(1,0);
delay_us(10);
for(i=0;i<LCD_CHAR_NUM;i++)
{
Lcd_Write_Data(lcd_cache[1][i]);
}
}
#else
#endif
}
/***********************************/
// LCD backup light control
/***********************************/
//turn on the light
void light_on(void)
{
//log_printf(LOG_INFO, I_SYS_STATUS, "Turn on LCD light\n");
set_gpio_value(LCD_CTL_GP_NUM, E_IO_H);
}
void light_off(void)
{
log_printf(LOG_INFO, I_SYS_STATUS, "Turn off LCD light\n");
set_gpio_value(LCD_CTL_GP_NUM, E_IO_L);
}
void set_gpio_fpga_reset(uint8 set_val)
{
if(set_val==1){
printf("set_gpio_fpga_reset High\n");
set_gpio_value(FPGA_RST_GP_NUM, E_IO_H);
}
else{
printf("set_gpio_fpga_reset Low\n");
set_gpio_value(FPGA_RST_GP_NUM, E_IO_L);
}
}
/**********************************************END**************************************/