12864串口驱动程序(郭天祥)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/****************************************************************************** *
* 标题: PIC-ST2学习板演示程序--12864LCD-1
* 文件名: LCD12864-1
* 建立日期: 2010.01.28
* 修改日期: 2010.05.15
* 版本: V1.0
* 作者: simomli
******************************************************************************* *
* 功能描述: LCD12864C液晶串口方式显示字符,只用到三根数据线
******************************************************************************* *
*【版权】Copyright(C) 2009-2019 All Rights Reserved
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
******************************************************************************* /
//#include <pic1687x.h>
#include <htc.h>
#include <pic.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define readbusy 0xFC //读忙指令
#define readdata 0xFE //读数据指令
#define writecom 0xF8 //写命令指令
#define writedata 0xFA //写数据指令
__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset
#define CS RE0 //使能线
#define SID RE1 //数据线
#define SCLK RE2 //时钟线
/************************定义显示字符*****************************************/
const uint8 tab[] = {" 欢迎光临"
" 宁理电子"
" 求是创新"
"ninglielectronic"
" Microchip学习板"
"12864LCD演示程序"
" taobao:simomli "
" 竭诚为你服务"};
/************************声明函数*********************************************/
void DelayUS(uint8 delay); //微妙延时
void DelayMS(uint16 delay); //毫秒延时
void Read_LCD_Busy(void); //查忙
void Write_LCD_Comd(uint8 commond); //LCD写指令
void Write_LCD_Data(uint8 Data); //LCD写数据
void Init_12864LCD(void); //12864LCD初始化
void Write_LCD_Line(uint8 addr,uint8 index); //写行
uint8 Read_LCD_Data(void);
/****************************************************************************** *
* 函数名: DelayUS(uint8 delay)
* 函数功能: 微秒延时 for 20MHZ
* 入口参数: delay
* 返回: 无
******************************************************************************* /
void DelayUS(uint8 delay)
{
while(--delay);
}
/****************************************************************************** *
* 函数名: DelayMS(uint16 delay)
* 函数功能: 毫秒延时 for 20MHZ
* 入口参数: delay
* 返回: 无
******************************************************************************* /
void DelayMS(uint16 delay)
{
uint16 i;
for(;delay>0;delay--)
for(i=0;i<453;i++);
}
/****************************************************************************** *
* 函数名: Read_LCD_Data(void)
* 函数功能: 液晶读数据
* 入口参数: 无
* 返回: temp
******************************************************************************* /
uint8 Read_LCD_Data(void)
{
uint8 i,temp,temp1;
TRISE1 = 1; //SID口设置为输入
CS = 1; //使能
SCLK = 0; //时钟线无效
for(i=0;i<8;i++) //读取高4位数据
{
temp <<= 1;
SCLK = 1; //时钟有效
if(RE1) //数据为1
{
temp |= 0x01;
}
SCLK = 0; //时钟无效
}
temp &= 0xF0; //保存高4位
for(i=0;i<8;i++)
{
temp1 <<= 1;
SCLK = 1;
if(RE1)
{
temp1 |= 0x01;
}
SCLK = 0;
}
temp1 &= 0xF0; //保存低4为
temp = temp | (temp1 >> 4); //保存8位数据
CS = 0;
TRISE1 = 0;
return (temp); //返回8位数据
}
/****************************************************************************** * 函数名: Write_LCD_Comd(uint8 commond)
* 函数功能: 写指令
* 入口参数: commond指令
* 返回: 无
******************************************************************************* /
void Write_LCD_Comd(uint8 commond)
{
uint8 i,temp;
CS = 1; //使能
SCLK = 0;
for(i=0;i<8;i++) //写8位指令
{
if(commond & 0x80)
{
RE1 = 1;
}
else
{
RE1 = 0;
}
SCLK = 1;
commond <<= 1;
SCLK = 0;
}
CS = 0;
}
/****************************************************************************** * 函数名: Write_LCD_Data(uint8 Data)
* 函数功能: 写数据
* 入口参数: Data数据
* 返回: 无
******************************************************************************* /
void Write_LCD_Data(uint8 Data)
{
uint8 i,temp;
temp = Data & 0xF0; //取待写数据高4位
CS = 1;
SCLK = 0;
for(i=0;i<8;i++) //写高4位+低4位0000
{
if(temp & 0x80)
{
RE1 = 1;
}
else
{
RE1 = 0;
}
SCLK = 1;
temp <<= 1;
SCLK = 0;
}
temp = Data & 0x0F; //取待写数据低四位
for(i=0;i<8;i++) //写低位数据
{
if(temp & 0x08)
{
RE1 = 1;
}
else
{
RE1 = 0;
}
SCLK = 1;
temp <<= 1;
SCLK = 0;
}
CS = 0;
}
/****************************************************************************** *
* 函数名: Read_LCD_Busy(void)
* 函数功能: 读液晶忙通道数据
* 入口参数: 无
* 返回: 无
******************************************************************************* /
void Read_LCD_Busy(void)
{
uint8 temp;
while(1)
{
Write_LCD_Comd(readbusy); //写读忙指令
temp = Read_LCD_Data(); //读忙数据
if((temp & 0x80) != 0x80) //不忙,则跳出,忙,则继续查询忙状态
break;
}
}
/****************************************************************************** * 函数名: Init_LCD()
* 函数功能: 初始化12864LCD
* 入口参数: 无
* 返回: 无
******************************************************************************* /
void Init_12864LCD(void)
{
Read_LCD_Busy(); //读忙
Write_LCD_Comd(writecom); //写“写指令,指示接下来写的是指令
Write_LCD_Data(0x30); //写基本功能指令
DelayMS(1);
Read_LCD_Busy();
Write_LCD_Comd(writecom); //写“写指令,指示接下来写的是指令
Write_LCD_Data(0x0c); //显示开
DelayMS(1);
Read_LCD_Busy();
Write_LCD_Comd(writecom); //写“写指令,指示接下来写的是指令
Write_LCD_Data(0x01); //清除显示
DelayMS(15);
Read_LCD_Busy();
Write_LCD_Comd(writecom); //写“写指令,指示接下来写的是指令
Write_LCD_Data(0x06); //进入设定点
DelayMS(1);
}
/****************************************************************************** * 函数名: Write_LCD_Line(uint8 addr,uint8 index)
* 函数功能: 写行字符
* 入口参数: addr起始地址,index数组表下标
* 返回: 无
******************************************************************************* /
void Write_LCD_Line(uint8 addr,uint8 index)
{
uint8 i;
Read_LCD_Busy(); //读忙
Write_LCD_Comd(writecom); //写“写指令,指示接下来写的是指令
Write_LCD_Data(addr); //写地址
for(i=0;i<16;i++) //循环16次
{
Read_LCD_Busy(); //读忙
Write_LCD_Comd(writedata); //写“写数据指令,指示接下来写的是数据
Write_LCD_Data(tab[index++]); //写数据
}
}
/****************************************************************************** * 函数名: mian()
* 函数功能: LCD显示字符
* 入口参数: 无
* 返回: 无
******************************************************************************* /
void main()
{
ADCON1 = 0x87; //设置PORTE为普通IO口
TRISD = 0x00; //设置PORTD为输出
TRISE = 0x00; //设置PORTE为输出
Init_12864LCD(); //初始化12864LCD
while(1)
{
Write_LCD_Line(0x80,0x00);
Write_LCD_Line(0x90,0x10);
Write_LCD_Line(0x88,0x20);
Write_LCD_Line(0x98,0x30);
DelayMS(5000);
Write_LCD_Line(0x80,0x40);
Write_LCD_Line(0x90,0x50);
Write_LCD_Line(0x88,0x60);
Write_LCD_Line(0x98,0x70);
DelayMS(5000);
}
}。

相关文档
最新文档