#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*12864端口定义*/
#define LCD_data P1 //数据口
sbit LCD_RS = P2^4 //选择寄存器(并行) 0 ;指令 1 :数据
sbit LCD_RW = P2^3 //液晶读/写控制
sbit LCD_EN = P2^2 //读写数据启始宽含烂脚(并行)
sbit LCD_PSB = P2^7 //串/并老衡方式控制 0为串行模式,1 为并
sbit LCD_RST = P2^5 //复位 低电平有
uchar code dis1[] = {"一二三四 ,送 |"}
uchar code dis2[] = {"落日故人情。友李"}
uchar code dis3[] = {"挥手自兹去,人白"}
uchar code dis4[] = {"萧萧班马鸣。 | "}
/********************************************************
//延时函数
//*******************************************************/
void delay(uint k)
{
uint i
uchar j
for(i=0i<ki++)
{
for(j=0j<10j++)
}
}
/**********************************************************
// 延时1ms 函数
//********************************************************/
void delay_ms(unsigned int k)//延时0.994us,晶振12M
{
unsigned int x,y
for(x=kx>0x--)
for(y=121y>0y--)
}
void ledzs()
{
led=0
delay_ms(100)
led=1
delay_ms(100)
}
/*************************************************************
/慎漏 12864 读忙标志位 最高位为1 则忙,不能读写
/************************************************************/
void Read_busy()
{
LCD_RS=0
LCD_RW=1
LCD_EN=1
while(P2&0x80)
LCD_EN=0
}
/*************************************************************
/ 写命令函数
/************************************************************/
void Lcdwcom(uchar wcom)
{
Read_busy() //每次进行读忙标识 可以不加 最好加
delay(1)// 延时
LCD_RS=0//指令 为底 数据为高
delay(1)// 延时
LCD_RW=0//写为底 读为高
delay(1)// 延时
LCD_EN=1//使能信号
delay(1)// 延时
LCD_data=wcom//将指令写入并口
delay(1)// 延时
LCD_EN=0 // 关闭使能
}
/*************************************************************
/ 写数据函数
/************************************************************/
void Lcdwdata(uchar wdata)
{
Read_busy()
delay(1)
LCD_RS=1//指令 为底 数据为高
delay(1)
LCD_RW=0//写为底 读为高
delay(1)
LCD_EN=1//使能信号
delay(1)
LCD_data=wdata//将数据写入并口
delay(1)
LCD_EN=0 // 关闭使能
}
/*************************************************************
/ 12864显示位置设定函数
参数说明: x 为行号 y 位列号
/************************************************************/
void Set_Pos(uchar x,uchar y)
{
uchar i
switch(x) //确定行号
{
case 0: i=0x80break
case 1: i=0x90break
case 2: i=0x88break
case 3: i=0x98break
default :break
}
i=i+y//确定列号
Lcdwcom(i)
}
/*************************************************************
/ 12864初始化函数 顺序不可乱
/************************************************************/
void LCD_Init(void)
{
delay_ms(2)
LCD_RST=1
LCD_RST=0
LCD_RST=1
LCD_PSB=1 //选择并口
Lcdwcom(0x30)//基本指令 *** 作1 延时不同
delay(8)
Lcdwcom(0x30)//基本指令 *** 作2
delay(5)
Lcdwcom(0x0c)//显示开光标
delay(5)
Lcdwcom(0x01) //清楚LCD显示内容
delay(5)
Lcdwcom(0x06)//光标的移动方向
delay(5)
}
/*************************************************************
/ 12864 指定位置显示字符串函数 若整体化则只能显示第一行
/************************************************************/
void Display_String(uchar x1,uchar y1,uchar *string)
{
uchar i=0
Set_Pos(x1,y1)//设定位置
while(string[i]!='\0')
{
Lcdwdata(string[i])
i++
}
}
/*************************************************************
/ 12864 自带字符串显示函数 只需将ASCII码 写入即可 不怎么好使
/************************************************************/
void Display_Ascii(uchar x2,uchar y2,uchar ascii)
{
Set_Pos(x2,y2)
Lcdwdata(ascii)
}
void main()
{
uchar j=0
LCD_Init()
Lcdwcom(0x01) //清楚LCD显示内容
Display_String(0,0,dis1)
Display_String(1,0,dis2)
Display_String(2,0,dis3)
Display_String(3,0,dis4)
while(1)
}
/******************************************************************程序名称:带汉字库的12864液晶显示模块驱动
*程序功能:显示字符 、汉字和图片
*开发工具:Kile
* MCU型号:AT89S52-24PU
*时钟频率:11.0592MHZ
*程序作者:yuan
*版权说明:yuan
*****************************************************************/改胡毕
#include<reg52.h>
#include "lcd.h"
#include "util.h"
sbit E=P1^5//脉冲使能
sbit RW=P1^6//读写选择
sbit RS=P1^7//数据命令选择
sbit rst=P3^6//12864复位
// 延时ms函数:
// 12864检查状态函数:
void Check12864State(void)
{
P0=0xff
E=0//读状态前核芹三控制线的状态
RS=0
RW=1
E=1//拉高,读状态
while((P0&0x80)==0x80)//等待空闲
E=0//写命令后三控制线的状态
RS=1
RW=0
}
// 12864写命令函数:
void Write12864Command( unsigned char com)
{
Check12864State()//检查状态
P0=com//赋值
E=0//写命令前三控制线的状态
RS=0
RW=0
E=1//拉高,写命令
E=0//写命令后三控制线的状态
RS=1
RW=1
}
//12864写数据函数:
void Write12864Data( unsigned char dat)
{
Check12864State()//检查状态
P0=dat//赋值
E=0//写数据前三控制线的状态
RS=1
RW=0
E=1//拉高,写数据
E=0//写数据后三控制线的状态
RS=0
RW=1
}
//在指定的位置显示字符串(汉字和ASCII码字符)函数:
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)
//y-行数值0-3,x-列数值0-7,pstr-字符串指针
//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
//为了实现自动换行功能,这个函数比较繁琐
{
unsigned char row,n=0
Write12864Command(0x30)//基本指令
Write12864Command(0x06)//地址计数器自动加以,光标右移
switch(y)//根据行号选择行地址
{
case 0:row=0x80break//第一行首地址
case 1:row=0x90break//第二行首地址
case 2:row=0x88break//第三行首地址
case 3:row=0x98break//第四行首地址
default:
}
Write12864Command(row+x)//写地址
while(*pstr!='\0')
{
Write12864Data(*pstr)//做歼写字符
pstr++
n++//计数
if((n+x*2)==16)//如果一行写完 ,继续写第二行
{
if(y==0) Write12864Command(0x90)//写下一行地址
else if(y==1) Write12864Command(0x88)//写下一行地址
else if(y==2) Write12864Command(0x98)//写下一行地址
else
}
else if((n+x*2)==32)//如果第二行写完 ,继续写第三行
{
if(y==0) Write12864Command(0x88)//写下一行地址
else if(y==1) Write12864Command(0x98)//写下一行地址
else
}
else if((n+x*2)==48)//如果第三行写完 ,继续写第四行
{
if(y==0) Write12864Command(0x98)//写下一行地址
else
}
else
}
}
//图片模式清屏函数:
void Clear12864Screen()
{
unsigned char i,j
Write12864Command(0x34)//功能设定:8位控制方式,使用扩充指令
Write12864Command(0x36)//使用扩充指令,绘图显示控制
for(i=0i<32i++)
//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,
//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,
//也就是说第0行和第32行同属一行,行地址相同第1行和第33行同属一行,以此类推
{
Write12864Command(0x80|i)//写行地址(垂直地址)
Write12864Command(0x80)//写列地址(水平地址)
for(j=0j<32j++)
Write12864Data(0x00)//清屏
}
}
//在任意位置显示任意大小的图片函数:
void LCD12864DisplayPictrue(unsigned char y,unsigned char x,
unsigned char px,unsigned char py, unsigned char *pp)
//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),
//px-图片宽度,py-图片高度,pp-指针指向图片数组
//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐
{
unsigned char i,j,k
Clear12864Screen()//清屏
if(y<32)//如果起始行在上半屏
{
k=32-y//算出上半屏的行数
for(i=0i<ki++,y++)//上半屏行数
{
Write12864Command(0x80|y)//写行地址(垂直地址)
Write12864Command(0x80|x)//写列地址(水平地址)
for(j=0j<px/8j++)
Write12864Data(pp[i*px/8+j])//写图片数据
}
y=0//下半屏起始行,接上半屏继续写数据
for(i<pyi++,y++)//下半屏剩下的行数
{
Write12864Command(0x80|y)//写行地址(垂直地址)
Write12864Command(0x80|(8+x))//写列地址(水平地址)
for(j=0j<px/8j++)
Write12864Data(pp[i*px/8+j])//写图片数据
}
}
else //如果起始行在下半屏
{
for(i=0i<pyi++,y++)//行数
{
Write12864Command(0x80|(y-32))//写行地址(垂直地址)
Write12864Command(0x80|(8+x))//写列地址(水平地址)
for(j=0j<px/8j++)
Write12864Data(pp[i*px/8+j])//写图片数据
}
}
}
void Clear12864Text()
{
Write12864Command(0x34)//清屏
DelayMs(5)
Write12864Command(0x30)//清屏
DelayMs(5)
Write12864Command(0x01)//清屏
DelayMs(5)
}
//12864初始化函数:
void Initialize12864()
{
rst=0//复位12864
DelayMs(30)
rst=1
DelayMs(20)
Write12864Command(0x30)//功能设定:8位控制方式,使用基本指令
Write12864Command(0x08)//显示关
Write12864Command(0x01)//清屏
Write12864Command(0x06)//地址计数器加一、光标右移
Write12864Command(0x0c)//显示开
}
带字库的驱动
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)