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

📄 w27c020.c

📁 读二级字库并显示字程序
💻 C
字号:
#include <SST89x5xxRD2.H>
#include<intrins.h>
#include <absacc.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

/**************I/O口定义*****************/
sbit A16=P3^3;
sbit A17=P1^7;
sbit BUZ=P3^4;
sbit CE =P1^2;
sbit E1 =P1^0;
sbit E2 =P1^1;
sbit COL2=P1^7;
sbit COL3=P1^6;
sbit COL4=P1^5;
sbit COL5=P1^4;

sbit Lcdbusy=P0^7; 	//working:1,ready:0
sbit AO=P2^0;
sbit RW=P2^1;

/**************变量定义******************/
uchar AddrH,AddrM,AddrL;
uchar sum;
uchar zk_data[32];

/**************位定义********************/


/**************函数定义******************/
void Read_27C020(uchar qw,uchar wh); //读27C020的数据
void delayms(uchar delay);
/**********************LCD控制子程序*******************/
void LCD_RDY_L(void);
void LCD_RDY_R(void);
void WR_CMDL(uchar cmd);
void WR_CMDR(uchar cmd);
void WR_DATAL(uchar dt);
void WR_DATAR(uchar dt);
void Lcd_clr();
void disphz (uchar lcd_f,bit zf,bit underside);
void disptu (uchar code *img);
void wrlattice (uchar lattice1,uchar lattice2,uchar lcd_f,uchar lcd_page);
void Lcd_init();


main(void)
{
	P0   =0xff;
	P1   =0xff;
    P2   =0xff;
	P3   =0xef;
	P4   =0x02;
	AUXR|=0x01;
	PCON&=0xef;//上电复位标志清‘0’
	TMOD=0x21; //T0:16定时器
	SCON=0x50; //10 bit 1 start 8 data 1 stop (50H=01010000B)
	TH1=0xfd;  //波特率:9600bps
	TL1=0xfd; 
	TL0=0xed;  //5ms 
	TH0=0xff;  
	T2CON=0x00;//T2为16位定时器
	TH2=0x4b;  //50MS
	TL2=0xfd;
	IE=0xb2;   //EA,uart,T0,T2
	//TR0=1;				 
	//TR1=1;
	//TR2=1;
 	//PS=1;	   //串口中断优先
	Lcd_init( );  
	while(1)
	{
		Read_27C020(0x39,0x83);	//求
		disphz(0x00,0,0);
		Read_27C020(0x42,0x21);	//实
		disphz(0x10,0,0);
		Read_27C020(0x54,0x39);	//智
		disphz(0x20,0,0);
		Read_27C020(0x36,0x60);	//能
		disphz(0x30,0,0);
			
	}

}




void Read_27C020(uchar qw,uchar wh) //读27C020的数据,qw:区号,wh:位号
{
	ulong reg;
	uchar i;
	//十六进制转换成十进制
	qw=((qw&0xf0)>>4)*10+(qw&0x0f);
	wh=((wh&0xf0)>>4)*10+(wh&0x0f);
	//区位码-字模地址转换公式
	reg=(qw-1)*94+(wh-1);
	reg*=32;
	AddrH=reg>>16 & 0xff;
	AddrM=reg>>8 & 0xff;
	AddrL=reg & 0xff;
	//地址补偿
	AddrM+=(AddrH+1)*0x20;
	if(CY) 
	{
		AddrH++;AddrM+=0x20;
	}
	//读取数据
	EA=0;
	AUXR|=0x02;
	P1=0xf8;
	if(AddrH&0x01) A16=1;
	else A16=0;
	if(AddrH&0x02) A17=1;
	else A17=0;
    for(i=0;i<32;i++) 
	   zk_data[i]=XBYTE[(AddrM*0x100+AddrL)+i];
	A16=1;P1=0xff;AUXR&=0xfd;EA=1;
}


void delayms(uchar delay)
{
	unsigned int i;
	for(;delay>0;delay--)
	{
		for(i=0;i<125;i++)
		{;}
	}
}

/***********************液晶显示模块*******************************/


//检测LCD左半部是否空闲
void LCD_RDY_L(void)
{
	uchar i;
	AO=0;
	RW=1;
	E1=1;
	for(i=0;i<20;i++)
	{
		if(Lcdbusy) {  _nop_();_nop_();_nop_();_nop_();_nop_();}
		else break;
	}
	E1=0;
}
//检测LCD右半部是否空闲
void LCD_RDY_R(void)
{
	uchar i;
	AO=0;
	RW=1;
	E2=1;
	for(i=0;i<20;i++)
	{
		if(Lcdbusy) {  _nop_();_nop_();_nop_();_nop_();_nop_();}
		else break;
	}
	E2=0;
}
//写LCD左半部命令
void WR_CMDL(uchar cmd)
{
	LCD_RDY_L() ;
	E1=1;
	AO=0;
	RW=0;
	P0=cmd;
	E1=0;
	E1=1;E2=0;WR=0;WR=1;E2=1; 
}
//写LCD右半部命令
void WR_CMDR(uchar cmd)
{
	LCD_RDY_R() ;
	E2=1;
	AO=0;
	RW=0;
	P0=cmd;
	E2=0; 
	E2=1;E1=0;WR=0;WR=1;E1=1;
}
//写LCD左半部数据
void WR_DATAL(uchar dt)
{
	LCD_RDY_L() ;
	E1=1;
	AO=1;
	RW=0;
	P0=dt;
	E1=0;
	E1=1;E2=0;WR=0;WR=1;E2=1;
}
//写LCD右半部数据
void WR_DATAR(uchar dt)
{
	LCD_RDY_R() ;
	E2=1;
	AO=1;
	RW=0;
	P0=dt;
	E2=0;
	E2=1;E1=0;WR=0;WR=1;E1=1;
}
//清屏
void Lcd_clr()
{
	uchar i,j;
	for(i=0xb8;i<0xbc;i++)
	{
		WR_CMDL(i);		//PAGE(0~3)
		WR_CMDR(i);
		WR_CMDL(0);		//Column Address starts from 0
		WR_CMDR(0);
		for(j=0;j<61;j++)
		{
			WR_DATAL(0);	//The Column address increment ’1’ after read or write.
			WR_DATAR(0);
		}
	}		
}

