微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC16F877A驱动12864液晶

PIC16F877A驱动12864液晶

时间:11-09 来源:互联网 点击:
本程序配套液晶为金鹏的12864液晶使用串行模式

头文件

#ifndef LCD12864_H
#define LCD12864_H
#include "main.h"

//define control port pin
//serial mode
//#define SCLK RD4
//#define STD RD5
//#define LCD_EN RD6
//parallel mode
#define PSB RA0
#define CS RA1
#define STD RA2
#define SCLK RA3
#define RST RA4

//define command word
#define CLR_LCD 0x01 ;
#define CLR_AC 0x02 ;
#define CURSOR_RIGHT 0x14
#define CURSOR_LEFT 0x10
#define CURSOR_ON 0x0F
#define CURSOR_OFF 0x0C
#define DISP_RIGHT 0x1C
#define DISP_LEFT 0x18
#define LCD_BUSY RD7

//define function
#define lcd_enable() CS=1
#define lcd_disable() CS=0
//4个基本函数
void init_lcd() ;
void wr_lcd(uchar flag,uchar data) ;//flag=0 command;flag=1,data
void send_cmd(uchar data ) ;
void send_byte(uchar data) ;
//4个低级封装函数实现字符、字符串的显示、汉字的显示和简单图像的显示
void char_disp(const char data,uchar X,uchar Y) ;
void str_disp(const char *data,uchar X,uchar Y) ;
void chn_disp(const char *data ,uchar add,uchar y,uchar count) ;
void clr_lcd() ;
void pic_disp1(uchar *img) ;
void pic_disp2(uchar *img) ;
void con_disp(uchar x0,uchar y0,uchar x1,uchar y1) ;
//控制显示函数
void shift_cursor(uchar flag,uchar count) ;
void shift_lcd(uchar flag,uchar count) ;
void locate_xy(uchar x,uchar y) ;
void lcd_rol() ;
void clr_ram() ;
//字符串处理
void float_str(uchar *str,float data) ;
void int_str(uchar *str,int data) ;
#endif
子程序

#include "lcd12864.h"
void init_lcd()
{
//init port ;
ADCON1=0x06 ;//AD端口作为数字量端口
TRISA=TRISA&0xE0 ;
RST=0 ;
DelayMs(20) ;
RST=1 ;
DelayMs(20) ;
PSB=0 ;

send_cmd(0x38) ;
DelayUs(72) ;
//send_cmd(0x38,0) ;//8位控制,基本指令集
send_cmd(0x38) ;
DelayUs(72) ;
send_cmd(0x38) ;
send_cmd(0x38) ;
send_cmd(0x30) ;
send_cmd(0x0C) ;
send_cmd(0x01) ;
send_cmd(0x06) ;
clr_lcd() ;
}
//两位小数三位整数的浮点数变为字符串
void float_str(uchar *str,float data)
{
uchar a[6],flag ;
int temp ;
if(data<0)
{
*(str++)=0x2D ;
data=-data ;
}
temp=(int)(data*100) ;
a[5]=temp%10+0x30 ;
a[4]=temp/10%10+0x30;
a[3]=0x2E ;
a[2]=temp/100%10+0x30 ;
a[1]=temp/1000%10+0x30 ;
a[0]=temp/10000+0x30 ;
flag=0 ;
for(temp=0;temp<6;temp++)
{
if((a[temp]==0x30)&&(flag==0))
continue ;
else
flag=1 ;
*(str++)=a[temp] ;
}
*str=/0 ;
}
//注意data的范围为-32767~32767
void int_str(uchar *str,int data)
{
uchar a[5],flag,temp ;
if(data<0)
{
*(str++)=0x2D ;
data=-data ;
}
a[4]=data%10 +0x30 ;
a[3]=data/10%10+0x30 ;
a[2]=data/100%10+0x30 ;
a[1]=data/1000%10+0x30 ;
a[0]=data/10000+0x30 ;
flag=0 ;
for(temp=0;temp<6;temp++)
{
if((a[temp]==0x30)&&(flag==0))
continue ;
else
flag=1 ;
*(str++)=a[temp] ;
}
*str=/0 ;
}

void wr_lcd(uchar flag,uchar data)
{
uchar temp,i ,j ;
DelayUs(1) ;
temp=data ;
CS=1 ;
SCLK=0 ;
STD=1 ;
for(i=0;i<5;i++)
{
SCLK=1 ;
SCLK=0 ;
}
STD=0 ;
SCLK=1 ;
SCLK=0 ;
STD=flag ;
SCLK=1 ;
SCLK=0 ;
STD=0 ;
SCLK=1 ;
SCLK=0 ;
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
if(temp&0x80)
STD=1 ;
else
STD=0 ;
SCLK=1 ;
SCLK=0 ;
temp=temp<1 ;
}
STD=0 ;
for(j=0;j<4;j++)
{
SCLK=1 ;
SCLK=0 ;
}
}
}

void send_cmd(uchar data)
{
wr_lcd(0,data) ;
}
void send_byte(uchar data)
{
wr_lcd(1,data) ;
}
void char_disp(const char data,uchar X,uchar Y)
{
//send_cmd(0x30,1) ;//8端口控制,使用基本指令集
X=X&0x07 ;
Y=Y&0x03 ;
switch(Y)
{
case 0 :
Y=0x80 ;
break ;
case 1 :
Y=0x90 ;
break ;
case 2 :
Y=0x88 ;
break ;
case 3 :
Y=0x98 ;
break ;
default :
break ;
}
send_cmd(X+Y) ;//设置DDRAM地址
send_byte(data) ;
}

void shift_cursor(uchar flag,uchar count)
{
uchar i;
if(flag)
{
for(i=0;isend_cmd(0x10) ;
}
else
{
for(i=0;isend_cmd(0x14) ;
}
}

void shift_lcd(uchar flag,uchar count)
{
uchar i;
if(flag)
{
for(i=0;isend_cmd(0x18) ;
}
else
{
for(i=0;isend_cmd(0x1c) ;
}
}
//右半屏显示适用于(64*64)图形
void pic_disp1(uchar *img)
{
uchar i,j ;
send_cmd(0x34) ;//关显示
for(j=0;j<32;j++)
{
send_cmd(0x80+j) ;
send_cmd(0x80) ;
for(i=0;i<2;i++)
{
send_byte(img[j*16+i*2]) ;
send_byte(img[j*16+i*2+1]) ;
}
}

send_cmd(0x0c) ;//close blind cursor
send_cmd(0x36) ;
send_cmd(0x30);
}
void pic_disp2(uchar *img)
{
uchar i,j ;
send_cmd(0x34) ;//关显示
for(j=32;j<64;j++)
{
send_cmd(0x80+j-32) ;
send_cmd(0x88) ;
for(i=0;i<4;i++)
{
send_byte(img[j*16+i*2]) ;
send_byte(img[j*16+i*2+1]) ;
}
}
send_cmd(0x30);
send_cmd(0x0c) ;//close blind cursor
send_cmd(0x36) ;//开显示
}
//清屏
void clr_lcd()
{
uchar i,j ;
send_cmd(0x30) ;
send_cmd(0x01) ;
send_cmd(0x34) ;
for(j=0;j<32;j++)
{
send_cmd(0x80+j) ;//设置列地址
send_cmd(0x80) ;//设置行起始地址
for(i=0;i<8;i++)
{
send_byte(0x00) ;
send_byte(0x00) ;
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top