📄 5.2.3-2.c
字号:
#include<reg51.h>
#include<stdlib.h>
#define uchar unsigned char
uchar data Column; /*定义"列"变量*/
uchar data Page;
sbit D_I=P3^2;
sbit R_W=P3^3;
sbit E=P3^4;
sbit CSA=P3^1;
sbit CSB=P3^0;
sbit BUSY=P1^7;
sbit Page_4=P1^4;
char code Hanzi[4][32]=
{
0x40,0xB0,0x92,0x96,0x9A,0x92,0xF2,0x9E,0x92,0x91,0x99,0x95,0x91,0x50,0x30,0x00, /*爱*/
0x00,0x00,0x40,0x30,0x8C,0x83,0x46,0x2A,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,0x00,
0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0xFF,0x20,0x22,0xAC,0x20,0x30,0x20,0x00, /*我*/
0x00,0x08,0x48,0x84,0x7F,0x02,0x21,0x10,0x09,0x06,0x1A,0x61,0x80,0xE0,0x00,0x00,
0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0x08,0xFC,0x08,0x00, /*中*/
0x00,0x03,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00,
0x00,0x40,0x20,0x10,0xFC,0x03,0x40,0x20,0x10,0xFF,0x08,0x04,0x06,0xC0,0x00,0x00, /*华*/
0x04,0x04,0x04,0x04,0x05,0x04,0x04,0xFF,0x04,0x04,0x05,0x05,0x05,0x05,0x04,0x00
};
void Inquire_Busy_L(); /*左半屏查询是否"忙"*/
void Send_Dat_L(uchar d); /*送左半屏指令*/
void Inquire_Busy_R(); /*右半屏查询是否"忙"*/
void Send_Dat_R(uchar d); /*送右半屏指令*/
void Clear(); /*清屏*/
void Ini(); /*初始化*/
void Send_Dat_Disp_L(uchar d); /*送左半屏显示*/
void Send_Dat_Disp_R(uchar d); /*送右半屏显示*/
void Lcd_Disp(char *p); /*显示*/
void Hanzi_Disp();
void Delay();
/***************************************主程序******************************************/
void main()
{
Delay();Delay();Delay(); /*延时*/
IE=0x81;TCON=0x00;
Ini(); /*初始化*/
Clear(); /*清屏*/
Hanzi_Disp(); /*显示汉字*/
}
/*********************************查询左半屏是否"忙"子程序******************************/
void Inquire_Busy_L()
{
R_W=1; R_W=1;D_I=0;D_I=0; /*读取状态字*/
CSA=0;CSA=0; CSB=1;CSB=1; /*选左半屏*/
Loop:
P1=0xFF;
E=1;E=1; /*使能*/
E=0;E=0;
if(BUSY){goto Loop;}
CSA=1; CSA=1; /*是CSA为高电平,为选择左半区作准备*/
D_I=1;D_I=1; R_W=1;R_W=1; /*读数据*/
}
/**********************************送左半屏指令子程序***********************************/
void Send_Dat_L(uchar d)
{
R_W=0; R_W=0;D_I=0;D_I=0; /*设置显示开头*/
CSA=0;CSA=0; /*左半屏*/
E=1;E=1;
P1=d;P1=d;
E=0;E=0;
CSA=1;CSA=1;
D_I=1;D_I=1; R_W=1;R_W=1; /*读数据*/
}
/*********************************查询右半屏是否"忙"子程序******************************/
void Inquire_Busy_R()
{
R_W=1;R_W=1; D_I=0;D_I=0; /*读状态字*/
CSB=0;CSB=0; /*右半屏*/
Loop2:
P1=0xFF;
E=1;E=1;
E=0;E=0;
if(BUSY){goto Loop2;}
CSB=1; CSB=1; /*为访问左区作准备*/
D_I=1;D_I=1;R_W=1;R_W=1; /*读数据*/
}
/**********************************送右半屏指令子程序***********************************/
void Send_Dat_R(uchar d)
{
R_W=0; R_W=0; D_I=0;D_I=0; /*设置显示开头*/
CSB=1;CSB=1; /*右半屏*/
E=1;E=1;
P1=d;P1=d;
E=0;E=0;
CSB=0;CSB=0;
D_I=1;D_I=1; R_W=1;R_W=1; /*读数据*/
}
/*********************************送左半屏显示字符子程序********************************/
void Send_Dat_Disp_L(uchar d)
{
R_W=0; R_W=0; D_I=1;D_I=1; /*写数据*/
CSA=1;CSA=1;
E=1;E=1;
P1=d;P1=d;
E=0;E=0;
CSA=0;CSA=0;
D_I=1;D_I=1; R_W=1;R_W=1; /*读数据*/
}
/*********************************送右半屏显示字符子程序********************************/
void Send_Dat_Disp_R(uchar d)/**/
{
R_W=0; R_W=0; D_I=1;D_I=1; /*写数据*/
CSB=1;CSB=1;
E=1;E=1;
P1=d;P1=d;
E=0;E=0;
CSB=0;CSB=0;
D_I=1;D_I=1; R_W=1;R_W=1; /*读数据*/
}
/*************************************延时子程序****************************************/
void Delay()
{
uchar data i,j;
for(i=0;i<255;i++)
{for(j=0;j<255;j++);}
}
/************************************初始化子程序***************************************/
void Ini()
{
E=0;R_W=1;D_I=1;CSA=CSB=0;Delay();
Inquire_Busy_L();
Send_Dat_L(0x3e); /*关显示指令*/
Inquire_Busy_R();
Send_Dat_R(0x3e); /*开显示指令*/
Inquire_Busy_L();
Send_Dat_L(0x3f); /*设置起始行*/
Inquire_Busy_R();
Send_Dat_R(0x3f);
Inquire_Busy_L();
Send_Dat_L(0xc0);
Inquire_Busy_R();
Send_Dat_R(0xc0);
}
/****************************************清屏子程序*************************************/
void Clear()
{
uchar data i,j,Disp_Page;
for(i=0;i<8;i++)
{
Disp_Page=i;
Disp_Page=Disp_Page|0xb8; /*设置页地址*/
Inquire_Busy_L();
Send_Dat_L(Disp_Page);
Inquire_Busy_L();
Send_Dat_L(0x40); /*设置列地址*/
for(j=0;j<64;j++)
{Send_Dat_Disp_L(0x00);}
}
for(i=0;i<8;i++)
{
Disp_Page=i;
Disp_Page=Disp_Page|0xb8; /*设置页地址*/
Inquire_Busy_R();
Send_Dat_R(Disp_Page);
Inquire_Busy_R();
Send_Dat_R(0x40); /*设置列地址*/
for(j=0;j<64;j++)
{Send_Dat_Disp_R(0x00);}
}
}
/***********************************液晶显示子程序**************************************/
void Lcd_Disp(char *p)
{
uchar idata i;
char idata ch;
for(i=0;i<8;i++)
{
ch=*p;
p++;
Send_Dat_Disp_L(ch);
Send_Dat_Disp_R(ch);
}
}
/*************************************汉字显示子程序************************************/
void Hanzi_Disp()
{
uchar data i;
Clear();
P1=0xbc; /*页地址*/
Column=0x40; /*列地址*/
Inquire_Busy_L();
Send_Dat_L(Page);
Inquire_Busy_L();
Send_Dat_L(Page);
Inquire_Busy_L();
Send_Dat_L(Column);
for(i=0;i<4;i++) /*显示汉字上半部分*/
{
Lcd_Disp(&Hanzi[i][0]);
Lcd_Disp(&Hanzi[i][8]);
}
Page=0xbd; /*页地址加1*/
Column=0x40; /*列地址*/
Inquire_Busy_L();
Send_Dat_L(Page);
Inquire_Busy_L();
Send_Dat_L(Page);
Inquire_Busy_L();
Send_Dat_L(Column);
for(i=0;i<4;i++) /*显示汉字下半部分*/
{
Lcd_Disp(&Hanzi[i][0]);
Lcd_Disp(&Hanzi[i][8]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -