⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 51单片机字符型128*64液晶温度曲线实现程序
💻 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 + -