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

📄 12864.txt

📁 12864液晶屏的C语言程序
💻 TXT
字号:
#include <reg52.h>
#include<math.h>

#define fftpowermax 52428.8
#define uint       unsigned int
#define uchar      unsigned char
#define disp_off   0x3e
#define disp_on    0x3f
#define disp_x     0xb8
#define disp_z     0xc0
#define disp_y     0x40
#define comm       0
#define dat        1
#define data_ora   P0       //MCU P1<------> LCM
#define adrlow P1			//////定义数据口P1		
#define fpgadata P2         /////定义地址口P2

unsigned int pin1=0;
//unsigned int pin2=0;
unsigned char adr=0;
unsigned char p_display[6];
//要显示的总功率 4位有效数字0。000+/-0 第五位数为1表示负指数
unsigned char f_display[5];
//unsigned char f_now[2];
unsigned char number_all;
//unsigned char last[3];
/////////communication//////////
unsigned char comm_cnt=0;
sbit comm_adr4=P2^7;
//////////////////

sbit int_0=P3^2;
sbit di =P3^7;  //Data or Instrument Select,H:写数据,L:写指令
sbit rw =P3^6;  //Write or Read,H:read,L:write
sbit e  =P3^5;  //读写使能
sbit cs1=P3^4;  //cs1=H,选择左半屏
sbit cs2=P3^3;  //cs2=H,选择右半屏
sbit rst=P3^1;//  //Lcm reset,低有效
sbit bf =P0^7;
sbit res=P0^4;
sbit en=P3^0;/////P30作为使能端,用于和FPGA通信

uchar biaoji=0;
char int0_cnt=0;
char ert_int_cnt=0;
bit flag;
unsigned int power_whole,power_first;



//////////********以下是显示屏上数据***********///////////////
uchar code fakedisplay[256]={3,0,1,0,1,2,7,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0};

uchar code number0[]={
/*0    */
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};

uchar code number1[]={
/*1    */
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};
uchar code number2[]={
/*2    */
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};
uchar code number3[]={
/*3    */
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};
uchar code number4[]={
/*4    */
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};
uchar code number5[]={
/*5    */
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};
uchar code number6[]={
/*6    */
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};
uchar code number7[]={
/*7    */
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};
uchar code number8[]={
/*8    */
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};
uchar code number9[]={
/*9    */
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};


uchar code number10[]={
///////////******显示一个点*********///////////////
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00
};

uchar code number11[]={
/*+    */
0x00,0x80,0x80,0xE0,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00};

uchar code number12[]={
/*-    */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01};

uchar code zonggong[]={
/*总*/
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};


uchar code hz[]={
/*--  文字:     H --*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,
/*--  文字:     Z --*/
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00};

uchar code mw[]={
/*m    */
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,
/*w    */
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,
};

uchar code clear_zero[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};


uchar code roma_i[]=
{///显示一个罗马字符
0x04,0x0c,0x0c,0xfc,0xfc,0x0c,0x0c,0x04,0x40,0x60,0x60,0x7f,0x7f,0x60,0x60,0x40,

};

uchar code roma_ii[]=
{//显示一个罗马字符
0x04,0x0c,0xfc,0x0c,0x0c,0xfc,0x0c,0x04,0x40,0x60,0x7f,0x60,0x60,0x7f,0x60,0x40,

};
//////////////*****显示屏上的数据定义结束******////////////////////

////******以上是信号代码的定义*****/////////////

////////////&&&&&&&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$/////////////

//////////&&&&&&&&&&&&&&&//////////////
void delay (uint us)
{
  while(--us);
}
/*---------------延时子程序----------------*/

void chk_busy (void)
{
  data_ora=0xff;
  di=0;
  rw=1;
  ;
  e=1;
  while(bf||res==1);
  e=0;
}

