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

📄 lcd

📁 LCD多级菜单演示
💻
📖 第 1 页 / 共 2 页
字号:
  unsigned int xdata addr;
  addr=G_BASE+(y-1)*BYTES_PER_ROW+x;
  wdata(addr%256);
  wdata(addr>>8);
  wcode(0x24);
}

void draw_line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1) 
 {
  unsigned char xdata x,y,xx;
  float yy;
  x=x1-x0;
  y=y1-y0;
  if (x>y) 
   {
    yy=y0;
    for(xx=x0;xx<x1;xx++) 
     {
     yy+=(float)y/x;
     setxy((xx/8),yy);
     setb((7-xx&7));
    }
   } 
  else 
   {
    yy=x0;
    for (xx=y0;xx<y1;xx++) 
     {
      yy+=(float)x/y;
      setxy(yy/8,xx);
      setb((7-(char)yy&7));
     }
   }
 }
void draw_rect(unsigned char lux0,unsigned char luy0,unsigned char rdx1,unsigned char rdy1)
 {
  draw_line(lux0,luy0,rdx1,luy0); 
  draw_line(rdx1,luy0,rdx1,rdy1);
  draw_line(rdx1+1,luy0+1,rdx1+1,rdy1+1);
  draw_line(lux0+1,rdy1,rdx1+1,rdy1);
  draw_line(lux0,rdy1-1,rdx1,rdy1-1);
  draw_line(lux0,luy0,lux0,rdy1);	
 }
 
void disp32(unsigned char x,unsigned char y,unsigned char *hz)
{
  unsigned char xdata i;
  unsigned int xdata addr;
  for(i=0;i<32;i++)
   {
    addr=G_BASE+(((y-1)*16+i)*BYTES_PER_ROW)+(x-1);
    wdata(addr%256);
    wdata(addr>>8);
    wcode(0x24);
    wdata(hz[4*i]);
    wcode(0xc0);        //write left hz
    addr++;
    wdata(addr%256);
    wdata(addr>>8);
    wcode(0x24);
    wdata(hz[4*i+1]);
    wcode(0xc0);        //write right hz
    addr++;
    wdata(addr%256);
    wdata(addr>>8);
    wcode(0x24);
    wdata(hz[4*i+2]);
    wcode(0xc0);        //write left hz
    addr++;
    wdata(addr%256);
    wdata(addr>>8);
    wcode(0x24);
    wdata(hz[4*i+3]);
    wcode(0xc0);        //write right hz
   }
 }
 

 
void displayhz_string(unsigned int x,unsigned char y,unsigned char col,unsigned char *s)
 {
  unsigned char xdata kk,j;
  unsigned int  hz_code,ll;
  if(s==0)
  return;
  ll=strlen((const char*)s);
  for(j = 0; j < ll/2; j++)
   {
    hz_code=*(s);
    hz_code=hz_code<<8;
    hz_code=hz_code|*(s+1);
    kk=Findhz(hz_code);
    disphz_char(x,y,col,hzk[kk].hz);    	   
    x=x+2;
    xsize=x;
    ysize=y;
    s=s+2;
  }  
 }
 
void disphz_char(unsigned int x,unsigned char y,unsigned char col,unsigned char *hz)
 {
  unsigned char xdata i;
  unsigned int xdata addr;
  for(i=0;i<16;i++)
   {
    addr=G_BASE+(((y-1)*16+i)*BYTES_PER_ROW)+x-1;
    wdata(addr%256);
    wdata(addr/256);
    wcode(0x24);
    if(col>=1)
     {
      wdata(hz[2*i]^0xff);	
     }
    else
     {
      wdata(hz[2*i]);
     } 
    wcode(0xc0);        //write right hz
    addr=G_BASE+(((y-1)*16+i)*BYTES_PER_ROW)+x;
    wdata(addr%256);
    wdata(addr/256);
    wcode(0x24);
    if(col>=1)
     {
      wdata(hz[2*i+1]^0xff);
     }
    else
     {
      wdata(hz[2*i+1]);	
     }	
    wcode(0xc0);        //write left hz
   }
 } 

void displayasc_str(unsigned char x,unsigned char y,unsigned char col,unsigned char *s)
 {
  unsigned char xdata i,j;
  unsigned int xdata addr,hz_code;
  if(s==0)
  return;
  for(j = 0;j < strlen((unsigned char*)s); j++)
   {
    hz_code = (unsigned char)*(s+j);
    for(i=0;i<16;i++)
     {
      addr=G_BASE+(((y-1)*16+i)*BYTES_PER_ROW)+x-1;
      wdata(addr%256);
      wdata(addr/256);
      wcode(0x24);
      if(col>=1)
       {
        wdata(digital[hz_code-0x20][i]^0xff);
       }
      else
       {
        wdata(digital[hz_code-0x20][i]);
       }	
      wcode(0xc0);        //write hz
     }
    x=x+1;
    xsize=x;
    ysize=y;	
   }
 }

void displayasc(unsigned char x,unsigned char y,unsigned char col,unsigned char s)
 {
  unsigned char xdata i;
  unsigned int xdata addr;
  for(i=0;i<16;i++)
     {
      addr=G_BASE+(((y-1)*16+i)*BYTES_PER_ROW)+x-1;
      wdata(addr%256);
      wdata(addr/256);
      wcode(0x24);
      if(col>=1)
       {
        wdata(digital[s-0x20][i]^0xff);
       }
      else
       {
        wdata(digital[s-0x20][i]);
       }	
      wcode(0xc0);        //write hz
     }
    x=x+1;
    xsize=x;
    ysize=y;		
 }
 
unsigned char Findhz(unsigned int c)
 {
  unsigned char zkno;
  for(zkno=0;zkno<shzk;zkno++)
   {
    if(hzk[zkno].hzcode==c)
    break;
   }
  return zkno; 	
 }



void init_sys(void)
 {
  unsigned char j,k,l,sum,sum1,sum2,sum3;
  unsigned int cc,dd,qq;
  //init uart port
  TMOD=0x20;             			//timer0 work in mode 1; timer1 work in mode 2;8 bits reload
  TL1=0xFD;              	  		//work in 11.0592MHz;band rate is 19200
  TH1=0xFD;
  PCON=0x80;               		//SMOD=0
  TR1=1;                   		//t1 begin to work	
  SCON=0xD0;                              //串口工作于方式3,允许接收 ,单机对单机   DIYDIYDIYDIYDIYDIYDIYDIY                  	                                //偶校验时,偶数个1时,校验位为0    
  EX0=0;                                  //关INT0中断
  EX1=0;                                  //关INT1中断
  ET0=0;                   	        //关T0中断	
  ET1=0;                                  //关T1中断
  ES=0;                                   //关串口中断
  EA=0;
  for(j=0;j<200;j++)    //清空接收缓冲区
   {
    rec_data_buf[j]=0;	
   }
  LCD_ON=1; 
  BEEP=0;
  COUNT=1;
  CUT=1;
  SHORTP=1;
  colle_startup_flag=0;
  
  if(mem_chip_num==1)    //有1片存储器
   {
    user_num=2500;       //用户数量为2500
   }
  if(mem_chip_num==2)    //有2片存储器
   {
    user_num=5000;       //用户数量为5000
   }
  if(mem_chip_num==3)    //有3片存储器
   {
    user_num=7500;       //用户数量为7500
   }
  if(mem_chip_num==4)    //有4片存储器
   {
    user_num=10000;       //用户数量为10000
   }
  collector_user_num=0;   //集抄器发送的用户数量初始化为0
  //read config data
  slave_addr=0xa0;
  k=read_e2prom(0x7f00,slave_addr,1);
  l=read_e2prom(0x7f01,slave_addr,1);
  sum=k+l;                  //校验和
  sum1=read_e2prom(0x7f02,slave_addr,1); //1处校验和
  sum2=read_e2prom(0x7f03,slave_addr,1); //2处校验和
  sum3=read_e2prom(0x7f04,slave_addr,1); //3处校验和
  if((sum==sum1)&&(sum==sum2)&&(sum==sum3))
   {
    sub_user_num=k*256+l;        //剩余的用户存储空间
   }
  else                           //校验和出错
   {
    sub_user_num=user_num;        //剩余的用户存储空间为默认总空间
   }
  comport=read_e2prom(0x7f06,slave_addr,1);
  if(comport==232)                //RS232通讯口
   {
    RS232_485=0;	
   }
  else 
   {
    RS232_485=1;                  //RS485通讯口	
   }                

  //init timer
  write_e2prom(0,0xa2,0,0);           //pcf8563 时钟运行
  write_e2prom(0x01,0xa2,0,0);        //关闭所有中断
  
  //init 82c55
  COM_8255=0x81;      //8255 work mode 0,A,B pc7-pc4 port output;pc3-pc0 port input
  PB=0xff;
  //init lcm
  wdata(T_BASE%256);
  wdata(T_BASE/256);
  wcode(0x40);
  wdata(BYTES_PER_ROW%256);
  wdata(BYTES_PER_ROW/256);
  wcode(0x41);      //set text area

  wdata(G_BASE%256);
  wdata(G_BASE/256);
  wcode(0x42);
  wdata(BYTES_PER_ROW%256);
  wdata(BYTES_PER_ROW/256);
  wcode(0x43);    //set graphic area

  wcode(0xa0);    //cursor shape setup
  wcode(0x80);    //set display mode
  wcode(0x98);    //graphic on
 
  clscr();  
  COM_8255=0x0e;   //pc7=0             //按压回车键和左箭头恢复默认密码
  if((PC&0x09)==0) 
   {
    write_e2prom(0x7f0d,0xa0,1,0xaa);
   } 
  for(j=0;j<7;j++)                   //密码验证默认密码668668
   {
    pass_word[j]=read_e2prom(0x7f07+j,0xa0,1);	
   }
  if((pass_word[6]!=0x55)||(pass_word[0]>0x09)||(pass_word[1]>0x09)||(pass_word[2]>0x09)
   ||(pass_word[3]>0x09)||(pass_word[4]>0x09)||(pass_word[5]>0x09))
   {
    pass_word[0]=0x06;
    pass_word[1]=0x06;
    pass_word[2]=0x08;
    pass_word[3]=0x06;
    pass_word[4]=0x06;
    pass_word[5]=0x08;
    pass_word[6]=0x55;
    for(j=0;j<7;j++)
     {
      write_e2prom(0x7f07+j,0xa0,1,pass_word[j]);	
     }	
   }
  aa:
  clscr();
  if(verify_password()!=1)
   {
    dialog_massage(0xf0,1,"密码错!");
    goto aa;	
   }
  clscr();
  dialog_massage(0,0,"数据载入中┅");
  for(cc=0;cc<400;cc++)               //读取集中器数据表
   {
    qq=(cc+1)/4;
    display_slide(qq);
    for(dd=0;dd<5;dd++)
     {
      collector_data_table[cc][dd]=read_e2prom((0x75f0+cc*5+dd),slave_addr,1);	
     }
   }      
  logo_face=read_e2prom(0x7f05,slave_addr,1); //显示开机画面
  if(logo_face==0x11)
   {
    disp_logo1();
   }
  else if(logo_face==0x22)
   {
    disp_logo2();	
   }  
  else 
   {
    disp_logo3();	
   }
  
   
 }

