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

📄 44blcd.c

📁 这是我学习过程中编写的测试代码
💻 C
字号:
#include <string.h>
#include <math.h>
#include "inc\option.h"
#include "inc\def.h"
#include "inc\44b.h"
#include "inc\44blib.h"
#include "inc\44blcd.h"
#include "inc\PLMM.h"
#include "inc\test.h"
#include "inc\ascii.h"
#include "inc\hanzi.h"


/*volatile char which_int=0;*/
/*液晶屏初始化*/
U16 row,col;
void LcdInit(void)
{
 
  Lcd_MonoInit();
  clrscreen();

}
/*打点函数*/
void Lcd_Point()
{
	    U8 *pbuffer,c;
	    U16 k,t;
             U16 a,b;
         a=row;b=col;
     if(240-row<16){Delay(2000);row=0;}              //若行到最大值,延时后从首行开始 
     c=(col/8+1)%4;
     switch(c)                          //显示的列地址和寄存器的列地址的转换
       {
         case 1: k=4;break;
         case 2: k=3;break;
         case 3: k=2;break;
         case 0: k=1;break;
       }
      t=(int)(col/32)*4+k;          //寄存器的列地址
      pbuffer =(U8*) LcdBuffeer; 
      pbuffer[t-1+row*20]|=0x80>>(col%8);   //打点,不破坏原有数据                                                                         
 
}
/*定位函数*/
void Lcd_Locate(void)
{
	   U16 c;
	   U8 k;
     if(240-row<16){Delay(2000);row=0;}              //若行到最大值,延时后从首行开始
     col++; 
     c=col%4;
     switch(c)                          //显示的列地址和寄存器的列地址的转换
       {
         case 1: k=4;break;
         case 2: k=3;break;
         case 3: k=2;break;
         case 0: k=1;break;
       }
      col=(int)((col-1)/4)*4+k;          //寄存器的列地址
      if(col==0)col=0;                   //判断是否为零,为零保持,否则减一
      else col--; 
}
/*液晶屏系统配置初始化*/
void Lcd_MonoInit(void)
{
    //160x240 1bit/1pixel LCD
    #define MVAL_USED 0
         rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
	    // disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
	rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);  
	    //LINEBLANK=10 (without any calculation) 
	rLCDSADDR1= (0x0<<27) | ( ((U32)LcdBuffeer>>22)<<21 ) | M5D((U32)LcdBuffeer>>1);
	    // monochrome, LCDBANK, LCDBASEU
	rLCDSADDR2= M5D( (((U32)LcdBuffeer+(SCR_XSIZE*LCD_YSIZE/8))>>1) ) | (MVAL<<21);
	rLCDSADDR3= (LCD_XSIZE/16) | ( ((SCR_XSIZE-LCD_XSIZE)/16)<<9 );

	rLCDCON1=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
	    // enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
    
}

/*液晶屏单个字符输出*/
void Putedot(U8 j ,U8 f)
{
      U8 *pbuffer;
      U16 i,a;
      U32 k;  
      pbuffer =(U8*) LcdBuffeer; 
      k=col+row*20;                                           
      for(i=0;i<16;i++)
	    {       
	    	   
                     if(f==1)a=~ascii8x16[j][i]; 
                     else a=ascii8x16[j][i];                
	    	   pbuffer[k+i*20]=a;   //从字库中调出到显示寄存器
                             
	    }                        
}
/*液晶屏单个汉字输出*/
void Putedet(U32 j ,U8 f)
{
      U16 *pbuffer,p;   
      U16 i,a,k; 
      pbuffer =(U16*) LcdBuffeer; 
      k=col+row*10;                                        
      for(i=0;i<16;i++)
	    {       
	    	   
                     if(f==1)a=~((hanzi[j][i*2+1]<<8)+hanzi[j][i*2]); 
                     else a=(hanzi[j][i*2]<<8)+hanzi[j][i*2+1];                
	    	   pbuffer[k+i*10]=a;   //从字库中调出到显示寄存器                             
	    }                        
}
/*图片显示输出*/
void displaylcd()
{
    U32 *pbuffer,temp_data;
     int i;
     
    clrscreen();
    pbuffer =(U32*) LcdBuffeer;
    for(i = 0; i< (4800/4) ;i++)
    {
       temp_data = (plmmBitmap[i*4] << 24) + (plmmBitmap[i*4+1] << 16) + (plmmBitmap[i*4+2] << 8) +(plmmBitmap[i*4+3]);
      pbuffer[i] = temp_data;

 }
}
/*字符串显示输出*/
void  printchar( U16 rowfirst,U16 colfirst, char *p,U8 f)
{
        U16 qq;
        U16 q;
        int i,b,c=0; 
        static int j; 
        b=colfirst;
        i=0;j=0;
        row=rowfirst;   							   
        while(p[i]!='\0')
	          	{ 	            
		             q=p[i];   
               	 row=rowfirst+(i/20)*18;           //确定行值
                 if(240-row<16){Delay(2000);row=0;}              //若行到最大值,延时后从首行开始
	               col=b+i%20;	                        		            
		             if(q&0x80)
                      {
                      col=b+(i/2)%10;	
                      i++;
                      qq=p[i];
                      q=(q-0xB0)*94+(qq-0xA1);                       //取出汉字内码  
                      if(col%2==0)col++;
                      	else col--;                    
                      Putedet(q,f);                                     	
                       }
                 else
                 	{
                 		col=b+i%20;
                 		Lcd_Locate();                  
	                 Putedot((q-0x20),f);          //输出单个字符  
	                }                                 		             
                   i++;
     }
}
/*测试用,图片显示*/
void displaylcd4()
{
    U32 *pbuffer,temp_data;
     int i;
     
    clrscreen();
    pbuffer =(U32*) LcdBuffeer;
    for(i = 0; i< (1100/4) ;i++)
    {
       temp_data = (test3[i*4] << 24) + (test3[i*4+1] << 16) + (test3[i*4+2] << 8) +(test3[i*4+3]);
        pbuffer[i] = temp_data;

 }
}
/*画线函数*/
void Lcd_Line(int V_begin,int H_begin,int V_end,int H_end)
{
     
   	  int delta_x,delta_y;//xerr,yerr存储偏移量
	  int incx,incy;             //存储斜率方向判断数据  
	  col=V_begin;
	  row=H_begin; 
    do{
    	delta_x=distance(V_begin,V_end);
    	delta_y=distance(H_begin,H_end);
    	incx=compare(delta_x,delta_y);
    	incy=compare(delta_y,delta_x);
    	if(incx){col++;Lcd_Point();V_begin++;}
    	if(incy){row++;Lcd_Point();H_begin++;}
         
    }while(delta_x>0||delta_y>0);

 
}
/*画矩形函数*/
void lcddrawbox(int V_offset,int H_offset,int V_size,int H_size)
{
    U16 i,j;      
    for(i = 0; i< H_size;i++)
     {
      for(j = 0;j< V_size ;j++)
         { 
                 row=H_offset+i;
                 col=V_offset+j; 
    	        Lcd_Point();   
        }       
      }

 
}
/*清屏函数*/
void clrscreen(void)
{
  int i,j;

 for (i=0;i<240;i++)
     for (j=0;j<320;j++)
   {
     LcdBuffeer[j][i]=0x0;//(0x0FFFFFFFF);  
   }
}
/*画正弦波*/
/*ox,oy为坐标原点,t为周期,h为幅值*/
void Lcd_sin(int ox,int oy,float t,int h)
{
	U8  s;
	int a,b;
	U16 i;
         a=b=0;

	col=ox;
	row=oy;
	Lcd_Point();
	for(i=0;i<160;i++)
	{
		b=a;
		a=(float)h*sin((float)i/t*2.0*pi);
		
		col=ox+i;
	
		while(a!=b)
         {
		s=compare(a,b);
		row=oy-b;
		if(s==1)b++;
			else b--;
		Lcd_Point();
   	}
	}
}
/*画正弦波*/
/*ox,oy为坐标原点,t为周期,h为幅值*/
void Lcd_sin1(int ox,int oy,float t,int h)
{
	U8  s;
	int a,b;
	U16 i;
         a=b=0;
	col=ox;
	row=oy;
	Lcd_Point();
	for(i=0;i<240;i++)
	{
		b=a;
		a=(float)h*sin((float)i/t*2.0*pi);
		
		row=ox+i;
	
		while(a!=b)
         {
		s=compare(a,b);
		col=oy-b;
		if(s==1)b++;
			else b--;
		Lcd_Point();
   	}
	}
}
/*画圆*/
/*ox,oy为坐标原点,r为半径,h为线宽*/
void Lcd_cicle(int ox,int oy,int r,int h)
{
	U8 s;
	U16 i,j;
	int a,b,a1,b1;
	a=b=0;
         a1=b1=0;
	col=ox+r;
	row=oy;
	Lcd_Point();
	for(i=0;i<h;i++)
	{
		r=r-i;
		for(j=ox-r;j<=ox+r;j++)
		{
			b=a;
			a=sqrt(r*r-(j-ox)*(j-ox));
	    col=j;
	   	while(a!=b)
           {
	            	s=compare(a,b);
		            row=oy-b;
		            if(s==1)b++;
			          else b--;
		            Lcd_Point();
   	        }
        a1=-sqrt(r*r-(j-ox)*(j-ox));
	    	while(a1!=b1)
           {
                            
	            	s=compare(a1,b1);
		            row=oy-b1;
		            if(s==1)b1++;
			          else b1--;
		            Lcd_Point();
   	        }
   	}
	}
}

⌨️ 快捷键说明

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