📄 main.c
字号:
#include<reg51.h>
#include <stdlib.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void lcd_write_ins(uchar i);
sbit data_in=P2^3;
sbit data_clk=P2^4;
sbit comtrol_oe=P2^5;
sbit comtrol_in=P2^6;
sbit comtrol_clk=P2^7;
sbit key_port0=P1^0;
sbit key_port1=P1^1;
sbit key_port2=P1^2;
sbit key_port3=P1^3;
sbit key_port4=P1^4;
sbit lcd_da=P1^5;
sbit lcd_clk=P1^6;
bit main_make=1;
uchar data line[9];
uchar p;
uchar up_down=1;
uchar all=0;
uchar code fre[]={"1.频率调节"};
uchar code am[]={"2.AM幅度调制"};
uchar code pa_sk[]={"3.产生psk,ask"};
uchar code fm[]={"4.FM频率调制"};
uchar code fre_mode_tab1[]={"请输入频率后按确"};
uchar code fre_mode_tab2[]={"定输出或按返回重"};
uchar code fre_mode_tab3[]={"新输入!"};
uchar code fre_mode_tab4[]={" (Hz)"};
uchar code am_mode_tab1[]={"请选择调制度Ma"};
uchar code am_mode_tab2[]={"10%"};
uchar code pa_sk_mode_tab1[]={"选择ASK/PSK.模式"};
uchar code pa_sk_mode_tab2[]={" ASK PSK "};
uchar code pa_sk_mode_tab3[]={"输入基带序列编码"};
uchar code pa_sk_mode_tab4[]={""};
uchar code fm_mode_tab1[]={"按左右键选择频偏"};
uchar code fm_mode_tab2[]={" 5K 10K"};
uchar code fm_mode_tab3[]={"请输入载波频率"};
uchar code fm_mode_tab4[]={" (Hz)"};
/******************************送控制DDS_AD9851控制字*************************************/
void rx_74164(unsigned char a) //通过74164把数据传给FPGA
{unsigned char i;
for (i=0;i<8;i++)
{ a<<=1; data_in=CY;
data_clk=0;
data_clk=1;
data_clk=0;
}
}
void comtrol(unsigned char b)
{ unsigned char i;
for (i=0;i<8;i++)
{b<<=1;comtrol_in=CY;
comtrol_clk=0;
comtrol_clk=1;
comtrol_clk=0;
}
comtrol_oe=1;
comtrol_oe=0;
comtrol_oe=1;
}
//--------------------------------------------------------------
void send_fre_data(void)
{
float y;
ulong z;
uchar i,b;
uchar x0,x1,x2,x3;
y=atof(line);
z=y*35.7913941;
x0=z/16777216;
x1=(z%16777216)/65536;
x2=((z%16777216)%65536)/256;
x3=(((z%16777216)%65536)%256)/1;b=0x0f;
comtrol(0x00);
rx_74164(x3);
lcd_write_ins(0x01);
comtrol(0xff);
rx_74164(x2);
lcd_write_ins(0x01);
comtrol(0x02);
comtrol(0xff);
rx_74164(x1);
comtrol(0x03);
comtrol(0xff);
rx_74164(x0);
comtrol(4);
comtrol(0xff);
rx_74164(1);
comtrol(5);
comtrol(0xff);
comtrol(6);
comtrol(7);
comtrol(0xff);
_nop_();
}
/**************************以下为液晶显示子程序***********************/
void lcd_delay(void) //显示延时1MS
{
uint i;
for(i=0;i<50;i++);
_nop_();
}
//------------------------------------发数据
void lcd_send_data(uchar mun)
{
uchar i;
for(i=0;i<8;i++)
{
lcd_clk=0;
if((mun&0x80)!=0)lcd_da=1;
else lcd_da=0;
lcd_clk=1;
mun=mun<<1;
}
}
//-----------------------------------------------写指令
void lcd_write_ins(uchar num)
{
uchar hdata,ldata;
hdata=num&0xf0;
ldata=((num<<4)&0xf0);
lcd_send_data(0xf8);
lcd_delay();
lcd_send_data(hdata);
lcd_delay();
lcd_send_data(ldata);
lcd_delay();
}
//-----------------------------------写数据
void lcd_write_da(uchar num)
{
uchar hdata,ldata;
hdata=num&0xf0;
ldata=((num<<4)&0xf0);
lcd_send_data(0xfa);
lcd_delay();
lcd_send_data(hdata);
lcd_delay();
lcd_send_data(ldata);
lcd_delay();
}
//-------------------------------------X表示第几个字,Y表示第几行,Z表示字符;
void lcd_show(uchar x,uchar y,uchar *z)
{
switch (y)
{
case 1:lcd_write_ins(0x80+x-1);break;
case 2:lcd_write_ins(0x90+x-1);break;
case 3:lcd_write_ins(0x88+x-1);break;
case 4:lcd_write_ins(0x98+x-1);break;
default:break;
}
while(*z)
{
lcd_write_da(*z++);
}
}
//--------------------------------------------
//12864液晶反白子程序
//X第几个字(1~8),Y第几行(1~4行),width反白的宽度(1~16)(单位:字符)
//若width==0则上次反白的位置变为正常显示,若width!=0,上次反白的位
//置变为正常显示,则这次反白的位置反白。
void fan(uchar lcd_x,uchar lcd_y,uchar width)
{
uchar xx,yy,i,j;
yy=0x80;xx=0x80; //下半屏绘图区X,y轴地址
lcd_write_ins(0x36); //扩展指令模式,形图开关开
for (i=0;i<32;i++) //上半屏处理显示空白
{
lcd_write_ins(yy++);lcd_write_ins(xx);
for (j=0;j<16;j++)
{ lcd_write_da(0x00);}
}
yy=0x80;xx=0x88; //下半屏绘图区X,轴地址
for (i=0;i<32;i++) //下半屏处理显示空白
{
lcd_write_ins(yy++); lcd_write_ins(xx);
for (j=0;j<16;j++)
{ lcd_write_da(0x00); }
}
lcd_write_ins(0x30); //基本指令模式
//-------------------------------------------
if(width!=0) //如果width不等0,则反白选中区域并存此次的参数
{
if(lcd_y>2)
{
xx=lcd_x+0x87;
yy=((lcd_y-3)<<4)+0x80;
}
else
{
xx=lcd_x+0x7f;
yy=((lcd_y-1)<<4)+0x80;
}
//--------------------反白选中区域----------------------------
lcd_write_ins(0x36); //扩展指令模式,形图开关开
for (i=0;i<16;i++) //一行处理显示
{
lcd_write_ins(yy++);lcd_write_ins(xx);
for (j=0;j<width;j++)
{ lcd_write_da(0xff);}
}
lcd_write_ins(0x30); //基本指令模式
}
}
//----------------------------------------------lcd初始化
void lcd_begin(void)
{
lcd_delay();
lcd_write_ins(0x30);
lcd_write_ins(0x08);
lcd_write_ins(0x0e);
lcd_write_ins(0x01);
lcd_write_ins(0x06);
}
/********************************以下为键盘子程序*******************************************/
void key_delay(void) //按键延时15ms
{
uchar i; uint j;
for(i=0;i<50;i++)
{
for(j=0;j<2000;j++)
{
_nop_();
}
}
}
//-----------------------------------------按键功能;
void key_1(void){line[p++]='1';lcd_write_da('1');}
void key_2(void){line[p++]='2';lcd_write_da('2');}
void key_3(void){line[p++]='3';lcd_write_da('3');}
void key_4(void){line[p++]='4';lcd_write_da('4');}
void key_5(void){line[p++]='5';lcd_write_da('5');}
void key_6(void){line[p++]='6';lcd_write_da('6');}
void key_7(void){line[p++]='7';lcd_write_da('7');}
void key_8(void){line[p++]='8';lcd_write_da('8');}
void key_9(void){line[p++]='9';lcd_write_da('9');}
void key_0(void){line[p++]='0';lcd_write_da('0');}
void key_up(void)
{
lcd_write_ins(0x0c);
up_down=up_down-1;
if(up_down==0){up_down=4;}
switch(up_down)
{
case 1:{fan(1,1,16);}break;
case 2:{fan(1,2,16);}break;
case 3:{fan(1,3,16);}break;
case 4:{fan(1,4,16);}break;
default:{}
}
}
void key_point(void){line[p++]='.';lcd_write_da('.');}
void key_13(void){}
void key_right(void){}
void key_enter(void)
{
if(up_down==1)
{
all=all+1;
if(all==3)all=1;
switch (all)
{
case 1:
main_make=0;
lcd_write_ins(0x01);
lcd_show(1,1,fre_mode_tab1);
lcd_show(1,2,fre_mode_tab2);
lcd_show(1,3,fre_mode_tab3);
lcd_show(1,4,fre_mode_tab4);
lcd_write_ins(0x98);break;
case 2:
send_fre_data();break;
default:{}
}
}
else if(up_down==2)
{
lcd_write_ins(0x01);
lcd_show(1,1,am_mode_tab1);
lcd_show(1,2,am_mode_tab2);
lcd_write_ins(0x88);
}
else if(up_down==3)
{
lcd_write_ins(0x01);
lcd_show(1,1,pa_sk_mode_tab1);
lcd_show(1,2,pa_sk_mode_tab2);
lcd_show(1,3,pa_sk_mode_tab3);
lcd_write_ins(0x98);
}
else if(up_down==4)
{
lcd_write_ins(0x01);
lcd_show(1,1,fm_mode_tab1);
lcd_show(1,2,fm_mode_tab2);
lcd_show(1,3,fm_mode_tab3);
lcd_show(1,4,fm_mode_tab4);
lcd_write_ins(0x98);
}
}
void key_left(void){}
void key_17(void){}
void key_18(void){}
void key_down(void)
{
lcd_write_ins(0x0c);
up_down=up_down+1;
if(up_down==5){up_down=1;}
switch(up_down)
{
case 1:{fan(1,1,16);}break;
case 2:{fan(1,2,16);}break;
case 3:{fan(1,3,16);}break;
case 4:{fan(1,4,16);}break;
default:{}
}
}
void key_return(void)
{
lcd_write_ins(0x01);
lcd_show(1,1,fre);
lcd_show(1,2,am);
lcd_show(1,3,pa_sk);
lcd_show(1,4,fm);
fan(1,up_down,16);
main_make=1;
}
//-------------------------------------------按键辩别;
void argue(uchar num)
{
if(num!=0xff)
{
switch(num)
{
case 1:{key_1();}break;
case 2:{key_2();}break;
case 3:{key_3();}break;
case 4:{key_4();}break;
case 5:{key_5();}break;
case 6:{key_6();}break;
case 7:{key_7();}break;
case 8:{key_8();}break;
case 9:{key_9();}break;
case 10:{key_0();}break;
case 11:{key_up();}break;
case 12:{key_point();}break;
case 13:{key_13();}break;
case 14:{key_right();}break;
case 15:{key_enter();}break;
case 16:{key_left();}break;
case 17:{key_17();}break;
case 18:{key_18();}break;
case 19:{key_down();}break;
case 20:{key_return();}break;
default:{}
}
}
}
//-------------------------------------------------按键扫描;
uchar first_line(void) //扫描第一行;
{
if(key_port0|key_port1==0) {key_delay();return(1);}
else if(key_port0|key_port2==0) {key_delay();return(2);}
else if(key_port0|key_port3==0) {key_delay();return(3);}
else if(key_port0|key_port4==0) {key_delay();return(4);}
else return(0xff);
}
uchar second_line(void) //扫描第二行;
{
if(key_port1|key_port0==0) {key_delay();return(5);}
else if(key_port1|key_port2==0) {key_delay();return(6);}
else if(key_port1|key_port3==0) {key_delay();return(7);}
else if(key_port1|key_port4==0) {key_delay();return(8);}
else return(0xff);
}
uchar third_line(void) //扫描第三行;
{
if(key_port2| key_port0==0) {key_delay();return(9);}
else if(key_port2|key_port1==0) {key_delay();return(10);}
else if(key_port2|key_port3==0) {key_delay();return(11);}
else if(key_port2|key_port4==0) {key_delay();return(12);}
else return(0xff);
}
uchar four_line(void) //扫描第四行;
{
if(key_port3|key_port0==0) {key_delay();return(13);}
else if(key_port3|key_port1==0) {key_delay();return(14);}
else if(key_port3|key_port2==0) {key_delay();return(15);}
else if(key_port3|key_port4==0) {key_delay();return(16);}
else return(0xff);
}
uchar five_line(void) //扫描第五行;
{
if(key_port4|key_port0==0) {key_delay();return(17);}
else if(key_port4|key_port1==0) {key_delay();return(18);}
else if(key_port4|key_port2==0) {key_delay();return(19);}
else if(key_port4|key_port3==0) {key_delay();return(20);}
else return(0xff);
}
//-------------------------------------------键盘入口;
void key_board(void)
{
uchar num;
while(1)
{
key_port0=0;
num=first_line();
argue(num);
key_port0=1;key_port1=0;
num=second_line();
argue(num);
key_port1=1;key_port2=0;
num=third_line();
argue(num);
key_port2=1;key_port3=0;
num=four_line();
argue(num);
key_port3=1;key_port4=0;
num=five_line();
argue(num);
key_port4=1;
}
}
//-------------------------------------
main()
{
lcd_begin();
lcd_show(1,1,fre);
lcd_show(1,2,am);
lcd_show(1,3,pa_sk);
lcd_show(1,4,fm);
fan(1,1,16);
key_board();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -