*** 功能: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
}
上一篇:PIC单片机键盘矩阵扫描C语言程序
下一篇:PIC16F877A和AVR的单片机的PWM输出程序
推荐阅读最新更新时间:2024-03-16 13:59