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

📄 lcdii.c

📁 用51系列单片机实现的LCD12864液晶的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
// Header: 数字示波器
// File Name:lcdII.c	
// Author: H.C.H
// Date:2005/8/15
//说明:基本成功


#include <SST89x5x4.H>
#include <math.h>
#include<ziku.h>
#define uint  unsigned int
#define uchar unsigned char
#define Disp_On    0x3f
#define Disp_Off   0x3e
#define Col_Add        0x40    //列地址
#define Page_Add 0xb8          //行地址
#define Start_Line 0xc0

//********************LCD128*64口定义**********************
#define pi 3.14159
#define Lcd_Bus     P1 
#define LCD_CON     P0 
sbit s0=P2^0;
sbit s1=P2^1;
sbit s2=P2^2;
sbit s3=P2^3;


sbit adclk=P2^5;
sbit adcs=P2^7;
sbit addata=P2^6;

unsigned char bdata adc;
sbit  adclow=adc^0;
sbit CS2=LCD_CON^3;             //  CS2
sbit CS1=LCD_CON^4;             //  CS1

sbit DI=LCD_CON^0;              //液晶数据指
sbit RW=LCD_CON^1;              //液晶读写
sbit E =LCD_CON^2;              //液晶使能
uchar state=0;
sbit beep=P2^4;
 
uchar max,min;
uchar d[3];
uchar dd[4];

struct complex 
{
    float real;
	float image;
};
struct complex xdata s[64];

uint data T2NOW=0,time2_count=65535;
unsigned long data fi_int=0,fs=0,fs_const=0; 
uchar data ii=0,T0_counter=0,Time_NO=2,T1_counter=0;
bit over=0;
struct complex mul(struct complex,struct complex);    /*定义复数乘*/
void FFT(struct complex *s);
//******************************子函数*********************
void delay1(uint);                 //延时程序
void write_cmd1(uchar);            //写命令操作字
void write_data1(uchar);           //写数据
void cls();                        //清屏程序
void init();                       //初始化程序
uchar read_data();                 //读数据
void line_h(uchar x,uchar y,uchar l);
void line_v(uchar x,uchar y,uchar l);
void screen1(void);
unsigned char key();
//************************延时子程序***********************


struct complex mul(struct complex x,struct complex y)
{
    struct complex z;
    z.real=x.real*y.real-x.image*y.image;
    z.image=x.real*y.image+x.image*y.real;
    return (z);
}

void FFT(struct complex *s)
{
    unsigned char idata nv2,nm1,k,level,i,j=0;
	unsigned char  idata ip,le,lei;
    struct complex idata v,w,t;
	float max;  
    nv2=64>>1;
    nm1=64-1;
    for(i=0;i<nm1;i++)	
	{
        if(i<j)
		{
		    t=s[j];
		    s[j]=s[i];
		    s[i]=t;
		}
        k=nv2;
        while(k<=j)
		{
		    j-=k;
		    k=k>>1;
		}
        j+=k;
    }

    le=1;	  
    for(level=1;level<=6;level++)
    {   
	    lei=le;
        le<<=1;
        v.real=1.0;
		v.image=0.0;       
        w.real=cos(pi/lei);
		w.image=-sin(pi/lei);
        for(j=0;j<lei;j++)
        {
	        for(i=j;i<64;i+=le)
            {
			       ip=i+lei;
                   t=mul(s[ip],v);
                   s[ip].real=s[i].real-t.real;
                   s[ip].image=s[i].image-t.image;
                   s[i].real+=t.real;
                   s[i].image+=t.image;
           }
           v=mul(v,w);
       }
    }

	for(i=0;i<32;i++)
	s[i].real=sqrt(s[i].real*s[i].real+s[i].image*s[i].image);	//幅值
	max=s[0].real;
	for(i=1;i<32;i++)if(max<s[i].real)max=s[i].real;
	for(i=0;i<32;i++)s[i].real=s[i].real*50/max;

}

unsigned char adconvert()
{   unsigned char i;
    adcs=1;
    adcs=0;
    adclk=0;
    for(i=0;i<8;i++)
    {   adclk=1; 
        adclow=addata;
        adclk=0;
        if(i<7) adc=adc<<1;
    }
    adclk=0;
    adcs=1;
    return(adc);
}

void delay1(uint t)             
{
        uint i,j;
        for(i=0;i<t;i++)
                for(j=0;j<10;j++);
}

//********************写命令到LCD**************************


void write_cmd1(uchar cmd)  
{

        DI=0; RW=0;
        Lcd_Bus=cmd;
        E=1;
        E=0;
		delay1(1);

}

void display_h(uchar page,uchar col,uchar code *english,uchar n)
{
		uchar j,i;
		if(col<64)
		{
		        CS2=1;CS1=0;
		 }
		else
		{
		        CS2=0;CS1=1;
				col=col-64;
		}
		for(j=0;j<2;j++)
		{
			    write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
			    for(i=0;i<12;i++)
			            write_data1(english[n*24+12*j+i]);
		}
}

void display_e(uchar page,uchar col,uchar code *english,uchar n)
{
		uchar j,i;
		if(col<64)
		{
		        CS2=1;CS1=0;
		 }
		else
		{
		        CS2=0;CS1=1;
				col=col-64;
		}
		for(j=0;j<2;j++)
		{
			    write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
			    for(i=0;i<7;i++)
			            write_data1(english[n*14+7*j+i]);
		}
}
//************************写数据到LCD**********************


void point(uchar x,uchar y)
{
  uchar y1,y2,pp;
  uchar datain;
  pp=1;
  y1=y>>3;
  y2=y%8;
  pp=pp<<y2;
  if (x<64)
  {
    CS2=1;
	CS1=0;
	write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);  
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    delay1(10);
    datain=read_data();

    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    datain=datain|pp;
    write_data1(datain);
  }
  else
  {

    CS2=0;
	CS1=1;
	write_cmd1(Page_Add+y1);
	write_cmd1(Col_Add+x-64);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    delay1(10);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    datain=datain|pp;
    write_data1(datain);
  }
  

  
}


vp_p(uchar *s)
{
    uchar i;
	unsigned long vp=0;
	max=s[0],min=s[0];
	for(i=1;i<120;i++)
	{
	   if (max<s[i])max=s[i];
	   if(min>s[i])min=s[i]; 
	}
	vp=max-min;
	vp=vp*500;
	vp=vp/255;

	d[2]=vp/100;
	d[1]=(vp-d[2]*100)/10+1;
	d[0]=vp%10;
    
}
void pointb(uchar x,uchar y)
{
  uchar y1,y2,pp;
  uchar datain;
  
  pp=1;
  y1=y>>3;
  y2=y%8;

  pp=~(pp<<y2);
  
  if (x<64)
  {
    CS2=1;
	CS1=0;
	write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);  
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    delay1(10);
    datain=read_data();

    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x);
    datain=datain&pp;
    write_data1(datain);
  }
  else
  {

    CS2=0;
	CS1=1;
	write_cmd1(Page_Add+y1);
	write_cmd1(Col_Add+x-64);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    delay1(10);
    datain=read_data();
    write_cmd1(Page_Add+y1);
    write_cmd1(Col_Add+x-64);
    datain=datain&pp;
    write_data1(datain);
  }
   
}
//5*7
display_num(uchar x,uchar y,uchar *num,uchar n)
{
    uchar i,j,temp;
	for(j=0;j<5;j++)
	{	temp=num[5*n+j];
	    for(i=0;i<8;i++)
	    {

		    if(temp&1)point(x+j,y+i);
			else pointb(x+j,y+i);
			temp=temp>>1;
		}
	 }
}

	    
display8_16(uchar x,uchar y,uchar *num,uchar n)
{
    uchar i,j,temp;
	for(j=0;j<16;j++)
	{	temp=num[16*n+j];
	    if(j<8)
	    {	
		    temp=temp>>4;
		    for(i=0;i<4;i++)
	        {
			    
		        if(temp&1)point(x+j,y+i);
			    else pointb(x+j,y+i);
			    temp=temp>>1;
		    }
		}
		else
		{   
		    for(i=0;i<4;i++)
	        {
				   //temp=temp>>4;
		           if(temp&1)point(x+j-8,y+i+4);
			       else pointb(x+j-8,y+i+4);
		         temp=temp>>1;
		     }
		 }
	   
	 }
}
	    
	  




void write_data1(uchar dout)  
{

        DI=1; RW=0;
        Lcd_Bus=dout;
        E=1;
        E=0;
	    delay1(1);
}






//***************************读LCD数据*********************
 
uchar read_data()  
{
		uchar din;
		Lcd_Bus=0xff;
		DI=1; RW=1;
		E=0;
		E=0;
		E=1;
		E=1;
		E=1;
		din=Lcd_Bus;
		return din;        
}




//****************************清除内存*********************

void cls()  
{
        uchar j,k;
        CS2=1;CS1=0;
        for(k=0;k<8;k++)
        {
                write_cmd1(Page_Add+k);
        	    write_cmd1(Col_Add);       //列地址0
	            for(j=0;j<64;j++)     //列地址自动加一
	                    write_data1(0x00);
         }
	     CS2=0;CS1=1;
	     for(k=0;k<8;k++)

⌨️ 快捷键说明

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