📄 spy_lcd.c
字号:
//------------------------------------------------------------------------------------------------------------//
#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 + -