/*--------------显示汉字(16*16)和字符(8*16)---------------*/
void disphz (uchar lcd_f,bit zf,bit underside)//lcd_f:LCD中的显示位置0--121,zf:=1 为字符,=0为汉字
{											  //underside=0:写上面 =1:写在下面			  
  uchar i,j,s;
  uchar f_page,chn_add;
  if(zf) s=8;	   //字符
  else s=16;	   //汉字
  if(!underside) f_page=0xb8;
  else f_page=0xba;
  chn_add=0;

  if(lcd_f+s<61)				   //如果初始地址+字长<61,写在左半部 0--60
  {
	  for(j=0;j<2;j++)
	  {
	    WR_CMDL(f_page+j);
		WR_CMDL(lcd_f);
		for(i=0;i<s;i++)
		  WR_DATAL(zk_data[chn_add+i]);
		chn_add+=s;
	  }
  }
  else if(lcd_f>=61)			   //如果大于61,写在右半部   61--121
  {
	  for(j=0;j<2;j++)
	  {
	    WR_CMDR(f_page+j);
		WR_CMDR(lcd_f-61);
		for(i=0;i<s;i++)
		  WR_DATAR(zk_data[chn_add+i]);
		chn_add+=s;
	  }
  }
  else							  //否则两边都要写
  {
  	  for(j=0;j<2;j++)
	  {
	    WR_CMDL(f_page+j);
		WR_CMDL(lcd_f);
		for(i=0;i<(61-lcd_f);i++) //左半部写到61-lcd_f个字节
		  WR_DATAL(zk_data[chn_add+i]);
		WR_CMDR(f_page+j);
		WR_CMDR(0x00);
	 	for(i=61-lcd_f;i<s;i++)	  //右半部写剩下的字节
		  WR_DATAR(zk_data[chn_add+i]);
		chn_add+=s;	
	  }
  }
 
}
/*----------------画图形-----------------*/
/*void disptu (uchar code *img)
{
   uchar i,j,img_add;
   img_add=0;
   for(j=0;j<4;j++)
   {
     WR_CMDL(0xb8+j);
	 WR_CMDL(0x00);
     WR_CMDR(0xb8+j);
	 WR_CMDR(0x00);
	 for(i=0;i<122;i++)
	 {
	 	if(i<61) WR_DATAL(img[img_add+i]);
		else 	 WR_DATAR(img[img_add+i]);
	 }
	 img_add+=122;
   }
}
/*--------------写点阵------------------
void wrlattice (uchar lattice1,uchar lattice2,uchar lcd_f,uchar lcd_page)//lattice:显示的数,lcd_f:同上,lcd_page:显示的行
{
 if(lcd_f<61)
 {
   WR_CMDL(lcd_page);
   WR_CMDL(lcd_f); 
   WR_DATAL(lattice1);
 }
 else
 {
   WR_CMDR(lcd_page);
   WR_CMDR(lcd_f-61); 
   WR_DATAR(lattice1);
 } 
 if(lcd_f<61)
 {
   WR_CMDL(lcd_page+1);
   WR_CMDL(lcd_f); 
   WR_DATAL(lattice2);
 }
 else
 {
   WR_CMDR(lcd_page+1);
   WR_CMDR(lcd_f-61); 
   WR_DATAR(lattice2);
 } 
} 
  */ 
//-------------------LCD初始化--------------------------
void Lcd_init()
{
	WR_CMDL(0XE2);	//RESET
	WR_CMDR(0XE2);
	delayms(20);
	WR_CMDL(0XA4);	//Normal Display
	WR_CMDR(0XA4);
	WR_CMDL(0XA9);	//DUTYSELECT=1/32
	WR_CMDR(0XA9);
	WR_CMDL(0XA0);	//ADC SELECT=CLOCKWISE OUTPUT
	WR_CMDR(0XA0);
	WR_CMDL(0XAF);	//OPEN DISPLAY
	WR_CMDR(0XAF);
	WR_CMDL(0XC0);	//START FIRST LINE
	WR_CMDR(0XC0);
	Lcd_clr();		//CLEAR LCD
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -