锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2024-05-01 11:07:09

/**********************************************************************
*** 功能:12864显示 显示闪动字体,各位同学可以自己修改。
*** 实验内容:0x81 0x90 0x88 0x98 分别是LCD四行的行首地址,我们操作LCD现实的字符就是分别放在这里面的
*** 连接方法: 接上有字库LCD12864 注意调节对比度,LCD12864工作电流较大,请用外接电源供电。
****************************************************************************************************/
#include
__CFIG(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()
{
AON1 = 0X07; //设置A口为普通I/O口
SA = 0X00; //设置A口为输出
TR = 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); //开显示,关光标,不闪烁
}

/****************************************************************************
* 名 称: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
}


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章