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

📄 tree.c

📁 LCD12864做的显示函数
💻 C
字号:
#include<reg52.h>
#define uc unsigned char
#define ui unsigned int

sbit E=P3^4;		 
sbit RW=P0^2;		 //读写控制
sbit RS=P0^3;		 //数据 指令选择
sbit L=P0^1;		 //左屏
sbit R=P0^0;		 //右屏
sbit Busy=P2^7;
uc i,j,licheng_ge=0,licheng_shi=0,licheng_bai=0,licheng_qian=0;
float dj=3.5,zj,lc;

 const uc code HZ[][32] = {
	  
	  0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,// 单
	  0x48,0x4C,0x4A,0x49,0xFC,0x08,0x00,0x00,
	  0x10,0x10,0x17,0x12,0x12,0x12,0x12,0xFF,
	  0x12,0x12,0x12,0x12,0x13,0x18,0x10,0x00,

      0x80,0x40,0x20,0xF8,0x87,0x40,0x20,0x90,// 价
	  0x08,0x07,0x08,0x90,0x20,0xC0,0x40,0x00,
	  0x00,0x00,0x00,0xFF,0x00,0x80,0x40,0x3F,
	  0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,

	  0x00,0x00,0xFE,0x12,0x12,0x12,0x12,0xFE,// 里
      0x12,0x12,0x12,0x12,0xFF,0x02,0x00,0x00,
	  0x40,0x48,0x49,0x49,0x49,0x49,0x49,0x7F,
	  0x49,0x49,0x49,0x49,0x4D,0x68,0x40,0x00,
	  
	  0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,// 程
	  0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00,
      0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,
	  0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00,

	  0x00,0x00,0x00,0xF8,0x89,0x8E,0x88,0x88,//总
	  0x88,0x8C,0x8B,0xF8,0x00,0x00,0x00,0x00,
      0x00,0x20,0x38,0x00,0x3C,0x40,0x40,0x42,
	  0x4C,0x40,0x40,0x70,0x04,0x18,0x30,0x00,

	  0x40,0x20,0xF0,0x1C,0x47,0x22,0x10,0xC8,//价
	  0x04,0x03,0x04,0xD8,0x30,0x60,0x20,0x00,
      0x00,0x00,0xFF,0x00,0x80,0x60,0x18,0x07,
	  0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,

	  0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,//时
	  0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
	  0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,
	  0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00,
     
	  0x00,0xF8,0x01,0x02,0xF6,0x10,0x12,0x12,//间
	  0x12,0x12,0xFA,0x12,0x02,0xFF,0x02,0x00,
	  0x00,0xFF,0x00,0x00,0x3F,0x11,0x11,0x11,
	  0x11,0x11,0x3F,0x40,0x80,0x7F,0x00,0x00,
	  
	  0x00,0x20,0x20,0x22,0x22,0xE2,0x22,0x22,//元
	  0x22,0xE2,0x22,0x22,0x22,0x20,0x20,0x00,
      0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,
	  0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,

	  0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,//欢
	  0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
      0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,
	  0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,

	  0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,//迎
	  0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
      0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,
	  0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,

	  0x08,0x28,0x2A,0x2A,0xFA,0x0A,0x0A,0xFE,//乘
	  0x0A,0x09,0xF9,0x49,0x29,0x2C,0x88,0x00,
      0x22,0x22,0x11,0x11,0x0B,0x0C,0x06,0x7F,
	  0x02,0x04,0x0D,0x19,0x31,0x11,0x01,0x00,

	  0x00,0x80,0x60,0x1C,0x20,0xC0,0x00,0xFF,//坐
	  0x00,0x80,0x40,0x3C,0x40,0x80,0x00,0x00,
      0x41,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,
	  0x45,0x44,0x44,0x44,0x44,0x40,0x40,0x00,
	   };


	  	 

  const uc code FH[][16] = {					 //符号

      0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:
	  0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,

	  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//.
	  0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,

	  0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,//k
	  0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,

	  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, //m
	  0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,


	                        	  };

  const uc code SZ[][16]= {					 //数字 ;
      0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,//0
	  0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, 

	  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,//1
	  0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

	  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,//2
	  0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

	  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,//3
	  0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, 

	  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,//4
	  0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
	  
	  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,//5
	  0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, 
	  
	  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,//6
	  0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
	  
	  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,//7
	  0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, 
	  
	  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,//8
	  0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,


	  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00//9
	  ,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
	                           
							 };

void iniLCD(void);	  //函数声明
void chkbusy(void);
void wcode(uc);
void wdata(uc);
void display_HZ(uc,uc,uc *);
void SetOnOff(uc onoff);

void delay(uc a)
	{
	uc i;
	while(a--)
		for(i=100;i>0;i--)
			;
	}


void SendCommand(uc command)
  {
 	chkbusy();
 	E = 1;
 	RW = 0;
 	RS = 0;
 	P2 = command;
 	E = 0;
  }


void SetOnOff(uc onoff) //1-开显示 0-关
   {
       if(onoff == 1)
       {chkbusy();E=1;RW=0;RS=0;P2=0x3f;E=0;}  //0011 111x
       else
       P2=0x3e;
    }


void SetLine(uc line)  //line -> 0 : 7
 {
 line = line & 0x07;
 line = line | 0xb8;   //1011 1xxx
 SendCommand(line);
 }


void SetColum(uc colum) //colum -> 0 :63
 {
 colum = colum & 0x3f;
 colum = colum | 0x40;  //01xx xxxx
 SendCommand(colum);
 }


void SelectScreen(uc screen) //0-全屏,1—左屏,2-右屏
 {
 	switch(screen)
 		{
  			case 0 :
   			L = 0;
   			delay(2);
   			R = 1;
   			delay(2);
   			break;
  			case 1 :
   			L = 1;
   			delay(2);
   			R = 0;
   			delay(2);
   			break;
  			case 2 :
   			L = 0;
   			delay(2);
   			R = 0;
   			delay(2);
   			break;
 		}
	}


void ClearScreen(uc screen)  // 清屏 点亮背光 2-全屏,0—左屏,1-右屏
  {
 uc i,j;
 SelectScreen(screen);
 for(i = 0;i < 8;i ++)
 {
  SetLine(i);
  SetColum(0);
  for(j = 0;j < 64; j ++)
   wdata(0x00);
  }
 }



void iniLCD(void)
{
	wcode(0x3f);	  //开显示设置
	wcode(0xc0);	  //设置显示起始行为第一行
	wcode(0xb8);	  //页面地址设置
	wcode(0x40);	  //列地址设为0
	L=1;R=1;
	SetOnOff(1);	  //开显示
	ClearScreen(2);   //清屏,点亮背光
	
}


void chkbusy(void)		//检测LCD忙状态
{
	E=1;				//LCD使能
	RS=0;				//读写指令
	RW=1;				//读
	P2=0xff;		   //读操作以前先进行一次空读操作 接下来才能读到数据
	while(!Busy);	   //等待不忙
}


void wcode(uc cd)		//写指令代码
{
	chkbusy();			//等待空闲
	E=1;				//以下使能LCD,设置LCD写指令状态
	RW=0;
	RS=0;
	P2=cd;				 //写指令代码
	E=1;				 //一下二句E产生下降沿,使得写操作有效
	E=0;
}


void wdata(uc dat)		 //写显示数据
{
	chkbusy();			 //等待空闲
	E=1;				 //	以下使能LCD,设置LCD写数据状态
	RW=0;
	RS=1;
	P2=dat;				//写数据代码
	E=1;				 //一下二句E产生下降沿,使得写操作有效
	E=0;
}


void display_HZ(uc page,uc col,uc *temp)	//显示汉字子程序
 {
	L=1;R=0;							 //从左半屏开始 若列数超过128 改右
	if(col>=0x80)
		{
			R=1;L=0;
			col-=0x40;
		}
		wcode(page);					 //按要求写入页地址
		wcode(col);						 //按要求从相应列开始写数据
		for(j=0;j<16;j++)				 //写入一个汉字的上半部分,共16字节
		{
			wdata(temp[j]);
		}	
       wcode(page+1);          //从下一页开始显示汉字的下半部分要求从相应的列开始写数据
		wcode(col);
		for(j=16;j<32;j++)
		{
			wdata(temp[j]);
		}
  }


void display_FH(uc page,uc col,uc *temp)	//显示16*8字符子程序
 {
	L=1;R=0;							 //从左半屏开始 若列数超过128 改右
	if(col>=0x80)
		{
			R=1;L=0;
			col-=0x40;
		}
		wcode(page);					 //按要求写入页地址
		wcode(col);						 //按要求从相应列开始写数据
		for(j=0;j<8;j++)				
		{
			wdata(temp[j]);
		}
		wcode(page+1);         
		wcode(col);
		for(j=8;j<16;j++)
		{
			wdata(temp[j]);
		}	
  }

void Display_FiveNum(uc a, uc b, float num)	//函数功能:从a地址代表的页,b地址代表的列开始向左显示 0000.0 五位数据,
  {
	uc flag=0,shuzu[5]=0; //shuzu[]用来存储num的千,百,十,个,'.',十分位共六位
	ui i=0,j=0,num1,quzheng;
	quzheng=num; //num的整数部分
	num1=num*10; //先乘10,精确到十分位
     while(num1)	   //分离float型 num 的整数部分quzheng的各位数字
        {
           i=num1%10;
           num1=num1/10;
		   shuzu[j++]=i;
         }
	 	 if(j!=0)
		   { while(shuzu[j--]==0);}
		for(i=0;i<=j+1;i++)

		 { if(flag==1) 
		   display_FH(a,b-(1+i)*8,SZ[shuzu[i]]);
		   if(flag==0)
		   display_FH(a,b-i*8,SZ[shuzu[i]]);
		   if(i==0)
		    {
			  display_FH(a,b-(i+1)*8,FH[1]);flag=1;	 //显示小数点
			}
		  } 
     }


