LCD显示屏:
接线图:
各引脚功能:
LCD指令表(详见吴志永老师发的《12864中文说明书》):
示例函数(功能:清除LCD屏幕):
void LCDClean(void)
{
WriteCommandLCM(0x01);
}
使用函数:
- void LCDClean(void);//清除屏幕
2.void DisplayListChar(unsigned char x,unsigned char y,unsigned char *s);//将字符串数据显示在显示屏的X,Y处。入口参数为,X坐标,Y坐标,数据地址起点(通俗来说,即比如:数组A[10],数据地址起点及为A)
3.void Send_byte(unsigned char dat);//将数据或指令写入LCD当中
4.void WriteCommandLCM(unsigned char WCLCM);//通过调用Send_byte()函数写入指令
5.void WriteDataLCM(unsigned char WDLCM);//通过调用Send_byte()函数写入数据
6.void LCD_init(void);//LCD端口的初始化
可参考的LCD源代码(列出了LCD.h和LCD.c,延时函数delay参见延时函数链接)
/*-------------LCD.h-----------*/
#ifndef _LCD12864_H_
#define _LCD12864_H_
#define LCDCS_H() PORTB|=(1 << 0)
#define LCDCS_L() PORTB&=(~(1 << 0))
#define LCDCS_IN() DDRB&=(~(1 << 0)) //方向输入
#define LCDCS_OUT() DDRB|=(1 << 0) //方向输出
#define LCDCLK_H() PORTB|= (1 << 1)
#define LCDCLK_L() PORTB&=(~(1 << 1))
#define LCDCLK_IN() DDRB&=(~(1 << 1)) //方向输入
#define LCDCLK_OUT() DDRB|=(1 << 1) //方向输出
#define LCDSID_H() PORTB|= (1 << 2)
#define LCDSID_L() PORTB&=(~(1 << 2))
#define LCDSID_IN() DDRB&=(~(1 << 2)) //方向输入
#define LCDSID_OUT() DDRB|=(1 << 2) //方向输出
#define LCDRES_H() PORTB|=(1 << 3)
#define LCDRES_L() PORTB&=(~(1 << 3))
#define LCDRES_IN() DDRB&=(~(1 << 3)) //方向输入
#define LCDRES_OUT() DDRB|=(1 << 3) //方向输出
#define LCDBL_H() PORTB|=(1 << 4)
#define LCDBL_L() PORTB&=(~(1 << 4))
#define LCDBL_IN() DDRB&=(~(1 << 4)) //方向输入
#define LCDBL_OUT() DDRB|=(1 << 4) //方向输出
void LCDClean(void);
void DisplayListChar(unsigned char x, unsigned char y, unsigned char *s);
void Send_byte(unsigned char dat);
void WriteCommandLCM(unsigned char WCLCM);
void WriteDataLCM(unsigned char WDLCM);
void LCD_init(void);
#endif
/*-------------LCD.c-----------*/
#include <iom64v.h>
#include <macros.h>
#include "delay.h"
#include "LCD.h"
void LCD_init(void)
{
LCDCS_H(); // 片选
delay_ms(10); // 启动等待,等LCM讲入工作状态
LCDRES_L();
delay_ms(1);
LCDRES_H(); // 复位LCD
delay_ms(10);
WriteCommandLCM(0x30); // 8 位介面,基本指令集
delay_ms(10);
WriteCommandLCM(0x0c); // 显示打开,光标关,反白关
delay_ms(10);
WriteCommandLCM(0x01); // 清屏,将DDRAM的地址计数器归零
}
void WriteDataLCM(unsigned char WDLCM) //写入数据
{
unsigned char Start_data,Hdata,Ldata;
Start_data=0xfa; // 写数据 11111010
Hdata=WDLCM&0xf0; // 取高四位 DDDD0000
Ldata=(WDLCM << 4)&0xf0; // 取低四位 0000DDDD
Send_byte(Start_data); // 发送起始信号 第1字节-格式:1111ABC
Send_byte(Hdata); // 发送高四位 第2字节-格式:DDDD0000
Send_byte(Ldata); // 发送低四位 第3字节-格式:0000DDDD
}
void WriteCommandLCM(unsigned char WCLCM) //写入指令
{
unsigned char Start_data,Hdata,Ldata;
Start_data=0xf8; // 写指令 11111000
Hdata=WCLCM&0xf0; // 取高四位 DDDD0000
Ldata=(WCLCM << 4)&0xf0; // 取低四位 0000DDDD
Send_byte(Start_data); // 发送起始信号 第1字节-格式:1111ABC
Send_byte(Hdata); // 发送高四位 第2字节-格式:DDDD0000
Send_byte(Ldata); // 发送低四位 第3字节-格式:0000DDDD
}
void Send_byte(unsigned char dat) //发送数据
{
unsigned char i;
for (i=0; i<8; i++)
{
if((dat&0x80)!=0)
{
LCDSID_H();
}
else
{
LCDSID_L();
}
LCDCLK_H(); // 串行同步时钟信号
LCDCLK_L();
dat <<= 1; // 左移
}
delay_us(350); // 延时是必须的
}
void DisplayListChar(unsigned char x, unsigned char y, unsigned char *s) //写入字符串
{
unsigned char add = 0; // 显示地址
switch (y) // 显示地址计数
{
case 0: add = x + 0x80; break; // 第一行的地址
case 1: add = x + 0x90; break; // 第二行的地址
case 2: add = x + 0x88; break; // 第三行的地址
case 3: add = x + 0x98; break; // 第四行的地址
default: break;
}
WriteCommandLCM(0x30); // 8位介面,基本指令集
WriteCommandLCM(add); // 写入地址
while (*s > 0) // 写入字符串
{
WriteDataLCM(*s);
s++;
x++;
delay_us(100);
if(x >= 16)
{
x=0;
y ++;
if(y >= 4)
{
return;
}
switch (y)
{
case 0: add = x + 0x80; break; // 第一行的地址
case 1: add = x + 0x90; break; // 第二行的地址
case 2: add = x + 0x88; break; // 第三行的地址
case 3: add = x + 0x98; break; // 第四行的地址
default: break;
}
WriteCommandLCM(0x30); // 8位介面,基本指令集
WriteCommandLCM(add); // 写入地址
}
}
}
void LCDClean(void) //清屏
{
WriteCommandLCM(0x01);
}