资讯详情

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

/********************************************************************** *** 功能:12864显示 显示闪动字体,各位同学可以自己修改。 *** 实验内容:0x81 0x90 0x88 0x98 分别是LCD四行的行首地址,我们操作LCD现实的字符就是分别放在这里面的 *** 连接方法: 接上有字库LCD12864 注意调节对比度,LCD12864工作电流较大,请用外接电源供电。 ****************************************************************************************************/ #include<pic.h> __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百科大全!

锐单商城 - 一站式电子元器件采购平台