📄 lcd.c
字号:
/**********************************************************************
-----------4脚 rs = PC.0;
-----------5脚 rw = PC.1;
-----------6脚 e = PC.2;
-----------数据口为 P0口
-----------1脚 VSS - GND(0V)
-----------2脚 VDD - Supply Voltage For Logic (+5V)
-----------15脚 PSB 接高电平5V
-----------17脚 /RST 接高电平5V
-----------19脚 LEDA - 背光源正极(+5V) //或通过华东变阻器分压 取3.0V时,亮度适中
-----------20脚 LEDK - 背光源负极(OV)
*****************************************************************************
汉字字符显示坐标(OCMJ4X8C、OCMJ4X8C_3、OCMJ4X8C_6)
X 坐标
Line1 80H 81H 82H 83H 84H 85H 86H 87H
Line2 90H 91H 92H 93H 94H 95H 96H 97H
Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
*************************************************************************/
#define uint unsigned int
#define uchar unsigned char
#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
#define dat 1
#define Data PORTA
#define rs 4
#define rw 5
#define e 6
#define rs_H PORTD|= BIT(rs)
#define rs_L PORTD&= ~BIT(rs)
#define rw_H PORTD|= BIT(rw)
#define rw_L PORTD&= ~BIT(rw)
#define e_H PORTD|= BIT(e)
#define e_L PORTD&= ~BIT(e)
/********************************应用程序**********************************/
void init_lcd (void); //LCD初始化
void chn_disp (uchar *chn); //显示汉字或字符
void disp_one_word (uchar addr,uchar *chn);//显示一个汉字
void disp_two_char (uchar addr,uchar Data1,uchar Data2);//显示两个字符
void disp_one_char (uchar addr,uchar Data1);//显示一个字符
void lat_disp (uchar data1,uchar data2); //显示点阵
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl);//反白
void clrram (void); //清DDRAM
void wr_lcd (uchar dat_comm,uchar content); //向LCD写命令或数据
void delay1us (uint us); //微秒级延时
void delay1ms (uint ms); //毫秒级延时
/*************************************************************************/
uchar tab[10]={'0','1','2','3','4','5','6','7','8','9'};
uchar tab1[200]={ //地址,参看此C文件开头的地址表
" 中国矿业大学 " //80H~87H
" " //88H~8FH
" 信电学院 " //90H~97H
" 2007年07月13日" //98H~9FH
};
uchar tab2[]={ //地址,参看此C文件开头的地址表
"杂散电流测试仪 " //80H~87H
" " //88H~8FH
" " //90H~97H
" " //98H~9FH
};
uchar SetTimeTab[]={ //地址,参看此C文件开头的地址表
" 调整时间 " //80H~87H
" " //88H~8FH
" " //90H~97H
" " //98H~9FH
};
/******************LCD初始化************************/
void init_lcd (void)
{
//rst=1; //硬件中 已经直接接+5V
//psb=1;
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
/****************************************************/
/*****************显示汉字或字符*********************/
void chn_disp (uchar *chn)
{
uchar i,j;
wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
for (j=0;j<4;j++) //第一行到第四行 显示
{
for (i=0;i<16;i++)
wr_lcd (dat,chn[j*16+i]);
}
}
/****************************************************/
/*******************显示一个汉字*********************/
void disp_one_word (uchar addr,uchar *chn)//
{
uchar i;
wr_lcd (comm,0x30);
wr_lcd (comm,addr);
for (i=0;i<2;i++)
wr_lcd (dat,chn[i]);
}
/****************************************************/
/*******************显示两个字符*********************/
void disp_two_char (uchar addr,uchar Data1,uchar Data2)
{
wr_lcd (comm,0x30);
//wr_lcd (comm,0x80);
wr_lcd (comm,addr); //在addr地址里写字符
wr_lcd (dat,Data1); //写第一个字符
wr_lcd (dat,Data2); //写第二个字符
}
/****************************************************/
/*******************显示一个字符*********************/
void disp_one_char (uchar addr,uchar Data1)
{
wr_lcd (comm,0x30);
wr_lcd (comm,addr); //在addr地址里写字符
wr_lcd (dat,Data1); //写第一个字符
}
/****************************************************/
/*********************显示点阵***********************/
void lat_disp (uchar data1,uchar data2)
{
uchar i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data1);
wr_lcd (dat,data1);
}
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2+1);
wr_lcd (comm,x+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data2);
wr_lcd (dat,data2);
}
}
x=x2;
}
wr_lcd (comm,0x36);
}
/****************************************************/
/*********************反白显示***********************/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16 xl * yl
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
uchar i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y0+j);
wr_lcd (comm,x0+i);
wr_lcd (comm,0x30);
wr_lcd (dat,data1);
wr_lcd (dat,data2);
}
}
wr_lcd (comm,0x36);
}
/****************************************************/
/**********************清DDRAM***********************/
void clrram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
}
/****************************************************/
/****************向LCD写入命令或数据*****************/
void wr_lcd (uchar dat_comm,uchar content)
{
//chk_busy ();
delay1us(100);
if(dat_comm)
{
rs_H;
rw_L;
}
else
{
rs_L;
rw_L;
}
Data=content; //output data or comm
e_H;
asm("nop");
asm("nop");
asm("nop");
e_L;
}
/****************************************************/
/*********************延时1uS************************/
void delay1us (uint us) //delay time
{
while(us--);
}
/****************************************************/
/*********************延时1mS************************/
void delay1ms(uint ms)
{
uint i;
for (; ms>0; ms--)
for (i=0; i<1500; i++)
;
}
/****************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -