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

📄 spy_lcd.c

📁 此程序主要测试50HZ~3KHZ音频范围幅频特性测试程序.程序包含主控程序和显示程序.
💻 C
📖 第 1 页 / 共 2 页
字号:


//------------------------------------------------------------------------------------------------------------//


#include<reg52.h>
#include<absacc.h>
#include<math.h>
#include<stdio.h>

#define uchar unsigned char
#define uint unsigned int

sbit DENG=P3^5;  //定义调试测试灯

 /*将字节A中的第B位置C,C为1或0 */
#define SETBIT(A,B,C) ((C)?(A=A|(1<<B)):(A=A&(~(1<<B))))

/*测试字节A中第B位,是1返回1,是0返回0*/
#define GETBIT(A,B) ((A&(1<<B))?1:0)

/*将A,B中较小的返回*/
#define MIN(A,B) ((A<=B)?A:B)

/*将A,B中较大的返回*/
#define MAX(A,B) ((A>=B)?A:B)

#define co_sel 1	/*商标显示选择1为世通科技,0为RYCOM*/

typedef struct  //使用typedef别名来定义结构类型变量
{
	uchar x;
	uchar y;
}point;   //point为结构体的类型别名,然后在利用point来定义结构体变量。

point p1,p2;  //定义结构体变量p1,p2

void iwlr(uchar);		/*指令同时写入左右半屏*/
void dwlr(uchar);		/*显示数据同时写入左右半屏*/
void iwl(uchar);		/*指令写入左半屏*/
void iwr(uchar);		/*指令写入右半屏*/
void dwl(uchar);		/*显示数据写入左半屏*/
void dwr(uchar);		/*显示数据写入右半屏*/
uchar drl();			/*显示数据从左半屏读入*/
uchar drr();			/*显示数据从右半屏读入*/
void offlcd();			/*关闭LCD*/
void onlcd();			/*打开LCD*/

uchar pf;				/*校验和*/
point cursor;			/*光标点全局变量*/
bit zf_ovx;				/*显示字符超出水平边界标志*/
bit zf_ovy;				/*显示字符超出垂直边界标志*/
//bit tx_ovx;				/*显示图形超出垂直边界标志*/
//bit tx_ovy;				/*显示图形超出垂直边界标志*/
//bit zf_fs;				/*0为西文方式,1为中文方式*/
//bit sec;				/*秒信号,由定时器周期取反*/

//uchar bdata flag=0;		/*显示状态字节*/
//sbit flash=flag^7;		/*闪烁标志,0为不闪烁,1为闪烁,只要以下任一有便为1*/
//sbit fref=flag^6;		/*频率闪烁标志,0为不闪烁,1为闪烁*/
//sbit batf=flag^5;		/*电量闪烁标志,0为不闪烁,1为闪烁*/
//sbit bandf=flag^4;		/*频带闪烁标志,0为不闪烁,1为闪烁*/
//sbit mutef=flag^3;		/*静音闪烁标志,0为不闪烁,1为闪烁*/
//sbit prof=flag^1;		/*提示闪烁标志,0为不闪烁,1为闪烁*/
//sbit bufov=flag^0;		/*命令缓冲区满标志,1为满*/


//uchar ffpos=0;			/*频率选种位置,从0到5*/

uchar idata r_in=1;					/*入队列指针*/
uchar idata r_out=0;				/*出队列指针*/
bit r_full;							/*接收命令缓冲区满标志*/
uchar cmd_cnt=0;					/*命令计数器,每一个完整的命令加1,命令结束标志为0xff*/
bit cmd_st=0;						/*命令开始标志*/
bit cmd_fin=0;						/*命令结束标志*/

uchar lbarnum=0;					/*水平条形图宽度数据*/
uchar batnum=0;						/*电池电量数据*/
uchar counter=0;					/*计数器*/
uchar vol_bar_num=0;				/*音量条形图宽度数据*/

uint idata shuju[4];//{0x1b,0x11,0xaf,0x20}; //shuju[0]:为空内容 shuju[1]:数据命令类型  shuju[2]:数据低8位 shuju[3]:数据高8位
uchar idata shuju_y[100]; //定义记录扫频过曲线点的坐标
uchar idata qxzz; //定义扫频时数据更新记录指针
uchar idata direction=0; //定义查询时光标移动方向 =0为向左移方向,=1为向右移方向.

uchar sum=0,istart=0,iend=0;  //初始化状态标志位
uint fre_sp,bre_sp; //定义扫频时显示变量
uint fre_cx,bre_cx;  //定义查询时显示变量
uint fre_cx0; //用来记录前一个查询时的频值
uint fre_cx1; //用来记录第二一个查询时的频值
uint voltaga_sp=0;   //扫频仪固定输出电压值

uchar idata  counter_cx=0;//查询时竖线移动计数标志
uchar pdlx;   //频段号标志
uchar spgs;  //扫频格式标志
uint tally;  //定义查询键按下次数标值

bit sp_fre=0;  //扫频时频率值处理标志
bit sp_bre=0;  //扫频时幅值处理标志
bit cx_fre=0;   //查询时频率值处理标志
bit cx_bre=0;  //查询时幅值处理标志
bit st_st=0;   //开始键按下标志




/*以下字模格式为:   取模方式为: 纵向取模
                    字节为倒序
                    保留文字字模数据后的最后一个逗号
                    任何时候都加o
*/


/*小字体数字*/
uchar code numeric[]={
/*--  文字:  0  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x78,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  1  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  2  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0xC8,0xA4,0xA4,0x98,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  3  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x48,0x84,0x94,0x68,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  4  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x60,0x58,0xFC,0x40,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  5  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x9C,0x94,0x94,0x64,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  6  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x78,0x94,0x94,0x60,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  7  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x04,0xE4,0x14,0x0C,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x68,0x94,0x94,0x68,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  9  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=5x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=5x16  --*/
0x00,0x18,0xA4,0xA4,0x78,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  小数点 --*/
/*--  宽度x高度=5x16  --*/
0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
};

/*大写字母*/
uchar code letter[]={
/*--  文字:  A  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xC0,0x30,0x2C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,


/*--  文字:  B  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x94,0x94,0x94,0x68,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  C  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x78,0x84,0x84,0x84,0x48,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  D  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x84,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  E  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x94,0x94,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  F  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x14,0x14,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  G  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x78,0x84,0x84,0xA4,0xE8,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  H  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x10,0x10,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  I  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  J  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xC0,0x80,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  K  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x30,0x48,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  L  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  M  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xFE,0x0C,0xF0,0x0C,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  N  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x0C,0x30,0xC0,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  O  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x78,0x84,0x84,0x84,0x78,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  P  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  Q  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x78,0x84,0xA4,0x44,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  R  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xFC,0x24,0x24,0x24,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  S  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x48,0x94,0xA4,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  T  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x04,0x04,0xFC,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  U  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x7C,0x80,0x80,0x80,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  V  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x0C,0x30,0xC0,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  W  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x0C,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  X  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x84,0x48,0x30,0x48,0x84,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  Y  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x04,0x08,0xF0,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  Z  --*/
/*--  Small Fonts6;  此字体下对应的点阵为:宽x高=6x10   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0xC4,0xA4,0x94,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};


/*延时子程序,参数C决定延时的长短*/
/*
void delay(uchar c)
{
	uchar a,b;
	b=c;a=c;
	do
	{
		a--;
		b=c;
		do{b--;}
		while(b!=0);
	}
	while(a!=0);
}
*/
/*将VRAM清0*/
void clr_lcd()
{
	uchar i,j;
	for(j=0;j<8;j++)
	{
		iwlr(0xb8|j); /*指令同时写入左右半屏*/
		iwlr(0x40);   /*指令同时写入左右半屏*/
		for(i=0;i<64;i++)
		{dwlr(0);}   /*显示数据同时写入左右半屏*/
	}
}

/*在p点处显示或清除一点,参数s为1时显示一点,否则清除一点*/
void disp_one_dot(point p,bit s)
{
	uchar a;
	if(p.x<128&&p.y<64)
	{
		if(p.x<=63)
		{
			iwl(0xb8|(p.y/8));
			iwl(0x40|p.x);
			a=drl();
			a=drl();
			iwl(0x40|p.x);
			if(s) {dwl(SETBIT(a,p.y%8,1));}
			else{dwl(SETBIT(a,p.y%8,0));}
		}
		else
		{
			iwr(0xb8|(p.y/8));
			iwr(0x40|p.x);
			a=drr();
			a=drr();
			iwr(0x40|(p.x-64));
			if(s) {dwr(SETBIT(a,p.y%8,1));}
			else{dwr(SETBIT(a,p.y%8,0));}
		}
	}
}

/*绘直线程序,其中psta,pend分别为直线的两端点,s=1显示直线,s=0清除直线*/
draw_line(point psta,point pend,bit s)
{
	uchar d_x,d_y;
	signed char err;
	err=0;
	if(psta.y>pend.y)
	{
		d_x=psta.x;    d_y=psta.y;
		psta.x=pend.x; psta.y=pend.y;
		pend.x=d_x;    pend.y=d_y;
	}
	d_y=pend.y-psta.y;
	disp_one_dot(psta,s);
	if(pend.x>=psta.x)   //直线向右偏
	{
		d_x=pend.x-psta.x;
		if(d_x>=d_y)
		{
			if(d_y==0) psta.y--;
			for(psta.x++;psta.x<=pend.x;psta.x++)
			{
				if(err>=0)
				{
					psta.y++;
					err=err+d_y-d_x;
				}
				else
				{
					err=err+d_y;
				}
				disp_one_dot(psta,s);
			}
		}
		else
		{
			for(psta.y++;psta.y<=pend.y;psta.y++)
			{
				if(err>=0)
				{
					err=err-d_x;
				}
				else
				{
					psta.x++;
					err=err+d_y-d_x;
				}
			disp_one_dot(psta,s);
			}
		}
	}
	else             //直线向左偏
	{
		d_x=psta.x-pend.x;
		if(d_x>=d_y)
		{
			if(d_y==0) psta.y--;
			for(psta.x--;psta.x!=pend.x-1;psta.x--)
			{
				if(err<0)
				{
					err=err+d_y;
				}
				else
				{
					psta.y++;
					err=err+d_y-d_x;
				}
				disp_one_dot(psta,s);
			}
		}
		else
		{
			for(psta.y++;psta.y<=pend.y;psta.y++)
			{
				if(err>=0)
				{
					err=err-d_x;
				}
				else
				{
					psta.x--;
				}
				disp_one_dot(psta,s);
			}
		}
	}
}

/*绘制一般矩形,其中firp与othp分别为矩形的对角两点坐标,
s=1显示矩形,s=0时清除矩形*/
void draw_rec(point firp,point othp,bit s)
{
	point a; //定义结构体变量a
	a.x=firp.x;
	a.y=othp.y;
	draw_line(firp,a,s);
	draw_line(othp,a,s);
	a.x=othp.x;
	a.y=firp.y;
	draw_line(firp,a,s);
	draw_line(othp,a,s);
}

/*p1,p2点指定的矩形区域置1(s=0xff),清除(s=0),其它则取反*/
/*从下到上,从左到右进行刷新*/

void draw_srec(point p1,point p2,uchar s)
{
	uchar a,i,j,min,max;
	if(p1.x>p2.x) {a=p1.x;p1.x=p2.x;p2.x=a;}
	if(p1.y>p2.y) {a=p1.y;p1.y=p2.y;p2.y=a;}
	if((p1.x<128)&(p1.y<64))
	{
		if(p2.x>127) p2.x=127;
		if(p2.y>63) p2.y=63;
		min=MIN(p1.y/8,p2.y/8);
		max=MAX(p1.y/8,p2.y/8);
		for(i=max+1;i>=min+1;i--)
		{

			for(j=p1.x;j<=p2.x;j++)
			{
				if(j<=63)
				{
					iwl(0xb8|(i-1));//page
					iwl(0x40|j);
					a=drl();
					a=drl();
					iwl(0x40|j);
					if(min!=max)
					{
						if(i==min+1)//最上边一页的处理
						{
							if(s==0) dwl(a&(0xff>>(8-p1.y%8)));

⌨️ 快捷键说明

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