/*------------写数据或命令到LCD--------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  chk_busy ();
  di=dat_comm;
  rw=0;
  data_ora=content;
  e=1;
  ;
  e=0;
}
/*--------------读LCD数据---------------*/
uchar rd_lcd ()
{
  uchar rddata;
  chk_busy ();
  di=1;
  rw=1;
  e=1;
  ;
  rddata=data_ora;
  e=0;
  return rddata;
}

/*--------------写点阵------------------*/
void lat_disp (uchar data1,uchar data2)
{
  uchar i,j;
  cs1=1;cs2=1;
  wr_lcd (comm,disp_on);
  for(j=0;j<8;j++)
  {
    wr_lcd (comm,disp_x+j);////disp_x为页地址,起始页为第0页,页数不会自动加1,所以要软件设置一下
    wr_lcd (comm,disp_z);//////disp_z为起始行,起始行为第0行,行数会自动加1,软件不要加值
    wr_lcd (comm,disp_y);//////dis_y为起始列,起始为第0列,列数会自动加1,软件不要加值
    for(i=0;i<32;i++)
    {
	  //////对于
      wr_lcd (dat,data1);
      wr_lcd (dat,data2);
    }
  }
}
/*---指定位置(x,y)显示row_xl行(每行row_yl个)汉字(大小8xl*yl)---*/
//8*x1是每个汉字的行数,一般为2,y1为列数,一般为16
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn)
{
  uchar i,j,k,l,a;
  wr_lcd (comm,disp_on);
  for(l=0;l<row_xl;l++)
  {
    for(k=0;k<row_yl;k++)
    {
      for(j=0;j<xl;j++)
      {
        wr_lcd (comm,disp_x+x+l*xl+j);
        wr_lcd (comm,disp_z);
        wr_lcd (comm,disp_y+y+k*yl);
        a=l*xl*yl*row_yl+k*xl*yl+j*yl;
        for(i=0;i<yl;i++)
          wr_lcd (dat,chn[a+i]);
      }
    }
  }
}


////////*******以下程序的作用是将频率所在的位置清0---未用***********///////////////
void clear_pin(void)
{
uchar cc=0;
cs1=1;cs2=0;
for(cc=0;cc<8;cc++)
chn_disp(2,cc*8,2,8,1,8,clear_zero);
}

/*------------------初始化-----------------*/
void init_lcd (void)
{
  rst=0;
  delay(50);
  rst=1;
  cs1=1;cs2=1;
  wr_lcd (comm,disp_off);
  wr_lcd (comm,disp_on);
}



void disp1 (void)
{
  lat_disp(0x00,0x00);////实现清屏的功能////
  delay(100);
  /////////////*****第一块屏的情况********///////////
  cs1=1;cs2=0;
  chn_disp(0,48,2,16,1,1,zonggong);
  chn_disp(2,0,2,8,1,1,roma_i);//显示1
  chn_disp(2,48,2,8,1,2,hz);////显示hz
  chn_disp(4,0,2,8,1,1,roma_ii);///显示2
  chn_disp(4,48,2,8,1,2,hz);//显示HZ
  chn_disp(6,48,2,8,1,2,hz);//显示HZ
 
  /////////////////******第二块屏******/////////////
  cs1=0;cs2=1;
  chn_disp(0,8,2,8,1,1,number10);
  chn_disp(0,56,2,8,1,1,mw);////显示mw
  chn_disp(2,56,2,8,1,1,mw);//显示mw
  chn_disp(4,56,2,8,1,1,mw);////显示hz
  chn_disp(6,56,2,8,1,1,mw);///显示mw

}

///////////*******以下程序是显示8位频率数据的情况**********/
uchar code *choice(uchar select,uchar code *num0,uchar code *num1,uchar code *num2,uchar code *num3,uchar code *num4,uchar code *num5,uchar code *num6,uchar code *num7,uchar code *num8,uchar code *num9,uchar code *num10,uchar code *num11,uchar code *num12)
{
uchar *tmp;
switch(select)
{
case 0:tmp=num0;break;

case 1:tmp=num1;break;

case 2:tmp=num2;break;

case 3:tmp=num3;break;

case 4:tmp=num4;break;

case 5:tmp=num5;break;

case 6:tmp=num6;break;

case 7:tmp=num7;break;

case 8:tmp=num8;break;

case 9:tmp=num9;break;

case 10:tmp=num10;break;

case 11:tmp=num11;break;

case 12:tmp=num12;break;
}
return tmp;
}



////POW是功率数组,POS_p表示显示的是第几行,可能取值为0,2,4,6

void display_power(uchar *power,uchar pos_p){
uchar yi;
if(power[4]==0)power[4]=11;

if(power[4]==1)power[4]=12;
cs1=0;cs2=1;
/////首先要清屏//////
for(yi=0;yi<7;yi++)
chn_disp(pos_p,yi*8,2,8,1,1,clear_zero);
///////////////清屏结束//////////////////////////
chn_disp(pos_p,0,2,8,1,1,choice(power[0],number0,number1,number2,number3,number4,number5,number6,number7,number8,number9,number10,number11,number12));
chn_disp(pos_p,8,2,8,1,1,number10);/////写小数点
for(yi=0;yi<5;yi++)
chn_disp(pos_p,16+yi*8,2,8,1,1,choice(power[yi+1],number0,number1,number2,number3,number4,number5,number6,number7,number8,number9,number10,number11,number12));

}



//////FREQ为频率数组,pos_f表示的是第几行,可能取值为2,4,6//////////
void display_freq(uchar *freq,uchar pos_f)
{
uchar gj;
cs1=1;cs2=0;
for(gj=0;gj<5;gj++)
chn_disp(pos_f,8+gj*8,2,8,1,1,clear_zero);///刷屏
for(gj=0;gj<5;gj++)
chn_disp(pos_f,8+gj*8,2,8,1,1,choice(freq[gj],number0,number1,number2,number3,number4,number5,number6,number7,number8,number9,number10,number11,number12));


}






unsigned char readbyte (unsigned int adress)
{ 		
unsigned char tempdata=0;
	en=0;

	adrlow=adress%256;
	en=1;
	tempdata=fpgadata;
	;
	en=0;
return tempdata;
}


//////////////读总个数///////

/*void readtotal_f_num()
{unsigned char total;
total=readbyte(0);
number_all=total/6-1;
}

*/

void readtotal_p()
{double p=0;
unsigned char i=3;
unsigned char e=0;
	for(;i<6;i++)
	{p*=256;
	p+=readbyte(i);
	}

	adr=3;
	//读入数据
	p=p/fftpowermax*46.509/2.626;
	p=p*1.06;
	pin1=p;
	
while(p/10>1)
	{p=p/10;
	e++;
	}

	p_display[4]=0;
	//送出指数符号
	p_display[5]=e;
	//送出指数

	for(i=0;i<4;i++)
	{
	p_display[i]=p;
	//送出总功率值
	p=p-p_display[i];
	p=p*10;
	}
}



void readdata()
{
int f=0;
double p=0;
char e_p=-6;
char i=0;

	for(i=0;i<5;i++)
	{
		if(i<3)
		{p*=256;
		p+=readbyte(adr);

		}
		else 
		{f*=256;
		f+=readbyte(adr);
		}
	  adr++;
	}
adr=0;
///////////////配置 频率值

	f=f*12.2;
	if(biaoji==1)
	{
//	pin2=f;
	biaoji++;
	}	
	if(biaoji==0)
	{pin1=f;
	biaoji=1;
	}

	for(i=0;f/10>=0 && i<5;i++)
	{
	f_display[4-i]=f%10;
	f=f/10;
	}


///////配置 功率显示数值
	p=p/fftpowermax*46.508*1000000;

	while(p/10>1)
	{
	p=p/10;
	e_p++;
	}
	if(e_p<0)
	p_display[4]=1;
	else
	p_display[4]=0;
	//送出指数符号
	p_display[5]=abs(e_p);
	//送出指数
	for(i=0;i<4;i++)
	{
	p_display[i]=p;
	//送出总功率值
	p=p-p_display[i];
	p=p*10;
	}


/////////////////////
}


/////////////////////////////////
void count0() interrupt 1
///////////1秒定时中断,低优先级
{
/*
unsigned int d=15000;//16 ms
cs1=0;cs2=1;
chn_disp(2,0,2,8,1,1,number1);
//for(d=150;d>0;d--)
delay(200);
chn_disp(2,0,2,8,1,1,clear_zero);
*/



	TL0=-46080%256;
	TH0=-46080/256;
	int0_cnt++;
	if(int0_cnt==20)
	{int0_cnt=0;
	flag=1;
	}
	readdata();
display_power(p_display,6);
display_freq(f_display,6);

}

void ert_int() interrupt 0
///////////按键中断,高优先级
{

unsigned int d=15000;//16 ms
/*
cs1=0;cs2=1;
chn_disp(2,0,2,8,1,1,number1);
for(d=150;d>0;d--)
delay(200);
chn_disp(2,0,2,8,1,1,clear_zero);
d=15000;
*/
ert_int_cnt++;
	while(d>0) d--;
	if(ert_int_cnt==2)
	{ert_int_cnt=0;
	TR0=1;
	}
	else 
	TR0=0;
	IE0=0;

}

void ini_int()
{	TMOD=0x01;
	TL0=-46080%256;
	TH0=-46080/256;
	EX0=1;
	PX0=1;//外中断高优先级
	IT0=1;//边沿

	PT0=0;
	ET0=1;//开中断	
	EA=1;
	TR0=1;
}

/*unsigned int display_zhouqi(void)
{
unsigned int tmk;
pin1=5126;
pin2=5139;
tmk=pin1%pin2;
while(tmk!=0)
{
pin1=pin2;
pin2=tmk;
tmk=pin1%pin2;
}

return pin2;



} 

*/



/*------------------主程序--------------------*/
void main ()
{
uchar use;
uchar test_freq[5]={0};
long int cyb=0;

//unsigned int m;
  init_lcd();
 disp1();////显示主界面
 delay(100);

/////////裴建的显示函数/////////////////

//readtotal_f_num();

//显示总功率个数
while(1)
{
readtotal_p();
display_power(p_display,0); 
readdata();
display_power(p_display,2);
display_freq(f_display,2);

/*
readdata();
display_power(p_display,4);
display_freq(f_display,4);
readdata();
display_power(p_display,6);
display_freq(f_display,6);
ini_int();
*/

//cyb=display_zhouqi();
cyb=1000000/pin1;

///////以下是显示周期的函数//////
test_freq[4]=cyb%10;
test_freq[3]=(cyb/10)%10;
test_freq[2]=(cyb/100)%10;
test_freq[1]=(cyb/1000)%10; 
test_freq[0]=(cyb/10000)%10;

cs1=1,cs2=0;
for(use=0;use<5;use++)
chn_disp(0,8+use*8,2,8,1,1,clear_zero);///刷屏
for(use=0;use<5;use++)
chn_disp(0,8+use*8,2,8,1,1,choice(test_freq[use],number0,number1,number2,number3,number4,number5,number6,number7,number8,number9,number10,number11,number12));
for(cyb=65530;cyb>0;cyb--)
delay(200);
///////////加一个延时/////////////
for(use=0;use<5;use++)
chn_disp(0,8+use*8,1,8,1,1,clear_zero);///刷屏

//cyb=





//for(cyb=65530;cyb>0;cyb--)
delay(200);
} 
//while(1);
}

⌨️ 快捷键说明

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