lcd1602a51全功能驱动12m晶振 1文档格式.docx
《lcd1602a51全功能驱动12m晶振 1文档格式.docx》由会员分享,可在线阅读,更多相关《lcd1602a51全功能驱动12m晶振 1文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
![lcd1602a51全功能驱动12m晶振 1文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/23/a32b0f59-5d79-481d-9c6b-39345382a34f/a32b0f59-5d79-481d-9c6b-39345382a34f1.gif)
_nop_();
};
//******************LCD控制线说明******************//
//状态字读操作:
输入RS=低、RW=高、EP=高;
输出:
读出状态字;
//数据读出操作:
输入RS=高、RW=高、EP=高;
读出为数据;
//指令写入操作:
输入RS=低、RW=低、EP=上升沿;
无;
//数据写入操作:
输入RS=高、RW=低、EP=上升沿;
无。
//******************LCD1602命令字******************//
#defineLCD_CMD_8DB0x38
#defineLCD_CMD_4DB0x28
#defineLCD_CMD_CLR0x01
//清屏指令
//初始化命令,以下几条(指令)按位或,就可得组合
//0x38//设置5*7二行8数据线
//0x28//设置5*7二行4数据线
//0x01//lcd清屏
//0x02//光标复位指令
//0x0e//整体显示开,光标开
//0x08//整体显示关
//0x0c//整体显示开,光标关
//0x0f//整体显示开,光标开,光标闪烁
//0x0e//整体显示开,光标开,光标不闪烁
//0x04//字符不移,光标左移
//0x06//字符不移,光标右
//0x05//字符移,光标左移
//0x07//字符移,光标右移
//
//控制移动命令,以下几条(指令)按位或,就可得组合
//0x10
//左移动光标
//0x14
//右移动光标
//0x18
//左移动字符
//0x1c
//右移动字符
//LCD1602a5*8自定义字符CGRAM控制
//命令格式:
01A5A4A3A2A1A0
;
A5-A0为CGRAM地址
//从低位起每8个CGRAM组成一个自定义字符,共可定义8个
//例如将自定义字符写入CGRAM的0x08-0x0f间,
//调用lcd_wdat(0x02)就能显示
#ifdefLCD_8DB
#defineLCD_MODELCD_CMD_8DB
#endif
#ifdefLCD_4DB
#defineLCD_MODELCD_CMD_4DB
externucharcodeTAB_LCD_Hex[];
/************************************/
/**********LCD各函数声明*************/
externvoiddelay(ucharx);
externbitlcd_busy();
externvoidlcd_wcmd(ucharcmd);
externvoidlcd_wdat(uchardat);
externvoidlcd_init();
externvoidlcd_PrPos(ucharrow,ucharcol);
externvoidlcd_PrHexByte(ucharprbyte);
externvoidlcd_PrString(uchar*prstring);
externvoidlcd_wCGRAM(ucharcg_pos,uchar*cg_arr);
lcd.c文件:
#include"
LCD.h"
ucharcodeTAB_LCD_Hex[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
A'
B'
C'
D'
E'
F'
/*************************************************************/
/*
*/
/*延时子程序
voiddelay(ucharx)
{ucharj;
while((x--)!
=0)
{
for(j=0;
j<
125;
j++)
}
}
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据*/
staticbitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(LCD_DB_Port&
0x80);
LCD_EN=0;
return(result);
/*******************************************************************/
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
voidlcd_wcmd(ucharcmd)
while(lcd_busy());
LCD_RW=0;
_nop_();
LCD_DB_Port=cmd;
LCD_DB_Port&
=0x0F;
//清高四位
LCD_DB_Port|=(cmd&
0xF0);
//送高四位
//上跳沿时输入数据
LCD_DB_Port|=(cmd<
<
4);
//送低四位
#endif
delayNOP();
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
voidlcd_wdat(uchardat)
LCD_RS=1;
LCD_DB_Port=dat;
LCD_DB_Port|=(dat&
//送高四位数据
LCD_DB_Port|=(dat<
//送低四位数据
/*LCD初始化设定
voidlcd_init()
{
delay(15);
//等待电源稳定
lcd_wcmd(LCD_MODE);
//设置显示模式
delay(5);
lcd_wcmd(0x0c);
//显示开,关光标
lcd_wcmd(0x06);
//移动光标
lcd_wcmd(0x01);
//清除LCD的显示内容
/*设定显示位置
voidlcd_PrPos(ucharrow,ucharcol)
if(row==0)
lcd_wcmd(col|0x80);
//数据指针=80+地址变量
if(row==1)
lcd_wcmd(col|0x80|0x40);
/*显示字符串
voidlcd_PrString(uchar*prstring)//显示一个字符串的子程序
{
while((*prstring)!
='
\0'
)
lcd_wdat(*prstring);
prstring++;
/*显示二进制字节
/*************************************************************/
voidlcd_PrHexByte(ucharprbyte)//显示一个字符子程序
ACC=prbyte;
ACC>
>
=4;
lcd_wdat(TAB_LCD_Hex[ACC]);
//显示高四位
ACC&
//显示低四位
/*写入自定义字符
voidlcd_wCGRAM(ucharcg_pos,uchar*cg_arr)
//cg_pos0-7写入自定义cgram中的位置
uchari;
cg_pos<
=3;
//cg_pos=cg_pos*8,转化成地址
cg_pos|=0x40;
//转化成命令字
for(i=0;
i<
8;
i++)
lcd_wcmd(cg_pos);
lcd_wdat(*cg_arr);
cg_pos++;
cg_arr++;
测试test.c文件:
lcd.h"
ucharcodebell[]={0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};
main()
uchari;
lcd_init();
lcd_PrPos(0,16);
lcd_PrString("
abc"
);
for(i=0;
16;
i++)
lcd_wcmd(0x18);
delay(200);
lcd_wcmd(0x02);
//重置光标
lcd_wcmd(0x01);
//清屏
lcd_wCGRAM(0x01,bell);
//写入自定义字符
lcd_PrPos(1,5);
lcd_wdat(0x01);
//显示自定义字符
while
(1);