📄 lcd.c
字号:
//////////////////////////////////////////
//创新实验室 LCD RT12864M 的串口通信程序//
// 2006/12/3 //
// balisula //
//////////////////////////////////////////
#include <REG52.H>
#include <intrins.h>
#define uchar unsigned char
#define command 1
#define lcddata 0
sbit csl = P1^1;
sbit sid = P1^2;
sbit clkl = P1^3;
sbit rstl = P1^4;
//sbit psb =P3^2;
sbit lcd_bk =P1^5;
void delay_2us(unsigned char us); //精确延时时间=2*us*T+5*T, T为一个机器周期
void delay_ms(unsigned int ms); //延时时间=8*ms*T(约等于,实际值比此值大,延时时间越长,误差越大,最大误差262*T)
void sent_com_bit(uchar sent_bit)
{
uchar temp,i;
temp=sent_bit;
csl=0;
clkl=0;
sid=0;
csl=1;
for(i=0;i<8;i++)
{
clkl=0;
if((temp&0x80)==0x80)
sid=1;
else
sid=0;
temp<<=1;
clkl=1;
_nop_ ();
}
csl=0;
clkl=0;
}
void sent_com_3bit(uchar fun,uchar sent_data)
{
uchar temp1,temp2,temp3;
if(fun==1)
temp1=0xF8; //发送控制指令
else if(fun==0)
temp1=0xFA; //发送数据显示指令
temp2=(sent_data&0xF0); //高4位
temp3=((sent_data<<4)&0xF0);//低四位
sent_com_bit(temp1);
delay_2us(5);
sent_com_bit(temp2);
delay_2us(5);
sent_com_bit(temp3);
delay_2us(5);
}
void sent_position(uchar x,uchar y)
{
uchar address;
switch(y)
{
case 0:
address = 0x80 + x;
break;
case 1:
address = 0x90 + x;
break;
case 2:
address = 0x88 + x;
break;
case 3:
address = 0x98 + x;
break;
default:address = 0x80 + x;
}
sent_com_3bit( command,address );
}
void sent_string(uchar x,uchar y,uchar *sent_data,uchar length)
{
sent_position(x,y);
while(*sent_data&&length)
{
sent_com_3bit( lcddata,*sent_data);
sent_data++;
length--;
}
}
void sent_pic_position(uchar x,uchar y)
{
if(y>31)
{
x+=0x88;
y=(y-32)+0x80;
}
else
{
x+=0x80;
y+=0x80;
}
sent_com_3bit(command,0x34);
sent_com_3bit(command,y);
sent_com_3bit(command,x);
sent_com_3bit(command,0x30);
}
void LCD_Convert(unsigned char x,unsigned char y,unsigned char weith,unsigned char mode) //反白
{
unsigned char flag=0;
unsigned char px=0;
unsigned char py=0;
if (mode) mode=0xff;
if(x%2)
{
flag=1;
}
x/=2;
for(py=0;py<16;py++)
{
sent_pic_position(x,y*16+py);
if(flag) sent_com_3bit(command,0);
for (px=weith;px>0;px--)
{
sent_com_3bit (lcddata,mode);
}
}
sent_com_3bit(command,0x36);
sent_com_3bit(command,0x30);
}
void LCD_clr_pic()
{
unsigned char i;
for(i=0;i<4;i++) LCD_Convert(0,i,16,0);
}
void init_LCD()
{
lcd_bk=1;
rstl=0;
delay_2us(50);
rstl=1;
delay_2us(50);
//psb=0;
sent_com_3bit(command,0x01); //显示清屏
delay_ms(30);
sent_com_3bit(command,0x0C); //显示开,不显示光标(0x0C),显示光标(0x0F)
delay_ms(30);
sent_com_3bit(command,0x80); //显示光标移动设置
delay_ms(30);
LCD_clr_pic();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -