📄 main.c
字号:
#include<reg51.h>
#include"omc12864.h"
#define disp_off 0x3e //显示关指令
#define disp_on 0x3f //显示开指令
#define disp_x 0xb8 //地址页初值bin000
#define disp_z 0xc0 //显示起始行偏移量bin000000
#define disp_y 0x40 //列地址初值bin000000
#define comm 0 //指令
#define dat 1 //数据
#define data_ora P0 //数据口
sbit rs =P1^2; //Data or Instrument Select,H:写数据,L:写指令
sbit rw =P1^3; //Write or Read,H:read,L:write
sbit e =P1^4; //读写使能
sbit cs1=P1^0; //cs1=H,选择左半屏
sbit cs2=P1^1; //cs2=H,选择右半屏
sbit rst=P1^5; //Lcm reset,低有效
sbit bf =P0^7; //检测忙状态
sbit res=P0^4; //检测复位状态
void wr_lcd (unsigned char dat_comm,unsigned char content);
void delay (unsigned int us);
void delay1 (unsigned int ms);
void Puthazs(unsigned char x, unsigned char y ,unsigned char len,unsigned char code *hazs);
void Puthaz(unsigned char x,unsigned char y,unsigned char chacnum,unsigned char code *ziku);
/*****************************************************************
函数功能:显示ASCII码字符
参数说明:x(行,取值0~3),y(列,取值0~15)为定位坐标
ch为ASCII字符
******************************************************************/
void PutChar(unsigned char x,unsigned char y,unsigned char asc2key)
{
unsigned char i;
x=x&0x0F;
if((y=(y&0x0F))>7){cs1=1;cs2=0;y-=8;} //右半屏显示
else{cs1=0;cs2=1;} //左半屏显示
wr_lcd (comm,disp_on);
//显示字符上半部分
wr_lcd (comm,disp_x+2*x); //设置页
wr_lcd (comm,disp_z); //设置起始行
wr_lcd (comm,disp_y+8*y); //设置列
for(i=0;i<8;i++)
wr_lcd (dat,asc2[(asc2key-32)*16+i]); //根据ASCII码开始位置的不同来修改32
//显示字符下半部分
wr_lcd (comm,disp_x+2*x+1); //设置页
wr_lcd (comm,disp_z); //设置起始行
wr_lcd (comm,disp_y+8*y); //设置列
for(i=8;i<16;i++)
wr_lcd (dat,asc2[(asc2key-32)*16+i]); //根据ASCII码开始位置的不同来修改32
}
/********************************************************************************
函数功能: 字符串输入函数,可选择定位也可不用此功能(x=0,y=0或都超出范围)
具有自动换行功能,当写满屏时转到(0,0)从头开始
参数说明: x(行);y(列);str*字库
x,y的值可较灵活,超出范围时自动从(0,0)点显示
*********************************************************************************/
//监测忙状态
void chk_busy (void)
{
data_ora=0xff;
rs=0;
rw=1;
;
e=1;
while(bf||res==1);
e=0;
}
void PutStr(unsigned char x, unsigned char y , unsigned char *str)
{
unsigned char i,len=0;
/* 计算字符串长度 */
while (str[len] >31)
++len;
/* 显示字符串 */
for (i=0;i<len;i++)
{
if ( y>= 16 )
{
if(x<3)
{
y = 0;
x += 1; //若超出范围则下一行显示
}
else {x=0;y=0;} //超出屏幕范围,则从屏幕开头显示
}
PutChar(x,y++,str[i]);
}
}
//初始化
void init_lcd (void)
{
// rst=0;
delay(50);
// rst=1;
cs1=0;cs2=0;
wr_lcd (comm,disp_off);
wr_lcd (comm,disp_on);
}
//清屏
void clear(void)
{
unsigned char i,j;
cs1=0;cs2=0;
wr_lcd (comm,disp_on);
for(j=0;j<8;j++)
{
wr_lcd (comm,disp_x+j);
wr_lcd (comm,disp_z);
wr_lcd (comm,disp_y);
for(i=0;i<64;i++)wr_lcd (dat,0x00);
}
}
//写数据或命令到LCD
void wr_lcd (unsigned char dat_comm,unsigned char content)
{
// chk_busy ();
rs=dat_comm;
rw=0;
data_ora=content;
e=1;
;
e=0;
}
void xwpclear(void)
{
unsigned char x,y;
if ( y>= 16 )
{
if(x<3)
{
y = 0;
x += 1; //若超出范围则下一行显示
}
else {x=0;y=0;} //超出屏幕范围,则从屏幕开头显示
}
PutChar(x,y++," ");
}
void main ()
{
init_lcd ();
clear();
while(1)
{
clear();
PutStr(0,0,"Hello! Welcome! lilei 0000 0000 0000 0111 ");
delay1(1500);
clear();
xwpclear();
Puthazs(0,0,sizeof(dax2)/sizeof(dax2[0])>>5,dax2);
delay1(200);
}
}
void delay (unsigned int us)
{
while(us--);
}
void delay1 (unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++)
;
}
/*********************************************************************************
函数功能:格式化((16*16)*8*4)从字库中提取单个汉字
参数说明:定位x:行,0~3 y:列,0~7 chacnum:所取汉字在字库中的标号(后面生成的标号)
ziku:字库名
*********************************************************************************/
void Puthaz(unsigned char x,unsigned char y,unsigned char chacnum,unsigned char code *ziku)
{
unsigned char i;
x=x&0x0F;
if((y=(y&0x07))>3){cs1=1;cs2=0;y-=4;} //右半屏显示
else{cs1=0;cs2=1;} //左半屏显示
wr_lcd (comm,disp_on);
//显示汉字上半部分
wr_lcd (comm,disp_x+2*x); //设置页
wr_lcd (comm,disp_z); //设置起始行
wr_lcd (comm,disp_y+16*y); //设置列
for(i=0;i<16;i++)
wr_lcd (dat,ziku[chacnum*32+i]); //根据ASCII码开始位置的不同来修改32
//显示汉字下半部分
wr_lcd (comm,disp_x+2*x+1); //设置页
wr_lcd (comm,disp_z); //设置起始行
wr_lcd (comm,disp_y+16*y); //设置列
for(i=16;i<32;i++)
wr_lcd (dat,ziku[chacnum*32+i]); //根据ASCII码开始位置的不同来修改32
}
/**********************************************************************************************
函数功能:从x(行)y(列)位置开始,从字库的第一个字输出一直到标号为len的字结束,包含len
**********************************************************************************************/
void Puthazs(unsigned char x, unsigned char y ,unsigned char len,unsigned char code *hazs)
{
unsigned char i;
/* 计算汉字个数 */
// len=((sizeof(hazs)/sizeof(hazs[0]))>>5);
/* 显示字符串 */
for (i=0;i<len;i++)
{
if ( y>= 8 )
{
if(x<3)
{
y = 0;
x += 1; //若超出范围则下一行显示
}
else {x=0;y=0;} //超出屏幕范围,则从屏幕开头显示
}
Puthaz(x,y++,i,hazs);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -