/* YM12864I整屏显示一幅128×64的图像,图像取模数据必须纵向取模、字节倒序,且图像数据必须以const标识;高速ARM核对低速LCD操作,读写前必须查询LCD设备状态寄存器Busy位,待Busy=0时方可继续读写,否则LCD将显示乱码。
***************************************************************************************************
** 模 块 名:Main.c
** 功能描述:驱动芯片KS0108或兼容芯
** 创建日期: by:CANopen
** 修改日期: by:
***************************************************************************************************
*/
#i nclude "Config.h"
#i nclude "LCD_Data.c"
/*************************************************
模块级变量申明
*************************************************/
//static void LCD_SetX(int8u pageX);
//static void LCD_SetY(int8u colY);
//static void LCD_WriteCmd(int8u cmd);
//static void LCD_WriteDat(int8u dat);
//
//static void LCD_SetStartRow(int8u startRow);
/*************************************************
子函数定义
*************************************************/
/*
***************************************************************************************************
*** 函 数 名:LCD_WriteCmd
*** 功能描述:写入命令字
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
static void LCD_WriteCmd(int8u lr,int8u cmd)
{
if(LCDL == lr) //;是否对左屏幕操作
{
while((LcdStatusAddr_L & 0x80)); // 查询Busy位
LcdCmdAddr_L = cmd;
}
else
{
while((LcdStatusAddr_R & 0x80)); // 查询Busy位
LcdCmdAddr_R = cmd;
}
}
/*
***************************************************************************************************
*** 函 数 名:LCD_WriteDat
*** 功能描述:向DDRAM写入数据
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
static void LCD_WriteDat(int8u lr,int8u dat)
{
if(LCDL == lr) //;是否对左屏幕操作
{
while((LcdStatusAddr_L & 0x80)); // 查询Busy位
LcdDatWriteAddr_L = dat;
}
else
{
while((LcdStatusAddr_R & 0x80)); // 查询Busy位
LcdDatWriteAddr_R = dat;
}
}
/*******************************************************************************
*** 函 数 名: static void LCD_SetX(int8u pageX)
*** 功能描述: 设置页面地址,对应屏幕上的行地址
*** 全局变量: NO !
*** 输 入: pageX;
*** 输 出: NO !
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明:
******************************************************************************/
static void LCD_SetX(int8u lr,int8u pageX)
{
pageX %= 8;
LCD_WriteCmd(lr,pageX | 0xb8);
}
/*
***************************************************************************************************
*** 函 数 名:LCD_SetY
*** 功能描述:设置列地址
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
static void LCD_SetY(int8u lr,int8u colY)
{
colY %= 64;
LCD_WriteCmd(lr,colY | 0x40);
}
/*
***************************************************************************************************
*** 函 数 名:LCD_SetStartRow
*** 功能描述:设首行地址
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
static void LCD_SetStartRow(int8u lr,int8u startRow)
{
LCD_WriteCmd(lr,startRow | 0xc0);
}
/*
***************************************************************************************************
*** 函 数 名:LCD_Clear
*** 功能描述:整屏清零
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
extern void LCD_Clear(void)
{
int8u i,j;
for(i=0;i<8;i++)
{
LCD_SetX(0,i); //设置页地址
LCD_SetY(0,0);
LCD_SetX(1,i); //设置列地址
LCD_SetY(1,0);
for(j=0;j<64;j++)
{
LCD_WriteDat(0,0x00); //显示RAM清零
LCD_WriteDat(1,0x00);
}
}
}
/*
***************************************************************************************************
*** 函 数 名:LCD_BL_Set
*** 功能描述:打开/关闭背光backlight,由P1.23引脚接驱动电路设置
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
void LCD_BL_Set(int8u val)
{
if(TRUE == val)
IO1CLR = IO1CLR | (__1 << 23);
else
IO1SET = IO1SET | (__1 << 23);
}
/*
***************************************************************************************************
*** 函 数 名:Delay_ms
*** 功能描述:延时函数,单位:ms
*** 输入输出:
*** 创建日期:2007-4-24 5:18 by:CANopen
*** 修改日期:2007-4-24 5:18 by:
***************************************************************************************************
*/
void Delay_ms(int32u ms)
{
int32u tmp = ( Fcclk / 1000 ) * ms / 2 ;
while(tmp--); //本语句编译后为两条汇编指令
}
/*
***************************************************************************************************
*** 函 数 名:LCD_Init
*** 功能描述:LCD YM12864I初始化
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
extern void LCD_Init(void)
{
LCD_WriteCmd(0,0x3F); // 开显示,指令码:0x3f
LCD_WriteCmd(1,0x3F);
Delay_ms(100);
while(LcdStatusAddr_L & 0x20) // 是否打开显示
{
LCD_WriteCmd(0,0x3F);
}
while(LcdStatusAddr_R & 0x20)
{
LCD_WriteCmd(1,0x3F);
}
LCD_BL_Set(1); // 1:打开背光
LCD_Clear(); // 清屏
LCD_SetStartRow(0,0x00); // 设置首行
LCD_SetStartRow(1,0x00); // 设置首行
}
/*
***************************************************************************************************
*** 函 数 名:LCD_DisplayPic
*** 功能描述:整屏显示一副图像128×64
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
extern void LCD_DisplayPic(const int8u *pic_dat)
{
int8u i,j;
//int32u cnt=0;
for(j=0;j<8;j++)
{
LCD_SetX(0,j);
LCD_SetY(0,0);
for(i=0;i<64;i++)
{
LCD_WriteDat(0,pic_dat[j*128+i]);
//cnt = cnt + 1;
}
LCD_SetX(1,j);
LCD_SetY(1,0);
for(i=0;i<64;i++)
{
LCD_WriteDat(1,pic_dat[j*128+64+i]); // 64+i:是因为图像数据取模时确定的
//cnt = cnt + 1;
}
}
}
/*
***************************************************************************************************
*** 函 数 名:Main
*** 功能描述:应用程序入口函数
*** 输入输出:
*** 创建日期: by:
*** 修改日期: by:
***************************************************************************************************
*/
int Main(void)
{
int8u row = 0;
TargetInit();
LCD_Init();
/*--------------------------------
应用程序代码
--------------------------------*/
LCD_DisplayPic(pic);
while(1)
{
LCD_SetStartRow(0,row);
LCD_SetStartRow(1,row++);
Delay_ms(100);
if(row == 0x40)
row = 0;
}
return 0;
}
/*
***************************************************************************************************
**** End Of File
***************************************************************************************************
*/