×
单片机 > 单片机程序设计 > 详情

PIC单片机驱动LCD12864液晶显示闪动字体程序

发布时间:2020-05-16 发布时间:
|
/**********************************************************************

*** 功能:12864LCD显示  显示闪动字体,各位同学可以自己修改。
*** 实验内容:0x81 0x90 0x88 0x98 分别是LCD四行的行首地址,我们操作LCD现实的字符就是分别放在这里面的
*** 开发板连接方法: 接上有字库LCD12864 注意调节对比度,LCD12864工作电流较大,请用外接电源供电。
****************************************************************************************************/
#include
__CONFIG(0xff32);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

#define  rs          RA5                            //定义LCD的数据/命令控制口
#define  rw          RA4                            //定义LCD的读/写控制口
#define  e           RA3                            //定义LCD的使能口
#define  psb         RA2                            //定义通信方式控制口
#define  rst         RA1                            //定义复位口
#define  nop()  asm("nop")                  //定义空操作函数

const unsigned char TAB1A[ ] = {"中科技电子网"};
const unsigned char TAB1B[ ] = {***.*********.***"};
const unsigned char TAB1C[ ] = {"0755-110"};
const unsigned char TAB1D[ ] = {"HD-34 PIC 开发板"};

unsigned int lcd_x;                        //定义LCD页地址寄存器
unsigned int lcd_y;                        //定义LCD列地址寄存器
bit busy;                                 //定义LCD忙标志位

void init();                        //申明I/O口设置函数
void lcd_init();                    //申明LCD初始化函数
void clear_p();                     //申明清屏函数
void writelcd(const unsigned char *pt);                           //声明LCD写字符串函数
void wr_zb();                       //申明有关显示设置函数
void flash();                       //申明设置LCD显示闪烁函数
void send_d(unsigned char x);       //申明送一字节数据显示函数
void send_i(unsigned char x);       //申明送一字节控制命令函数
void chk_busy();                    //申明检测LCD是否工作繁忙函数
void delay();                       //申明延时函数1,供各命令之间的延时和决定显示快慢
void delay1();                      //申明延时函数2,用以决定显示闪烁快慢

/****************************************************************************
* 名    称:main()
* 功    能:主函数
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void main()
{
        init();                                                            //调用I/O口设置函数
        while (1)
        {
                lcd_init();                          //调用LCD初始化函数
                clear_p();                           //调用清屏函数
                send_i(0x81);                                         //第1行
                writelcd(TAB1A);
                send_i(0x90);                                        //第2行
                writelcd(TAB1B);
                send_i(0x88);                                        //第3行
                writelcd(TAB1C);
                send_i(0x98);                                        //第4行
                writelcd(TAB1D);
                delay();                             //延长显示一段时间
                flash();                             //调用显示闪烁函数
                clear_p();                           //调用清屏函数
        }
}

/****************************************************************************
* 名    称:init()
* 功    能:I/O口初始化
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void init()
{        
        ADCON1 = 0X07;                      //设置A口为普通I/O口
        TRISA = 0X00;                       //设置A口为输出
        TRISD = 0X00;                       //设置D口为输出
  PORTA = 0X00000001;
}


/****************************************************************************
* 名    称:lcd_init()
* 功    能:LCD初始化
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void lcd_init()
{
        rst = 0;                            //复位LCD
        delay();                                  //保证复位所需要的时间
        rst = 1;                            //恢复LCD正常工作
        nop();
        psb = 1;                            //设置LCD为8位并口通信
        send_i(0x30);                             //基本指令操作
        send_i(0x01);                             //清除显示
        send_i(0x06);                             //指定在写入或读取时,光标的移动方向
        send_i(0x0c);                             //开显示,关光标,不闪烁
}[page]

/****************************************************************************
* 名    称:wr_zb()
* 功    能:显示设置
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void wr_zb()
{
        send_i(lcd_y);
        send_i(lcd_x);
}

/****************************************************************************
* 名    称:flash()
* 功    能:显示闪烁
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void flash()
{
        send_i(0x08);                  //关显示
        delay1();                      //延长一定时间
        send_i(0x0c);                  //开显示
        delay1();delay1();             //延长关显示两倍的时间
        send_i(0x08);                  //关显示
        delay1();
        send_i(0x0c);                  //开显示
        delay1();delay1();
        send_i(0x08);                  //关显示
        delay1();
        send_i(0x0c);                  //开显示
        delay1();delay1();
        
}

/****************************************************************************
* 名    称:clear_p()
* 功    能:清屏
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void clear_p()
{
        send_i(0x1);                   //清除所有显示
        send_i(0x34);                  //扩展指令操作
        send_i(0x30);                  //基本指令操作
}

/****************************************************************************
* 名    称:send_d()
* 功    能:写一个字节数据到LCD
* 入口参数:unsigned char x 字符
* 出口参数:
* 说    明:
****************************************************************************/
void send_d(unsigned char x)
{
        chk_busy();                          //检测LCD是否工作繁忙
        rs = 1;                                //设置该字节数据是显示数据
        rw = 0;                                //设置该次操作为写
        PORTD = x;                             //送数据口PORTD
        e = 1;                                 //使能
        nop();
        nop();
        nop();
        e = 0;                                 //禁止
}

/****************************************************************************
* 名    称:send_i()
* 功    能:写一个字节命令到LCD
* 入口参数:unsigned char x 字符
* 出口参数:
* 说    明:
****************************************************************************/
void send_i(unsigned char x)
{
        chk_busy();                          //检测LCD是否工作繁忙
        rs = 0;                        //设置该字节数据为控制命令
        rw = 0;                        //设置此次操作为写
        PORTD = x;                     //送数据口PORTD
        e = 1;                         //使能
        nop();
        nop();
        nop();
        e = 0;                         //禁止
}

/****************************************************************************
* 名    称:chk_busy()
* 功    能:检测LCD是否工作繁忙
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void chk_busy()
{
        busy = 1;                      //先置位繁忙标志位
        TRISD = 0XFF;                  //更改通信为输入
        rs = 0;                        //设置该字节数据为命令代码
        rw = 1;                        //设置此次操作为读
        while (busy)
        {
                nop();nop();nop();
                e = 1;                           //使能
                nop();nop();nop();
                if (!RD7) busy = 0;               //检测LCD是否工作繁忙
                nop();nop();nop();
                e = 0;                           //禁止
        }
        e = 0;                                 //禁止
        TRISD = 0X00;                          //恢复通信为输出
}

/****************************************************************************
* 名    称:delay()
* 功    能:延时
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void delay()
{
        int i;
        for (i = 0;i < 5000;i++);
}

/****************************************************************************
* 名    称:delayl()
* 功    能:延时
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void delay1()
{
        int i;
        for (i = 0;i < 10;i++)
        {
                delay();               //调用延时函数
        }
}

/****************************************************************************
* 名    称: writelcd()
* 功    能: 在LCD上显示字符串
* 入口参数:const unsigned char *pt 字符串的首地址
* 出口参数:
* 说    明:
****************************************************************************/
void writelcd(const unsigned char *pt)
{
    while(*pt)                        //检测是否达到了字符串最后
        send_d(*pt++);  //发送数据给lcd
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八