void display_slide(unsigned int percent)
 {
  displayasc_str(10,4,0,"%");
  if((percent>0)&&(percent<10))
   {
    displayasc(9,4,0,(percent+0x30));	
   }
  else if((percent>9)&&(percent<100))
   {
    displayasc(8,4,0,((percent/10)+0x30));
    displayasc(9,4,0,((percent%10)+0x30));
   }
  else if(percent==100)
   {
    displayasc(7,4,0,((percent/100)+0x30));
    displayasc(8,4,0,(((percent%100)/10)+0x30));	
    displayasc(9,4,0,((percent%10)+0x30));
   }		
 }
 
void clscr(void)
 {
  unsigned int tt;
  wdata(G_BASE%256);       //clear ddram from address 0000h
  wdata(G_BASE/256);
  wcode(0x24);
  wcode(0xb0);    //data auto write
  for(tt=0x0800;tt<0x0C00;tt++) //1k bytes ddram
   {
    wdata(0);
   }
  wcode(0xb2);     //auto write data stop
 }
 
void cls_rect(unsigned char x0,unsigned char x1,unsigned char y0,unsigned char y1)
 {
  unsigned char xdata i,j,k,l;
  unsigned int xdata addr;
  j=x1-x0;
  l=y1-y0;
  for(k=0;k<=l;k++)
   {
    addr=G_BASE+(k+y0-1)*BYTES_PER_ROW+x0-1;
    wdata(addr%256);
    wdata(addr/256);
    wcode(0x24);
    wcode(0xb0);    //data auto write
    for(i=0;i<j;i++)
     {
      wdata(0);	
     }
    wcode(0xb2);     //auto write data stop
   }
 }

⌨️ 快捷键说明

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