|
/*
****************************************************************************************
源程序文件名: LCDM_HD61202_128D64.C
源程序名称: 128×64液晶模块(控制芯片:HD61202/3)的源程序文件
程序版本: 1.0
程序功能:
本程序是用 ATmega16 控制128×64液晶模块(控制芯片:HD61202/3)显示
的源程序文件。
程序说明:
函数入口参数:
函数出口参数:
编译工具软件: CodeVision AVR C 版本:1.24.6 以上
链接子程序文件:
编作者:
编作者 E-Mail: PTZSW@163.COM
编制日期: 2005年5月18日
------------------------------------------------------------------------------
适用器件芯片类型: ATmega16_16PI( Atmel 公司生产的8位 RISC 单片机)
器件芯片时钟频率: 11.059200 MHz
存储器模式: 小存储器模式
外部扩展存储器大小:0 【字节】
数据堆栈大小: 256 【字节】
------------------------------------------------------------------------------
源程序版本历史:
2005年5月18日 -------- 版本 1.0 :发行版本
****************************************************************************************
*/
/*======================================================================================
本源程序包括的头部文件
======================================================================================*/
#include "ATmega16.h" /* 包含目标器件芯片的头部文件 */
#include "LCDM_HD61202_128D64.h" /* 本程序的头部文件 */
#include "DELAY.H" /* 包含延时函数的头部文件 */
#include "Lattice_Character.h" /* 包含字符点阵数据表的头部文件 */
/*======================================================================================
程序指令代码清单
======================================================================================*/
/*----------------------------------------------------------------------------
函数功能: 本函数用于控制液晶模块的MCU输入/输出引脚的初始化操作。
备注: 本函数仅在主函数中调用一次即可,除非释放各控制引脚作为其他用途,
如要再使用这些控制引脚来控制液晶模块则需在主函数中再调用一次本函数。
----------------------------------------------------------------------------*/
void LCDM_initialization(void)
{
/* 下面这些语句用于设置液晶模块的各控制引脚与MCU的连接定义 */
LCDM_BL_DDR |= LCDM_BL_PINNum; /* 设置液晶的背景灯控制端口为输出引脚 */
LCDM_BL_PORT &= ~LCDM_BL_PINNum;
LCDM_DI_DDR |= LCDM_DI_PINNum; /* 设置液晶的寄存器选择控制端口为输出引脚 */
LCDM_DI_PORT &= ~LCDM_DI_PINNum;
LCDM_RW_DDR |= LCDM_RW_PINNum; /* 设置液晶的读/写选择控制端口为输出引脚 */
LCDM_RW_PORT &= ~LCDM_RW_PINNum;
LCDM_EN_DDR |= LCDM_EN_PINNum; /* 设置液晶的使能信号控制端口为输出引脚 */
LCDM_EN_PORT &= ~LCDM_EN_PINNum;
LCDM_CS1_DDR |= LCDM_CS1_PINNum; /* 设置液晶的片选1控制端口为输出引脚 */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum;
LCDM_CS2_DDR |= LCDM_CS2_PINNum; /* 设置液晶的片选2控制端口为输出引脚 */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum;
LCDM_RST_DDR |= LCDM_RST_PINNum; /* 设置液晶的复位信号控制端口为输出引脚 */
LCDM_RST_PORT &= ~LCDM_RST_PINNum;
LCDM_DATA_DDR = 0xFF; /* 设置液晶模块的数据端口为输出引脚 */
LCDM_DATA_PORT = 0x00;
/* 下面这些语句用于液晶模块的初始化复位 */
LCDM_RST_PORT &= ~LCDM_RST_PINNum; /* 置复位信号为低电平 */
delay_ms(2);
LCDM_RST_PORT |= LCDM_RST_PINNum; /* 置复位信号为高电平 */
delay_ms(2);
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于控制液晶模块背景灯打开/关闭的操作。
函数入口参数:BL_status ------ 仅可取二个值 ON 或 OFF 中的一个。
----------------------------------------------------------------------------*/
void LCDM_BackgroundLight(Uchar8 BL_status)
{
if (BL_status == ON)
{
LCDM_BL_DDR |= LCDM_BL_PINNum; /* 设置液晶的背景灯控制端口为输出引脚 */
LCDM_BL_PORT |= LCDM_BL_PINNum; /* 打开液晶的背景灯 */
delay_us(2); /* 延时2us */
}
if (BL_status == OFF)
{
LCDM_BL_DDR |= LCDM_BL_PINNum; /* 设置液晶的背景灯控制端口为输出引脚 */
LCDM_BL_PORT &= ~LCDM_BL_PINNum; /* 关闭液晶的背景灯 */
delay_us(2); /* 延时2us */
}
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于控制液晶模块显示打开/关闭的操作。
函数入口参数:Dpy_status ------ 仅可取二个值 ON 或 OFF 中的一个。
----------------------------------------------------------------------------*/
void LCDM_Display(Uchar8 Dpy_status)
{
if (Dpy_status == ON)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器选择为L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置读/写选择为L */
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片选1为H */
/* 将打开液晶显示的控制指令字输出到片1的数据端口 */
LCDM_DATA_PORT = LCDM_ON_Display;
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片选1为L */
LCDM_CS2_PORT |= LCDM_CS2_PINNum; /* 置片选2为H */
/* 将打开液晶显示的控制指令字输出到片2的数据端口 */
LCDM_DATA_PORT = LCDM_ON_Display;
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片选2为L */
}
if (Dpy_status == OFF)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器选择为L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置读/写选择为L */
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片选1为H */
/* 将关闭液晶显示的控制指令字输出到片1的数据端口 */
LCDM_DATA_PORT = LCDM_OFF_Display;
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片选1为L */
LCDM_CS2_PORT |= LCDM_CS2_PINNum; /* 置片选2为H */
/* 将关闭液晶显示的控制指令字输出到片2的数据端口 */
LCDM_DATA_PORT = LCDM_OFF_Display;
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片选2为L */
}
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于控制液晶模块设置显示开始行的操作。
函数入口参数:line_num ------ 开始行数值。(数值范围:line_num ≤63)
----------------------------------------------------------------------------*/
void LCDM_SetStartLine(Uchar8 line_num)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器选择为L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置读/写选择为L */
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片选1为H */
/* 将设置的开始显示行数值与控制指令字一同输出到片1的数据端口 */
LCDM_DATA_PORT = LCDM_StartLine_1 + line_num;
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片选1为L */
LCDM_CS2_PORT |= LCDM_CS2_PINNum; /* 置片选2为H */
/* 将设置的开始显示行数值与控制指令字一同输出到片2的数据端口 */
LCDM_DATA_PORT = LCDM_StartLine_1 + line_num;
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片选2为L */
}
/*----------------------------------------------------------------------------
下面这个函数用于向液晶模块写入控制指令代码。
函数入口参数:WriteCode ------ 向液晶模块写入的控制指令代码 。
WC_CSNum ------- 片选数值,仅可取二个值 CS1 或 CS2 中的一个。
----------------------------------------------------------------------------*/
void LCDM_WriteCode(Uchar8 WriteCode, Uchar8 WC_CSNum)
{
LCDM_DI_PORT &= ~LCDM_DI_PINNum; /* 置寄存器选择为L */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置读/写选择为L */
if (WC_CSNum == CS1)
{
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片选1为H */
}
if (WC_CSNum == CS2)
{
LCDM_CS1_PORT |= LCDM_CS2_PINNum; /* 置片选2为H */
}
LCDM_DATA_PORT = WriteCode; /* 将控制指令代码输出到的数据端口 */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片选1为L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片选2为L */
}
/*----------------------------------------------------------------------------
下面这个函数用于向液晶模块写入显示数据。
函数入口参数:WriteData ------ 向液晶模块写入的显示数据 。
WD_CSNum ------- 片选数值,仅可取二个值 CS1 或 CS2 中的一个。
----------------------------------------------------------------------------*/
void LCDM_WriteData(Uchar8 WriteData, Uchar8 WD_CSNum)
{
LCDM_DI_PORT |= LCDM_DI_PINNum; /* 置寄存器选择为H */
LCDM_RW_PORT &= ~LCDM_RW_PINNum; /* 置读/写选择为L */
if (WD_CSNum == CS1)
{
LCDM_CS1_PORT |= LCDM_CS1_PINNum; /* 置片选1为H */
}
if (WD_CSNum == CS2)
{
LCDM_CS1_PORT |= LCDM_CS2_PINNum; /* 置片选2为H */
}
LCDM_DATA_PORT = WriteData; /* 将显示数据输出到的数据端口 */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
delay_us(2); /* 延时2us */
LCDM_EN_PORT |= LCDM_EN_PINNum; /* 使能信号为H */
delay_us(2); /* 延时2us */
LCDM_EN_PORT &= ~LCDM_EN_PINNum; /* 使能信号为L */
LCDM_CS1_PORT &= ~LCDM_CS1_PINNum; /* 置片选1为L */
LCDM_CS2_PORT &= ~LCDM_CS2_PINNum; /* 置片选2为L */
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于在液晶屏幕上在指定坐标位置(x,y)显示单个点阵字符的操作。
函数入口参数:x ----------------- X轴坐标,其数值范围:x ≤63。
y ----------------- Y轴坐标,其数值范围:y ≤7。
*pdc_address ------ 显示字符点阵数据存储地址,即指向存储点阵数据的指针。
dc_row_num -------- 显示字符行点数,其数值范围:x ≤127。
dc_column_num ----- 显示字符列点数,其数值范围:x ≤63。
备注: ①.参数 y(Y轴坐标)的数值范围:y ≤7。
②.在移植程序时,请注意 *pdc_address 参数前的 flash 关键字,此关键字
为 CodeVision AVR C 所扩充,在移植时要做相应修改。
----------------------------------------------------------------------------*/
void LCDM_Display_Character(Uchar8 x, /* X轴坐标 */
Uchar8 y, /* Y轴坐标 */
const Uchar8 flash *pdc_address, /* 字符点阵数据存储地址 */
const Uchar8 dc_row_num, /* 显示字符行点数 */
const Uchar8 dc_column_num) /* 显示字符列点数 */
{
register Uchar8 i_counter; /* 行循环计数器变量 */
register Uchar8 j_counter; /* 列循环计数器变量 */
register Uchar8 temp; /* 临时寄存器变量 */
register Uchar8 temp_data; /* 临时数据寄存器变量 */
LCDM_BackgroundLight(ON); /* 打开液晶的背景灯 */
LCDM_Display(ON); /* 打开液晶显示屏幕 */
LCDM_SetStartLine(0); /* 设置显示开始行为第一行 */
j_counter = dc_column_num/LCDM_DataBits; /* 列循环次数=字符列点数÷字符位长 */
temp = x + dc_row_num; /* 字符行宽范围=X轴坐标+显示字符行点数 */
if (temp < LCDM_MaxRowDot) /* 字符行宽范围是否全部在芯片1内? */
{
x = x + LCDM_Yaddress_1; /* 设置X轴坐标 */
LCDM_WriteCode(x, CS1);
y = y + LCDM_DataPage_1; /* 设置Y轴坐标 */
LCDM_WriteCode(y, CS1);
while (j_counter>0)
{
for (i_counter=dc_row_num; i_counter>0; i_counter--)
/* 行循环次数=字符行点数 */
{
temp_data = *(pdc_address++); /* 输入显示字符点阵数据 */
LCDM_WriteData(temp_data, CS1); /* 将显示字符点阵数据写入液晶显示屏幕 */
}
LCDM_WriteCode(x, CS1); /* X轴坐标退回到设置点 */
y = y + 1; /* 显示页数(Y轴坐标)+1 */
LCDM_WriteCode(y, CS1);
j_counter--;
}
}
else /* 否则字符行宽范围即在芯片2和芯片1之间 */
{
if (x >= LCDM_MaxRowDot) /* 字符行宽范围是否全部在芯片2内? */
{
x = x - LCDM_MaxRowDot; /* X轴坐标=X轴坐标-芯片1的最大行点阵数 */
x = x + LCDM_Yaddress_1; /* 设置X轴坐标 */
LCDM_WriteCode(x, CS2);
y = y + LCDM_DataPage_1; /* 设置Y轴坐标 */
LCDM_WriteCode(y, CS2);
while (j_counter>0)
{
for (i_counter=dc_row_num; i_counter>0; i_counter--)
/* 行循环次数=字符行点数 */
{
temp_data = *(pdc_address++); /* 输入显示字符点阵数据 */
LCDM_WriteData(temp_data, CS2); /* 将显示字符点阵数据写入液晶显示屏幕 */
}
LCDM_WriteCode(x, CS2); /* X轴坐标退回到设置点 */
y = y + 1; /* 显示页数(Y轴坐标)+1 */
LCDM_WriteCode(y, CS2);
j_counter--;
}
}
else
{
temp = x + LCDM_Yaddress_1; /* 设置X轴坐标 */
LCDM_WriteCode(temp, CS1);
y = y + LCDM_DataPage_1; /* 设置Y轴坐标 */
LCDM_WriteCode(y, CS1);
while (j_counter>0)
{
for (i_counter=(LCDM_MaxRowDot-x); i_counter>0; i_counter--)
/* 芯片1行循环次数=芯片1的最大行点阵数-X轴坐标 */
{
temp_data = *(pdc_address++); /* 输入显示字符点阵数据 */
LCDM_WriteData(temp_data, CS1); /* 将显示字符点阵数据写入液晶显示屏幕 */
}
temp = 0 + LCDM_Yaddress_1; /* 设置芯片2的X轴坐标为起点 */
LCDM_WriteCode(temp, CS2);
LCDM_WriteCode(y, CS2); /* 设置芯片2的Y轴坐标 */
for (i_counter=(x + dc_row_num - LCDM_MaxRowDot); i_counter>0; i_counter--)
/* 芯片2行循环次数=X轴坐标+显示字符行点数-芯片1的最大行点阵数 */
{
temp_data = *(pdc_address++); /* 输入显示字符点阵数据 */
LCDM_WriteData(temp_data, CS2); /* 将显示字符点阵数据写入液晶显示屏幕 */
}
temp = x + LCDM_Yaddress_1; /* 芯片1的X轴坐标退回到设置点 */
LCDM_WriteCode(temp, CS1);
y = y + 1; /* 显示页数(Y轴坐标)+1 */
LCDM_WriteCode(y, CS1);
j_counter--;
}
}
}
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于在液晶屏幕上全屏幕填充单一字符数据的操作。
函数入口参数:all_data ------------ 填充的字符数据,例:清屏操作的字符数据可能为 0x00 。
max_row_num --------- 最大行点数值,为63。
max_column_num ------ 最大列点数值,为63。
备注: 对于片选数值的定义必须从 1 到 n 连续排列,如下所示 1,2,3,……,n-1,n 。
----------------------------------------------------------------------------*/
void LCDM_AllScreenData(const Uchar8 all_data, /* 填充的字符数据 */
const Uchar8 max_row_num, /* 最大行点数 */
const Uchar8 max_column_num) /* 最大列点数 */
{
register Uchar8 i_counter; /* 行循环计数器变量 */
register Uchar8 j_counter; /* 列循环计数器变量 */
register Uchar8 temp; /* 临时寄存器变量 */
register Uchar8 DC_CSNum; /* 片选数值变量,仅可取 CS1 或 CS2 中的一个 */
LCDM_Display(ON); /* 打开液晶显示屏幕 */
LCDM_SetStartLine(0); /* 设置显示开始行为第一行 */
for (DC_CSNum=1; DC_CSNum<=CS2; DC_CSNum++)
/* 片选循环次数=最大片选数值 */
{
LCDM_WriteCode(LCDM_Yaddress_1, DC_CSNum); /* 设置X轴坐标为起点 */
temp = 0x00;
temp = temp + LCDM_DataPage_1; /* 设置Y轴坐标为起点 */
LCDM_WriteCode(LCDM_DataPage_1, DC_CSNum);
for (j_counter=(max_column_num/LCDM_DataBits); j_counter>0; j_counter--)
/* 列循环次数=最大列点数÷字符位长 */
{
for (i_counter=max_row_num; i_counter>0; i_counter--)
/* 行循环次数=最大行点数 */
{
LCDM_WriteData(all_data, DC_CSNum); /* 将填充的字符数据写入液晶显示屏幕 */
}
LCDM_WriteCode(LCDM_Yaddress_1, DC_CSNum); /* X轴坐标退回到起点 */
temp = temp + 1; /* 显示页数(Y轴坐标)+1 */
LCDM_WriteCode(temp, DC_CSNum);
}
}
}
/*----------------------------------------------------------------------------
函数功能: 本函数用于在液晶屏幕上显示欢迎和警告页的操作。运行完本函数将显示:
“欢迎”------------------ 第一页,64×64点阵。
“郑重警告”-------------- 第二页,32×32点阵。
“本产品和嵌入的软 ------- 第三页,16×16点阵。
件受著作权法及国
际著作权条约和其
它知识产权法和条
约的保护,未经其
所有者的书面授权
不得擅自复制或传
播,否则将受到在
法律许可的范围内
最大可能的起诉。”
“欢迎使用”-------------- 第四页,32×32点阵。
备注: 本函数也是演示对上面函数如何使用的范例。
----------------------------------------------------------------------------*/
void Welcome_Advise_Show(void)
{
register Uchar8 i; /* 循环计数器变量 */
register Uchar8 j; /* 循环计数器变量 */
register Uchar8 k; /* 循环计数器变量 */
LCDM_initialization(); /* 初始化操作 */
LCDM_BackgroundLight(ON); /* 打开液晶模块背景灯 */
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 显示“欢”字符 */
LCDM_Display_Character(0,0,&Welcome_64_64[0][0],64,64);
delay_ms(500);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 显示“欢迎”字符 */
LCDM_Display_Character(64,0,&Welcome_64_64[1][0],64,64);
delay_ms(500);
LCDM_Display_Character(0,0,&Welcome_64_64[0][0],64,64);
delay_ms(2000);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 显示“郑重警告”字符 */
LCDM_Display_Character(0,2,&SeriousAdvise_32_32[0][0],32,32);
LCDM_Display_Character(32,2,&SeriousAdvise_32_32[1][0],32,32);
LCDM_Display_Character(64,2,&SeriousAdvise_32_32[2][0],32,32);
LCDM_Display_Character(96,2,&SeriousAdvise_32_32[3][0],32,32);
delay_ms(1800);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 向上一行滚动显示“郑重警告”字符 */
LCDM_Display_Character(0,1,&SeriousAdvise_32_32[0][0],32,32);
LCDM_Display_Character(32,1,&SeriousAdvise_32_32[1][0],32,32);
LCDM_Display_Character(64,1,&SeriousAdvise_32_32[2][0],32,32);
LCDM_Display_Character(96,1,&SeriousAdvise_32_32[3][0],32,32);
delay_ms(1800);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 再向上一行滚动显示“郑重警告”及第三页第一行字符 */
LCDM_Display_Character(0,0,&SeriousAdvise_32_32[0][0],32,32);
LCDM_Display_Character(32,0,&SeriousAdvise_32_32[1][0],32,32);
LCDM_Display_Character(64,0,&SeriousAdvise_32_32[2][0],32,32);
LCDM_Display_Character(96,0,&SeriousAdvise_32_32[3][0],32,32);
for (i=0; i<8;i++)
{
LCDM_Display_Character(i*16,6,&AdviseContent_16_16[0],16,16);
}
delay_ms(1800);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 再向上一行滚动显示“郑重警告”及第三页第一行和第二行字符 */
LCDM_Display_Character(0,0,&SeriousAdvise_32_32[0][32],32,24);
LCDM_Display_Character(32,0,&SeriousAdvise_32_32[1][32],32,24);
LCDM_Display_Character(64,0,&SeriousAdvise_32_32[2][32],32,24);
LCDM_Display_Character(96,0,&SeriousAdvise_32_32[3][32],32,24);
for (j=0; j<2;j++)
{
for (i=0; i<8;i++)
{
LCDM_Display_Character(i*16,j*2+4,&AdviseContent_16_16[i+j*8][0],16,16);
}
}
delay_ms(1800);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 显示第三页第一行、第二行和第三行字符 */
for (j=0; j<3;j++)
{
for (i=0; i<8;i++)
{
LCDM_Display_Character(i*16,j*2+2,&AdviseContent_16_16[i+j*8][0],16,16);
}
}
delay_ms(1800);
/* 滚动显示第三页字符 */
for (k=0; k<7;k++)
{
for (j=0; j<4;j++)
{
for (i=0; i<8;i++)
{
LCDM_Display_Character(i*16,j*2,&AdviseContent_16_16[k*8+i+j*8][0],16,16);
}
}
delay_ms(1800);
}
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 滚动显示第三页最后三行字符 */
for (j=0; j<3;j++)
{
for (i=0; i<8;i++)
{
LCDM_Display_Character(i*16,j*2,&AdviseContent_16_16[7*8+i+j*8][0],16,16);
}
}
delay_ms(1800);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 滚动显示第三页最后二行字符 */
for (j=0; j<2;j++)
{
for (i=0; i<8;i++)
{
LCDM_Display_Character(i*16,j*2,&AdviseContent_16_16[8*8+i+j*8][0],16,16);
}
}
delay_ms(1800);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 滚动显示第三页最后一行字符 */
for (i=0; i<8;i++)
{
LCDM_Display_Character(i*16,0,&AdviseContent_16_16[9*8+i][0],16,16);
}
delay_ms(1800);
LCDM_AllScreenData(0x00,64,64); /* 清屏 */
/* 显示“欢迎使用”字符 */
LCDM_Display_Character(0,2,&WelcomeUse_32_32[0][0],32,32);
LCDM_Display_Character(32,2,&WelcomeUse_32_32[1][0],32,32);
LCDM_Display_Character(64,2,&WelcomeUse_32_32[2][0],32,32);
LCDM_Display_Character(96,2,&WelcomeUse_32_32[3][0],32,32);
delay_ms(4000);
LCDM_BackgroundLight(OFF); /* 关闭液晶模块背景灯 */
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
register Uchar8 i;
register Uchar8 j;
register Uchar8 k;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
LCDM_initialization();
while (1)
{
Welcome_Advise_Show();
// Place your code here
}
}
/*
****************************************************************************************
本C语言源程序文件到此结束
****************************************************************************************
*/
头文件在此下载:
点击此处下载armok0150282.rar
-----此内容被LYStudio于2005-05-22,16:05:13编辑过
-----此内容被LYStudio于2005-05-22,16:15:33编辑过
-----此内容被LYStudio于2005-05-23,15:08:17编辑过 |
|