📄 flash_hx8312_c51_h.c
字号:
//****************************************************
//project: YL6750_demo board
//Driver: hx8312
//pixel: 240*320
//interface:8 bit 8080 interface
//data: 2005-7-26
//Editer: qinguoxi
//****************************************************
#pragma db code
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define common 320 //common ,
#define segment 240 //segment
//port define
#define PORT P0
//LCM interface
sbit CS_MAIN=P1^7; //chip select signal
sbit RES=P1^6; //reset signal
sbit DC=P1^5; //data/command control signal
sbit WRITE=P1^4; //write strobe signal
sbit READ=P1^3;
//shift key
sbit KEY5=P1^1; //waitkey
//k9f5608(flash rom) interface
sbit RB=P3^1;
sbit RE=P3^2;
sbit CE=P3^3;
sbit CLE=P3^4;
sbit ALE=P3^5;
sbit WE=P3^6;
sbit WP=P3^7;
/****************************************************************************
** 函数声明
*****************************************************************************/
void LCD_write_d(uchar dat);
void LCD_write_c(uchar com);
uchar LCD_read_d(void);
void cpu_initial(void);
void init_lcd(void);
void clear_ram();
void MainLcdFill(uchar A,uchar B );
void showRGBW(void);
void volum_rgb_display(void);
void picture_display(unsigned char *pi);
void Delay(uint adj);
void LCD_reset(void);
void waitkey(void);
void reset_flash();
void rb_ready();
void flash_address_write(uint addr);
void flash_command_write(uchar com);
void read_flash(uint page_address);
void moving_display(uint page_start_address,uint page_number);
void flash_picture_display(uint page_start_address,uint page_number);
void moving_line();
void gui_vline(uint x0,uint y0,uint y1,uint color);
void gui_fillscr(uint fill_color);
void gui_clearscr(void);
uint gui_point(uint x,uint y,uint color);
void gui_hline(uint x0,uint y0,uint x1,uint color);
void gui_vline(uint x0,uint y0,uint y1,uint color);
void text_display(uint x,uint y,uint xx,uint yy,uint backh_color,uint backl_color,uint txth_color,uint txtl_color, uchar *pi);
void text_moving();
code unsigned char txt1[];
code unsigned char txt2[];
code unsigned char pic1[];
uchar text_buff[32];
uint page; //flash rom 页码计数
/************************************************************
//主函数
*************************************************************/
void main()
{
cpu_initial();
LCD_reset();
init_lcd();
reset_flash();
Delay(1);
while(1)
{
page=0;
flash_picture_display(0x0000,8);
// text_moving();
// waitkey();
Delay(1000);
MainLcdFill(0xf8,0x00);
// waitkey();
Delay(1000);
MainLcdFill(0x07,0xe0);
// waitkey();
Delay(1000);
MainLcdFill(0x00,0x1f);
// waitkey();
Delay(4000);
/*
MainLcdFill(0x00,0x00);
waitkey();
// Delay(4000);
MainLcdFill(0xff,0xff);
waitkey();
// Delay(4000);
showRGBW();
waitkey();
// Delay(4000);
volum_rgb_display();
waitkey();
// Delay(4000);
// picture_display(pic1);
// waitkey();
// Delay(4000);
*/
// moving_display(0x0000,482);
// waitkey();
// Delay(4000);
}
}
/*===========================================================================
** 函数名称: text_display()
** 功能描述: 在指定位置显示汉字
** 入口参数:X-文字位置x坐标,Y-文字位置Y坐标,xx-字体宽,yy-字体高,
** backh(l)_color-背景颜色高(底)位,txth(l)_color-字体颜色高(低)位
** 注意: 字体高必须为8的整数倍
** 出口参数:
============================================================================*/
void text_display(uint x,uint y,uint xx,uint yy,uint backh_color,uint backl_color,uint txth_color,uint txtl_color, uchar *pi)
{
uint ii,mm,jj;
uchar charter;
for(ii=0;ii<yy;ii++)
{
for(mm=0;mm<xx/8;mm++)
{
charter=*pi;
for(jj=0;jj<8;jj++)
{
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(y+ii);
LCD_write_d(x+mm*8+jj);
LCD_write_c(0x00);
LCD_write_c(0x22);
if((charter&0x80)==0)
{
LCD_write_d(backh_color);
LCD_write_d(backl_color);
}
else
{
LCD_write_d(txth_color);
LCD_write_d(txtl_color);
}
charter<<=1;
}
pi++;
}
}
}
/*===========================================================================
** 函数名称: text_moving()
** 功能描述: 移动显示汉字
** 入口参数:
** 出口参数:
============================================================================*/
void text_moving()
{
uchar rd1,rd2;
uint mm1,mm2,mm;
mm=0;
//显示字体背景竖条
for(mm=5;mm<154;mm++)
{
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(mm);
LCD_write_d(29);
LCD_write_c(0x00);
LCD_write_c(0x22);
for(mm1=0;mm1<18;mm1++)
{
LCD_write_d(0x00);
LCD_write_d(0x00);
}
}
/*
waitkey();
//方式1:直接写CGRAM移动显示字体
for(mm=5;mm<138;mm++)
{
text_display(30,mm,16,16,0x00,0x00,0xff,0xff, txt1);
// text_display(30,16,16,16,0x00,0x00,0xff,0xff, txt2);
Delay(100);
}
waitkey();
*/
text_display(30,10,16,16,0x00,0x00,0xff,0xff, txt1);
//方式2:读CGRAM移动字体
waitkey();
for(mm=0;mm<160;mm++)
{
for(mm2=0;mm2<16;mm2++)
{
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(5);
LCD_write_d(30+mm2);
LCD_write_c(0x00);
LCD_write_c(0x22);
LCD_read_d();
LCD_read_d();
text_buff[2*mm2]=LCD_read_d();
text_buff[2*mm2+1]=LCD_read_d();
Delay(1);
}
for(mm1=6;mm1<154;mm1++)
{
for(mm2=0;mm2<16;mm2++)
{
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(mm1);
LCD_write_d(30+mm2);
LCD_write_c(0x00);
LCD_write_c(0x22);
LCD_read_d();
LCD_read_d();
rd1=LCD_read_d();
rd2=LCD_read_d();
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(mm1-1);
LCD_write_d(30+mm2);
LCD_write_c(0x00);
LCD_write_c(0x22);
LCD_write_d(rd1);
LCD_write_d(rd2);
}
}
for(mm2=0;mm2<16;mm2++)
{
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(153);
LCD_write_d(30+mm2);
LCD_write_c(0x00);
LCD_write_c(0x22);
LCD_write_d(text_buff[2*mm2]);
LCD_write_d(text_buff[2*mm2+1]);
}
// Delay(100);
}
}
/*===========================================================================
** 函数名称: gui_fillscr()
** 功能描述: 填充RGB颜色;
============================================================================*/
void gui_fillscr(uint fill_color)
{
uint tt,ll;
LCD_write_c(0x00);
LCD_write_c(0x22);
for(ll=0;ll<common;ll++)
{
for(tt=0;tt<segment;tt++)
{
LCD_write_d(fill_color>>8);
LCD_write_d(fill_color&0x00ff);
}
}
}
/*===========================================================================
** 函数名称: gui_clearscr()
** 功能描述: 清屏;
============================================================================*/
void gui_clearscr(void)
{
gui_fillscr(0x0000);
}
/*===========================================================================
** 函数名称: gui_point()
** 功能描述: 在(x,y)坐标上画出一点
** 入口参数:X,点的X坐标,y,点的y坐标,color,点的颜色值
** 出口参数:
============================================================================*/
uint gui_point(uint x,uint y,uint color)
{
if(x>=segment|y>=common)
return(0);
else
{
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(y);
LCD_write_d(x);
LCD_write_c(0x00); // ram data write
LCD_write_c(0x22);
LCD_write_d(color>>8);
LCD_write_d(color&0x00ff);
return(1);
}
LCD_write_c(0x00); // RAM address set
LCD_write_c(0x21);
LCD_write_d(0x00);
LCD_write_d(0x02);
}
/*===========================================================================
** 函数名称: gui_hline()
** 功能描述: 画水平线
** 入口参数:x0,x1,起点,终点的X坐标,y0,水平线y坐标,color,线条的颜色值
** 出口参数:
============================================================================*/
void gui_hline(uint x0,uint y0,uint x1,uint color)
{
uint bak;
if(x0>x1)
{
bak=x1;
x1=x0;
x0=bak;
}
do
{
gui_point(x0,y0,color);
x0++;
}while(x1>=x0);
}
/*===========================================================================
** 函数名称: gui_vline()
** 功能描述: 画垂直线
** 入口参数:x0,垂直线X坐标,y0,y1,水平线起点,终点y坐标,color,线条的颜色值
** 出口参数:
============================================================================*/
void gui_vline(uint x0,uint y0,uint y1,uint color)
{
uint bak;
if(y0>y1)
{
bak=y1;
y1=y0;
y0=bak;
}
do
{
gui_point(x0,y0,color);
y0++;
}while(y1>=y0);
}
/*===========================================================================
** 函数名称: moving_display()
** 功能描述: 显示动画
** 入口参数: page_start_address:首幅图像数据储存在flash 中的页地址A24-A9,
pict_number: 图像幅数
** 出口参数: 无
============================================================================*/
void moving_display(uint page_start_address,uint pict_number)
{
uint kk;
for(kk=0;kk<pict_number;kk++)
read_flash(page_start_address);
}
/*===========================================================================
** 函数名称: picture_display()
** 功能描述: 显示图像
** 入口参数: page_start_address:首幅图像数据储存在flash 中的页地址A24-A9,
pict_number: 图像幅数
** 出口参数: 无
============================================================================*/
void flash_picture_display(uint page_start_address,uint pict_number)
{
uint kk;
for(kk=0;kk<pict_number;kk++)
{
read_flash(page_start_address);
Delay(2000);
// waitkey();
}
}
/*===========================================================================
** 函数名称: flash_command_write(uchar com)
** 功能描述: 写指令到Flash_rom
** 入口参数: com:k9f5608(flash rom) 指令码
** 出口参数: 无
============================================================================*/
void flash_command_write(uchar com)
{
CE=0;
PORT=com;
CLE=1;
ALE=0;
WE=0;
WE=0;
WE=1;
WE=1;
CLE=0;
ALE=0;
}
/*===========================================================================
** 函数名称: flash_address_write(uchar com)
** 功能描述: 写地址到Flash_rom
** 入口参数: addr:flash rom 地址高16位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -