📄 lcd.c
字号:
char read_status()//判断"忙"子程序
{
char rb;
PORTB=0xff;
DDRB=0x0; //端口B设为输入方式
E_L;
RS_L;
RW_H;
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
E_H;
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
rb=PINB;
rb=rb&0x80;
E_L;
DDRB=0xff; //端口B设为输出方式
return rb;
}
void init_prog(void)//初始化
{
//REST_L;
//REST_H;
//delay_1ms();
com = 0xc0;//第'0'行开始
wr_command1();
wr_command2();
com = 0x3f;//第'0'列开始
wr_command1();
wr_command2();
}
void clear_prog(void)
{
unsigned int i;
unsigned int j;
for(i=0;i<8;i++)
{
com = (0xb8 + i);//页面地址设置
wr_command1();
wr_command2();
com = 0x40;//起始列地址设置
wr_command1();
wr_command2();
for(j=0;j<64;j++)
{
dat = 0;//RAM清零
wr_data1();
wr_data2();
}
}
}
void clear_area(unsigned char X0,unsigned char Y0,unsigned char len)
{
unsigned char i;
unsigned char temp;
for(temp = 0; temp < len; temp++)
{
Lcd_set_XY(X0,Y0);
if(flag2 == 0)//显示在左半屏
{
for(i=0;i<8;i++)//字符上半部分
{
dat = 0;
wr_data1();
}
com = (0xb8 + page +1);//下半个字符页面地址设置
wr_command1();
com = (0x40 + column);//起始列地址设置
wr_command1();
for(i=8;i<16;i++)//字符下半部分
{
dat = 0;
wr_data1();
}
}
else//显示在右半屏
{
for(i=0;i<8;i++)//字符上半部分
{
dat = 0;
wr_data2();
}
com = (0xb8 + page +1);//下半个字符页面地址设置
wr_command2();
com = (0x40 + column );//起始列地址设置
wr_command2();
for(i=8;i<16;i++)//字符下半部分
{
dat = 0;
wr_data2();
}
}
Y0 += 1;
if(Y0>15)//换行
{
X0 +=1;
Y0 -=16;
}
}
}
void display_prog()//显示程序
{
unsigned int m;
unsigned int n;
for(page=0;page<8;page++)
{
com = (0xb8 + page);//页面地址设置
wr_command1();
wr_command2();
com = 0x40;//起始列地址设置
wr_command1();
wr_command2();
for(m=0;m<64;m++)
{
dat = Bmp052[128*page + m];//(1-64列)取数据
wr_data1();
}
for(n=64;n<128;n++)
{
dat = Bmp052[128*page + n];//(65-128列)取数据
wr_data2();
}
}
}
void wr_command1(void)//写命令(1-64列)子程序
{
CS1_H;
CS2_L;
while(read_status() != 0);
//read_status();
RS_L;
RW_L;
PORTB = com;
E_H;
//delay_1ms();
E_L;
}
void wr_command2(void)//写命令(65-128列)子程序
{
CS1_L;
CS2_H;
while(read_status() != 0);
//read_status();
RS_L;
RW_L;
PORTB = com;
asm("NOP");
E_H;
//delay_1ms();
E_L;
}
void wr_data1()//写数据(1-64列)子程序
{
CS1_H;
CS2_L;
while(read_status() != 0 );
RS_H;
RW_L;
PORTB = dat;
E_H;
asm("NOP");
E_L;
}
void wr_data2(void)//写数据(65-128列)子程序
{
CS1_L;
CS2_H;
while(read_status() != 0);
RS_H;
RW_L;
PORTB = dat;
E_H;
asm("NOP");
E_L;
}
//设置LCD坐标.8页分为4行显示,X(行):0-3;Y(列):0-15,0-7为左半屏,8-15为右半屏
void Lcd_set_XY(unsigned char X0,unsigned char Y0)
{
if(Y0<=7)//左半屏
{
com = (0xb8 + X0 * 2);//页面地址设置
page = X0 * 2;
wr_command1();
com = (0x40 + Y0 * 8);//起始列地址设置
column = Y0 * 8;
wr_command1();
flag2 = 0;
}
else//右半屏
{
com = (0xb8 + X0 * 2);//页面地址设置
page = X0 * 2;
wr_command2();
com = (0x40 + ((Y0-8) * 8));//起始列地址设置
column = (Y0 -8)* 8;
wr_command2();
flag2 = 1;
}
X1 = X0;
Y1 = Y0;
}
void Lcd_write_char(unsigned char wb)
{
unsigned char i;
Lcd_set_XY(X1,Y1);
//wb -= 48;
if(wb >= 0x20)
wb -= 0x20;
else
wb = 0x20;
if(wb<=96)//0,1,2,3,4,5,6,7,8,9
{
if(flag2 == 0)//显示在左半屏
{
for(i=0;i<8;i++)//字符上半部分
{
dat = ASC_MSK[wb][i];
wr_data1();
}
com = (0xb8 + page +1);//下半个字符页面地址设置
wr_command1();
com = (0x40 + column);//起始列地址设置
wr_command1();
for(i=8;i<16;i++)//字符下半部分
{
dat = ASC_MSK[wb][i];
wr_data1();
}
}//end if flag2==0
else//显示在右半屏
{
for(i=0;i<8;i++)//字符上半部分
{
dat = ASC_MSK[wb][i];
wr_data2();
}
com = (0xb8 + page +1);//下半个字符页面地址设置
wr_command2();
com = (0x40 + column );//起始列地址设置
wr_command2();
for(i=8;i<16;i++)//字符下半部分
{
dat = ASC_MSK[wb][i];
wr_data2();
}
}//end else
}//end if 0-9
Y1 += 1;
if(Y1>15)//换行
{
X1 +=1;
Y1 -=16;
}
}
//写ASCII字符串函数.X(行):0-3;Y(列):0-15,0-7为左半屏,8-15为右半屏
void Lcd_write_string(unsigned char X0,unsigned char Y0,unsigned char *s)
{
while((*s)!=0)
{
delay();
delay();
Lcd_set_XY(X0,Y0);
Lcd_write_char(*s);
Y0++;
s++;
if(Y0>15)//换行
{
X0 +=1;
Y0 -=16;
}
}
// add
Y1 += 1;
if(Y1>15)//换行
{
X1 +=1;
Y1 -=16;
}
}
void Lcd_write_hanzi_GH(unsigned char wb)
{
unsigned char i;
if(flag2 == 0)//显示在左半屏
{
for(i=0;i<16;i++)//字符上半部分
{
dat = hanzi[wb][i];
wr_data1();
}
com = (0xb8 + page +1);//下半个汉字页面地址设置
wr_command1();
com = (0x40 + column);//起始列地址设置
wr_command1();
for(i=16;i<32;i++)//汉字下半部分
{
dat = hanzi[wb][i];
wr_data1();
}
}
else//显示在右半屏
{
for(i=0;i<16;i++)//汉字上半部分
{
dat = hanzi[wb][i];
wr_data2();
}
com = (0xb8 + page +1);//下半个汉字页面地址设置
wr_command2();
com = (0x40 + column );//起始列地址设置
wr_command2();
for(i=16;i<32;i++)//汉字下半部分
{
dat = hanzi[wb][i];
wr_data2();
}
}
}
void Lcd_write_hanzi_string_GH(unsigned char X0,unsigned char Y0,unsigned char *s)
{
char c1,c2;
unsigned int i;
while((*s)!=0)
{
c1 = *s;
c2 = *(s + 1);
for(i = 0; i < sizeof(hanzi_Tab)/3; i ++)
{
if((c1 == (char)hanzi_Tab[i][0]) && (c2 == (char)hanzi_Tab[i][1]))
{
Lcd_set_XY(X0,Y0);
Lcd_write_hanzi_GH((unsigned char)i);
Y0 += 2;
break;
}
}
s++;
if(Y0>15)//换行
{
X0 +=1;
Y0 -=16;
}
}
X1 = X0;
Y1 = Y0+1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -