单片机lcd接口控制实例(c语言的)
不好意思,我用的是这样结构的lcd,2行X16列 展开
典型的128×64LCD显示模块(串行,见电路图)
驱动函数:
/*********************************************************************************************
函数名:LCD12864底层驱动程序(串行接口)
调 用:lcm_w_byte();
参 数:要发送的字节数据
返回值:无
结 果:发送一个字节给LCM
备 注:
/*********************************************************************************************/
//发送一个字节(底层函数)
void lcm_w_byte(unsigned char bbyte) {
unsigned char i;
for(i=0;i<8;i++){
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
/*********************************************************************************************
函数名:写指令或数据函数
调 用:lcm_w_test(?,?);
参 数:(位,字节);位:0指令,1数据;
返回值:无
结 果:
备 注:
/**********************************************************************************************/
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0){
start_data=0xf8; //0:写指令
}else{
start_data=0xfa; //1:写数据
}
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
lcm_w_byte(start_data); //发送起始信号
DELAY_MS(1); //延时是必须的
lcm_w_byte(Hdata); //发送高四位
DELAY_MS(1); //延时是必须的
lcm_w_byte(Ldata); //发送低四位
DELAY_MS(1); //延时是必须的
}
/*****************************************************************************/
//清屏函数
void lcm_clr(void){
lcm_w_test(0,0x01);
DELAY_MS(20); //启动等待,等LCM讲入工作状态
}
/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word("您好!");
void lcm_w_word(unsigned char *str){
while(*str != '\0'){
lcm_w_test(1,*str++);
} *str = 0;
}
/****************************************************************************/
//初始化LCM
void lcm_init(void) {
DELAY_MS(200); //启动等待,等LCM讲入工作状态
lcm_w_test(0,0x30); //8 位介面,基本指令集
lcm_w_test(0,0x0c); //显示打开,光标关,反白关
lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零
DELAY_MS(200); //启动等待,等LCM讲入工作状态
}
/*********************************************************************************************/
使用以上驱动函数后,即可这样用几条命令简单控制
lcm_init();//初始化液晶显示器
lcm_clr();//清屏
lcm_w_word(" 要显示的文字");//
CH_H();//渐亮
DELAY_MS(1000); //显示等留3秒
CH_L();//渐暗
2023-06-12 广告
以下是一点简单的介绍:
指令表
指令名称 指 令 码
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 说 明 执行周期
FCP=250KH2
清 屏 L L L L L L L L L H 清除屏幕,置AC为零 1.64ms
返 回 L L L L L L L L H 设DDRAM地址为零,显示
回原位,DDRAMM内容不变 1.64ms
输入方式设置 L L L L L L L H I/D S 设光标移动方向并指定整体
显示是否移动 40us
显示开关控制 L L L L L L L H D C B 调整体显示开关(D),光标
开关(C)及光标位的字符闪
耀(B) 40us
移 位 L L L L L H S/C R/L 移动光标或整体显示,同时
不改变DD RAM 内容 40us
功能设置 L L L L H DL N F 投接口数据位数(DL)显示
行数(L)及字形(F) 40us
CG RAM地址
设置 L L L H ACG 设CG RAM地址,设置后DD
RAM数据被发送和接收 40us
DD RAM
地址设置 L L H ADD 设DD RAM地址,设置后DD
RAM数据被发送和接收 40us
读忙信号(BF)
及地址高数器 L H BL AC 读忙信号位(BF)判断内部
操作正在执行并读地址计数
器内容 0us
写数据CG/DD
RAM H L 写数据 写数据到CG或DD RAM 40us
Tadd=6ns
读 数 据 由
CG/DD RAM H H 读数据 写数据到CG或DD RAM 40us
Tadd=6ns
I/D 1:增量方式,0:减量方式
S 1:移位
S/C1:显示移位,0:光标移位
R/L1:右移,0:左移
D L1:8位,0:4位
N 1:2行,0:1行
F 1:5×10。0:5×7 DD RAM显示数据RAM
CG RAM 字符生成RAM
AC:用于DD和CG RAM
地址的地址计数器 执行周期随主频而改变
例如:当fcp或Fosc为270KH2
40us×250/270
BF 1:内部操作,0:接收指令
RS :寄存器选择
R/W :读/写 =37us
初始化方法
用户所编的显示程序,开始必须进行初始化,否则模块无法正常显示,下而介绍两种初始化方法:
5.5.1 利用内部复位电路进行初始化
如果电路电源能满足图5.2a所示的条件的话,就可行初始化,下面指令是在初始化进程中执行的。
(1) 清屏(DISPLAY CLEAR);
(2) 功能设置(FUNCTION SET)
DL=1:8Bin接口数据
N=0:1行显示;F=0:5×7dot字形;
(3) 显示开/关控制(Display ON/OFF Conrtol)
D=0:显示关;C=0:光标关;B=0:消隐关
(4) 输入方式设置(ENTRY MODE SET)
I/D=1:(增量);S=0:无移位;
希望能对你有点帮助!