void initshow()					   //0xb8~0xbf表示第0~7页(64行); 0x01_____表示行(0x40~0x3f)
 {
   display_HZ(0xb8,0x40,HZ[0]);   //单
   display_HZ(0xb8,0x50,HZ[1]);	  //价
   display_FH(0xb8,0x60,FH[0]);	 //:
   Display_FiveNum(0xb8,0xA8,dj);	//从0xA8列开始向左显示
   display_HZ(0xb8,0xB0,HZ[8]);   //元
   display_HZ(0xba,0x40,HZ[2]);  //里:一个汉字占2行 行+2
   display_HZ(0xba,0x50,HZ[3]);  //程 
   display_FH(0xba,0x60,FH[0]);	 //:
   Display_FiveNum(0xba,0xA8,lc);
   //display_FH(0xba,0xB0,FH[2]);   //k
   display_FH(0xba,0xB4,FH[3]);   //m
   display_HZ(0xbc,0x40,HZ[4]);   //总
   display_HZ(0xbc,0x50,HZ[1]);   //价
   display_FH(0xbc,0x60,FH[0]);	 //:
   Display_FiveNum(0xbc,0xA8,zj);
   display_HZ(0xbc,0xB0,HZ[8]); //元
  }


void int1() interrupt 0        //外部中断0——实时显示处理
   {
	   lc=lc+0.5;
	   zj=lc*dj;
	   if(lc<3) zj=3;
	   Display_FiveNum(0xb8,0xA8,dj); 
	   Display_FiveNum(0xba,0xA8,lc);	  
	   Display_FiveNum(0xbc,0xA8,zj);
	 }
 
void main(void)
{
    
    uc t,a,b,c=0,flag1=100;
    SCON=0x11;			 //方式0设置 (彬哥不理解)
    //EX0=1;               //打开外部中断0
    IT0=1;               //下降沿触发中断INT0
    EA=1;                //全局中断允许
 	iniLCD();
	for(t=0;t<4;t++)
	  display_HZ(0xbb,0x50+23*t,HZ[9+t]);
	 
   // 
    while(1) //键盘扫描程序
    {
	    P1=0x0f;//p1接矩阵键盘
		a=P1;
		delay(10);
		P1=0xf0;
		b=P1;
		delay(10);
		c=a+b; //c为键盘扫描的键值
		if(c==0xee)
          {flag1=0;delay(10);}//按下0
		if(c==0xde)
		   {flag1=1;delay(10);}//按下1
        if(c==0xbe)	 
		  { flag1=2;delay(300);}//2
		if(c==0x7e)
		   { flag1=3;delay(300);}//3

		switch(flag1)
		  {
		    	
			case 0:flag1=-1;EX0=0;
			       dj=0;zj=0;lc=0;
				   SelectScreen(0);
 					for(i = 0;i < 8;i ++)
 						{
  							SetLine(i);
  							SetColum(64);
  					for(j = 0;j < 48; j++)
  					 wdata(0x00); 
 						 }
					initshow(); break;
			 case 1:flag1=-1;iniLCD();initshow();EX0=1;break;
		   /* case 1:
				 {
				   flag1=-1;EX0=0;
				   iniLCD();initshow();break; 	//按下1,回归显示
				   Display_FiveNum(0xb8,0xA8,dj); 
	  			   Display_FiveNum(0xba,0xA8,lc);	  
	   			   Display_FiveNum(0xbc,0xA8,zj);break; //	按下0,清0;	  */

			case 2:flag1=-1;EX0=0;dj+=0.5;zj=0;lc=0;
			        SelectScreen(0);
 					for(i = 0;i < 8;i ++)
 						{
  							SetLine(i);
  							SetColum(64);
  					for(j = 0;j < 48; j++)
  					 wdata(0x00); 
 						 }
				   Display_FiveNum(0xb8,0xA8,dj); 
	  			   Display_FiveNum(0xba,0xA8,lc);	  
	   			   Display_FiveNum(0xbc,0xA8,zj);
				   	break;

			case 3:flag1=-1;EX0=0;
			           if(dj>0) 
					       {dj-=0.5;zj=0;lc=0;}
			        SelectScreen(0);
 					for(i = 0;i < 8;i ++)
 						{
  							SetLine(i);
  							SetColum(64);
  					for(j = 0;j < 48; j++)
  					 wdata(0x00); 
 						 }
				   Display_FiveNum(0xb8,0xA8,dj); 
	  			   Display_FiveNum(0xba,0xA8,lc);	  
	   			   Display_FiveNum(0xbc,0xA8,zj);
				   	break;
			//case 3:flag1=-1;EX0=0;
		   }
		   //if(c!=0xff)
		   // break;
        //if(c==0x7e)
		 //    {show_shuzi(3); break;}//按下3,右屏显示‘3’

    } 
	 //while(1); 
  }	

⌨️ 快捷键说明

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