LCD
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD实验程序总框图:
相关头文件定义。h
主要头文件内容:
#define LCD_ClearScr() do{\
while(LCD_IsBusy()); \
LCD_WriteCmd(Clear_Display);\
while(LCD_IsBusy()); \
LCD_WriteCmd(Return_Home);\
while(LCD_IsBusy()); \
LCD_WriteCmd(0x28);\
}while(0)
#define LCD_PutStr(row,column, str) LCD_Putstr( row,column, str)
#define LCD_GetPos( addr) LCD_getPos( addr)
/* 指定连接到LCD数据线的端口*/
#define DATA_PORT PORTD
#define TRIS_DATA_PORT TRISD
/* 指定连接到LCD控制线的端口*/
#define RW_PIN PORTDbits.RD5 /* RD5 接LCD R/nW线*/ #define TRIS_RW TRISDbits.TRISD5
#define RS_PIN PORTDbits.RD4 /* RD4 接LCD RS线*/
#define TRIS_RS TRISDbits.TRISD4
#define E_PIN PORTAbits.RA2 /* RA2 接LCD E线*/
#define TRIS_E TRISAbits.TRISA2
//命令集
typedef enum LCD_CMD
{
Clear_Display = 0x01, //清屏
Return_Home = 0x20 //光标返回
}LCD_CMD;
//光标模式
typedef enum Cursor_Mode
{
I_S=0x07, //AC+1,并且移动
InS=0x06, //AC+1不移动
D_S=0x05, //AC-1,移动
DnS=0x04 //AC-1,不移动
}Cursor_Mode;
//显示控制
typedef enum Dis_Control //大写字母代表1,D:显示C:开关光标B:光标是否闪烁{
DCB=0x0f,
DCb=0x0e,
DcB=0x0d,
Dcb=0x0c,
dCB=0x0b,
dCb=0x0a,
dcB=0x09,
dcb=0x08
}Dis_Control;
//光标移动
typedef enum Cursor_Shift
{
DL=0x10, //光左ac-1
IR=0x14,
LL=0x18, //光和显示一起左
RR=0x1c
}Cursor_Shift;
//功能设置
typedef enum Fun_Set
{
Sin8=0x30,//单5x8
Dou8=0x38,//双5*8
Sin10=0x34,//单5*10
}Fun_Set;
void LCD_Putstr(uint8 row,uint8 column, uint8 *str);
void LCD_Putch(uint8 row,uint8 column, uint8 ch);
uint8 LCD_getPos(uint8 * addr);
void LCD_WriteCGRAM(uint8 * cube);
相关C代码:
void LCD_Putstr(uint8 row,uint8 column, uint8 *str)
{
uint8 addr;
uint8 i=0;
addr = (0x80)+row*(0x40)+column;
while(0 != str[i])
{
LCD_Putch(row,column++,str[i]);
i++;
}
}
void LCD_Putch(uint8 row,uint8 column,uint8 ch)
{
uint8 addr;
addr = (0x80)+row*(0x40)+column-1;
while(LCD_IsBusy()); // 等到LCD空闲
LCD_WriteCmd(addr);
while(LCD_IsBusy()); // 等到LCD空闲
LCD_WriteData(ch);
}
uint8 LCD_getPos(uint8 * addr)
{
uint8 ret;
uint8 data;
/* 为读LCD状态,相应设置I/O口*/
TRIS_DATA_PORT |= 0x0F; // 数据引脚设为输入口RW_PIN = 1; // R/nW 引脚输出高(读)RS_PIN = 0;
//LCD_E_Delay();
E_PIN = 1;
LCD_E_Delay();
/* 判断LCD是否忙,结果存在ret中*/
if(DATA_PORT&0x08)
ret = 1;