
#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)
}
带字库的LCD模块不需要取字模只需要向LCD模块写入需要显示的汉字的GB2312代码就可以了,显示位置可用模块手册中的定位指令代码设置
切换到点阵图形模式,并设置好书写规律,在字模相应位置写入对仿扰应字模数据就可以了
比如16*16点阵,定义备纤旦第一组两个8字节数据的起始竖凯位置,连续列入两字节,然后定位下一行起始地址,再写,重复上述过程直到写完一个字的全部16行
原理都是一样的,具体命令与实现方法或有不同,详情参见LCD产品手册
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)