📄 51blcd.h
字号:
#ifndef __51BLCD_H__
#define __51BLCD_H__
#define uchar unsigned char
#define uint unsigned int
//以下常数定义来自LCD数据手册
#define LCD_line_1 0x00
#define LCD_line_2 0x40
#define LCD_line_3 0x14
#define LCD_line_4 0x54
#define LCD_CLEAR_SCREEN 0x01 //清屏
#define LCD_HOMING 0x02 //光标返回原点
#define LCD_AC_UP 0x06
#define LCD_AC_DOWN 0x04 //default
#define LCD_MOVE 0x05 //画面可平移
#define LCD_NO_MOVE 0x04 //default
#define LCD_SHOW 0x0c //显示开
#define LCD_HIDE 0x08 //显示关
#define LCD_CURSOR 0x0a //显示光标
#define LCD_NO_CURSOR 0x08 //无光标
#define LCD_FLASH 0x09 //光标闪动
#define LCD_NO_FLASH 0x08 //光标不闪动
#define LCD_PIC_MOVE 0x18 //画面平移一个字符
#define LCD_CURSOR_MOVE 0x10 //光标平移一个字符
#define LCD_RIGHT_MOVE 0x14 //右移
#define LCD_LEFT_MOVE 0x10 //左移
#define LCD_SET_7 0x38 //8位接口,双行显示,5*7字符
#define LCD_SET_10 0x3c //8位接口,双行显示,5*10字符
#define LCD_CGRAM_ADDR(addr) (0x40|addr) //cgaddr 0~3fH
#define LCD_DDRAM_ADDR(addr) (0x80|addr) //ddaddr
uchar code CGRAM[8][8] = {{0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02},{0x11,0x0A,0x04,0x1F,0x04,0x1F,0x04,0x00},{0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02},{0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02},{0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02},{0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02},{0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02},{0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02}};
#define CW_add XBYTE[0x87ff] // 1000 0111
#define CR_add XBYTE[0xA7ff] // 1010 0111
#define DW_add XBYTE[0x97ff] // 1001 0111
#define DR_add XBYTE[0xB7ff] // 1011 0111
//8us延时
void delay_lcd(uchar i)
{
while(i--);
}
//LCD状态检测
uchar LCD_r_state(uchar *addr)
{
uchar temp1,temp2;
temp1 = CR_add;//读LCD状态
temp2 = temp1 & 0x7f;
*addr = temp2;
//根据最高位判断LCD是否忙
if((bit)(temp1 & 0x80)) return (1);
else return (0);
}
//将要显示的字符写入LCD
void Print(uchar *str)
{
while(*str!='\0')
{
DW_add = *str;//直接针对外部地址些 movx指令
str++;
delay_lcd(10);
}
}
//带定位参数的字符写函数
void LCD_w_data(uchar line,uchar column,uchar *p_data)
{
switch(line)
{
case 1:
CW_add = LCD_DDRAM_ADDR(LCD_line_1+column-1);//光标定位
delay_lcd(10);
Print(p_data);
break;
case 2:
CW_add = LCD_DDRAM_ADDR(LCD_line_2+column-1);
delay_lcd(10);
Print(p_data);
break;
case 3:
CW_add = LCD_DDRAM_ADDR(LCD_line_3+column-1);
delay_lcd(10);
Print(p_data);
break;
case 4:
CW_add = LCD_DDRAM_ADDR(LCD_line_4+column-1);
delay_lcd(10);
Print(p_data);
break;
default:
break;
}
}
//LCD初始化
void LCD_init(void)
{
uchar *p,temp1;
p = &temp1;
while(LCD_r_state(p));
CW_add = LCD_SET_7;
delay_lcd(10);
CW_add = LCD_SHOW;
delay_lcd(10);
CW_add = LCD_CLEAR_SCREEN;
delay_lcd(205);
CW_add = LCD_AC_UP;
delay_lcd(10);
CW_add = LCD_CURSOR;
delay_lcd(10);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -