#include "LPC24xx.h" /* LPC2xxx definitions */
#include "type.h"
#include "timer.h"
#include "fio.h"
#include "uart.h"
#include "Key.h"
#include "LCD.h"
#include "char_lib.h"
extern void timer1_Delay(WORD ms);
volatile char line_counter,col_counter,start_line,full_flag;
//**************************************************
// 初始化
//**************************************************
void LCD_init(void)
{
char m;
char *LCD_ptr;
line_counter = 0;
col_counter = 0;;
start_line = 0;
full_flag = 0;
FIO1MASK = 0;
LCD_CS_H; // CS高
PINSEL3 &=0x000003FF; // 引脚功能选择
IODIR1|= 0xFFE00000; // 引脚方向--输出
IOPIN1 &=~(0xFF<<23); // D0-D7低
LCD_EN_H; // EN高
LCD_A0_data; // A0高
LCD_RW_read; // RW高
LCD_CS_L;
LCD_write_cmd(0xAF); // 开始显示 CMD_display_on
LCD_write_cmd(0x40); // 发送起始行地址 CMD_set_line(x)
LCD_write_cmd(0xA0); // 设置屏幕正向 CMD_set_ADC_n
LCD_write_cmd(0xA6); // 极性 CMD_set_polarity
LCD_write_cmd(0xA2); // 偏压 CMD_set_bias
LCD_write_cmd(0xC8); // 正反 CMD_output_mode
LCD_write_cmd(0x2F); // 电源 CMD_set_power
LCD_write_cmd(0x24); // 倍压比 CMD_set_ration
LCD_write_cmd(0x81); // 亮度 CMD_volume_Mode
LCD_write_cmd(0x24); // 亮度 CMD_volume_Md(0x24)
LCD_write_cmd(0xAC); // 不闪烁 CMD_Static_off
LCD_CS_H; // CS高
line_counter = 0;
clear_line(line_total,line_counter); // 清屏
line_counter = 1; // 显示"福星晓程"
col_counter = 2;
LCD_ptr = (char*)play_logo;
LCD_CS_L;
for(m=0;m<logo_len;m++)
{
LCD_play_character(line_counter,col_counter,column_mun_logo,LCD_ptr); //column_mun_logo
LCD_ptr += column_mun_logo * page_mun;
col_counter++;
}
line_counter = 0; // 清屏
clear_line(page_mun*2,line_counter);
LCD_CS_L;
LCD_write_cmd(0x40); // 设起始行
LCD_CS_H;
line_counter = 0;
col_counter = 0;
full_flag = 0;
start_line = 0;
}
//**************************************************
// 发送一个命令
//**************************************************
void LCD_write_cmd(char cmd_index)
{
int i;
IOPIN1 &= ~(0xFF<<23);
IOPIN1 |= cmd_index<<23;
LCD_A0_cmd; // A0--cmd
LCD_RW_write; // RW--write
for(i=0;i<hold_time;i++);
LCD_EN_L; // EN--L
for(i=0;i<hold_time;i++);
LCD_EN_H; // EN恢复高电平
LCD_A0_data; // A0恢复高电平
LCD_RW_read; // RW恢复高电平
IOPIN1 &=~(0xFF<<23); // D0-D7清0
}
//**************************************************
// 发送一个数据
//**************************************************
void LCD_write_data(char play_data)
{
int i;
IOPIN1 &= ~(0xFF<<23);
IOPIN1 |= play_data<<23;
LCD_A0_data; // A0--data
LCD_RW_write; // RW--write
for(i=0;i<hold_time;i++);
LCD_EN_L; // EN--L
for(i=0;i<hold_time;i++);
LCD_EN_H; // EN恢复高电平
LCD_RW_read; // RW恢复高电平
IOPIN1 &=~(0xFF<<23); // D0-D7清0
}
//**************************************************
// 显示一个字符
// input: addr_page, addr_col, col_mun, *pp
// (第几行字符)(第几列字符)(字符点阵有几列)(字库首地址)
//**************************************************
void LCD_play_character(char addr_page,char addr_col,char col_mun,char *pp)
{
BYTE i,j,counter;
addr_page = addr_page*page_mun;
addr_col = addr_col*col_mun;
counter = addr_col;
if((addr_page>=page_total)&&(addr_col>=col_total)) return;
send_page_addr(addr_page); // 发送页地址(addr_page)
send_col_addr(addr_col); // 发送列地址(addr_col)
for(i=0;i<page_mun;i++)
{
for(j=0;j<col_mun;j++)
{
LCD_write_data(*pp);
pp++;
counter++;
send_col_addr(counter);
}
send_page_addr(addr_page+1);
send_col_addr(addr_col);
counter = addr_col;
}
}
//**************************************************
// 显示一个字符串
// input: *ptr, len, line_count, col_count
// (字符串首地址)(字符串长度)(显示在第几行)(显示在第几列)
//**************************************************
void LCD_play_string(char *ptr,char len)
{
char *addr;
char dummy;
if(len==0) return;
if(full_flag==0x55) //如果是满屏的
{
#if LCD_roll // 如果需要滚屏
switch(start_line)
{
case 0:
start_line = page_mun*2+1;
break;
default:
start_line += page_mun*2; //page_mun*8
break;
}
dummy = CMD_set_line(start_line);
LCD_CS_L;
LCD_write_cmd(dummy); // 翻屏
LCD_CS_H;
clear_line(1,line_counter); // 清行
col_counter=0;
#else
if(line_counter==0)
{
clear_line(line_total,0); //清屏
col_counter=0;
full_flag=0;
}
#endif
}
dummy = col_total/column_mun; // 如果字数超了,就只显示最大长度
if(len>dummy)
len = dummy;
while(len)
{
LCD_CS_L;
dummy = *(ptr++);
addr = (char*)play_null;
if(dummy<='9') //column_mun*page_mun
{
if(dummy>='0')
{ addr = (char*)play_0 + (dummy-'0')*page_mun*column_mun;
goto play_character; }
}
if(dummy<='Z')
{
if(dummy>='A')
{ addr = (char*)play_A + (dummy-'A')*page_mun*column_mun;
goto play_character; }
}
if(dummy<='z')
{
if(dummy>='a')
{ addr = (char*)play_a + (dummy-'a')*page_mun*column_mun;
goto play_character; }
}
play_character:
LCD_play_character(line_counter,col_counter,column_mun,addr); //显示字符
col_counter++;
len--;
LCD_CS_H;
}
line_counter++;
col_counter = 0;
if(line_counter==line_total) // 如果满屏:置满屏标志
{
full_flag = 0x55;
line_counter = 0;
start_line = 0;
}
}
//**************************************************
// 清屏
// input: total(一共清几行) line_num(从第几开始清)
//**************************************************
void clear_line(char total,char line_num)
{
char i,j;
LCD_CS_L;
if(line_num >= line_total) return;
if(line_num > total) return;
line_num *= page_mun;
total *= page_mun;
i = line_num+total;
if(i > page_total)
{total = page_total - line_num;}
for(i=0;i<total;i++) // 清屏
{
send_page_addr(line_num); // 页地址
for(j=0;j<col_total;j++)
{
send_col_addr(j); // 列地址
LCD_write_data(0);
}
line_num++;
}
LCD_CS_H;
}
//**************************************************
// 发送页地址
// input:
//**************************************************
void send_page_addr(char p_addr)
{
char cmd_p;
cmd_p = CMD_set_page(p_addr); // 页地址加1
LCD_write_cmd(cmd_p);
}
//**************************************************
// 发送列地址
// input:
//**************************************************
void send_col_addr(char c_addr)
{
char cmd_c;
cmd_c = CMD_set_col_H(c_addr); // 高
LCD_write_cmd(cmd_c);
cmd_c = CMD_set_col_L(c_addr); // 低
LCD_write_cmd(cmd_c);
}