搜索
bottom↓
回复: 30

共享:HD61202/3 128×64液晶模块 C 源程序(CVAVR)

[复制链接]

出0入0汤圆

发表于 2005-5-22 00:55:32 | 显示全部楼层 |阅读模式
/*

****************************************************************************************

源程序文件名:      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编辑过

出0入0汤圆

 楼主| 发表于 2005-5-22 16:14:29 | 显示全部楼层
上传一个此程序的库文件,"LCDM_HD61202_128D64.h" 头部文件略有修改。

点击此处下载armok0150342.rar

出0入0汤圆

发表于 2006-8-19 16:53:10 | 显示全部楼层
称得上是点阵液晶驱动的典范了,强人

出0入0汤圆

发表于 2006-9-3 00:00:47 | 显示全部楼层
真的太详细了!

出0入0汤圆

发表于 2006-9-3 00:23:01 | 显示全部楼层
真是太长了..............支持 谢谢

出0入0汤圆

发表于 2006-9-3 07:31:07 | 显示全部楼层
非常感谢楼主详细的注释!

出0入0汤圆

发表于 2006-9-9 13:40:30 | 显示全部楼层
好文章啊

出0入0汤圆

发表于 2006-9-9 22:28:26 | 显示全部楼层
楼主真的很牛呀,佩服佩服!!!!

你能不能把这块液晶的资料给我,我主要是要看那个管脚安排.

我的邮箱是:meisenzhilian0101@163.com



谢谢谢谢!!!!

出0入0汤圆

发表于 2006-10-20 16:47:27 | 显示全部楼层
不错,分享下!

出0入0汤圆

发表于 2006-10-29 23:11:29 | 显示全部楼层
DDDDDDDDDDDDDDDD

出0入0汤圆

发表于 2006-10-30 15:39:09 | 显示全部楼层
支持一下,作为HD61202/3控制器液晶驱动程序的范例。

出0入0汤圆

发表于 2006-10-30 20:32:03 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2006-10-30 21:35:18 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2006-11-1 00:00:32 | 显示全部楼层
支持牛人!!!

出0入0汤圆

发表于 2007-1-23 13:44:01 | 显示全部楼层
真够长的!!楼主厉害

出0入0汤圆

发表于 2007-7-22 10:16:49 | 显示全部楼层
好东西,LZ实在厉害,代码也很规范。

出0入0汤圆

发表于 2007-7-27 09:39:57 | 显示全部楼层
作标准把

出0入0汤圆

发表于 2007-11-3 20:22:43 | 显示全部楼层
不错,注释也比较详细。

出0入0汤圆

发表于 2007-11-3 21:12:18 | 显示全部楼层
不错,厉害!

出0入0汤圆

发表于 2008-7-6 13:02:01 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-7-6 14:11:48 | 显示全部楼层

出0入0汤圆

发表于 2009-6-13 14:38:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-22 08:59:40 | 显示全部楼层
dddddddddddddd

出0入0汤圆

发表于 2009-6-22 21:50:41 | 显示全部楼层
学习学习,谢谢楼主

出0入0汤圆

发表于 2010-9-2 16:23:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-2 19:47:17 | 显示全部楼层
好东西要顶!

出0入0汤圆

发表于 2010-9-29 19:44:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-29 21:26:37 | 显示全部楼层
jihao

出0入0汤圆

发表于 2010-10-5 00:53:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-26 22:46:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-24 11:15:08 | 显示全部楼层
mark!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 08:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表