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

📄 main.c

📁 单片机键盘以及LCD和AD控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************

键盘占用CS1 地址  0x9000	占用中断0
显示占用CS2 地址  0xa000
地址CS0
		0x8000~0x8100  WR
		0x8200~0x8300  WR
		0x8400~0x8500  WR
		0x8600~0x8700  WR
		0x8800~0x8900  RD
		0x8a00~0x8b00  RD
		0x8c00~0x8d00  RD
		0x8e00~0x8f00  RD
FCLK/FC=56K
注意:ADC0-ADC3不可以用 没有接通
	ADC6-ADC7不要用 因为没有接运放
DDS9851占用了 0x8000//数据	0x8200/控制
增益控制 0x8400
MAX262  8600 
可以使用的I/O : T0/P3^4 INT1/P3^3
串口亦可以尝试作为I/O  RXD/P3^0 TXD/P3^1
******************************************************/
#include "lcd.h"
#include "dds9851b.h"
#include "max262.h"
#include "dds.h"
#define ATMEL XBYTE[0x9000]
#define AMP XBYTE[0x8400]
unsigned char KeyValue;	   //键值


unsigned char xdata Confirm=0;//确认键按下的次数

unsigned char xdata Menu=0;//表示当前选定的菜单项
unsigned char xdata SubMenu=0;//表示第一级子菜单
			bit MenuSelect=0;
			bit SubMenuSelect=0;

unsigned char xdata SubConfirm=0;//用于标志子菜单的确认键
			bit Add=0;//用于第三次按下确认键的处理
/*************************************************************
以上是与键盘有关的变量
**********************************************************/
unsigned long xdata ChFr=100;   //扫频信号的频率
unsigned int xdata Adcout[10]={0};	//AD保存的结果
unsigned char xdata Adctimes=0;

unsigned char xdata HighPass=0;	//高通截止频率
unsigned char xdata LowPass=0; //低通截止频率


sbit FILTERSEL=P3^3;//int1 切换滤波器
sbit DbSel=P3^0;//RXD

double xdata Result[21]=0;
unsigned char xdata RSN=0;

void RootMenu()
{
	Lcd_clear();
	Disp_char(0,'1');
	Disp_words(1,"菜单一",3);
	Disp_char(16,'2');
	Disp_words(9,"菜单二",3);
	Disp_char(32,'3');
	Disp_words(17,"菜单三",3);
	Disp_char(48,'4');
	Disp_words(25,"菜单四",3);
	Cursor_Reset();
	Delay(1000);
}

		void SubMenu1()
		{
			Lcd_clear();
			Disp_char(0,'1');
			Disp_words(1,"放大器设置",5);
			Disp_char(16,'2');
			Disp_words(9,"低通滤波器",5);
			Disp_char(32,'3');
			Disp_words(17,"高通滤波器",5);
			Disp_char(48,'4');
			Disp_words(25,"幅频测试",4);
			Cursor_Reset();
			Delay(2000);
		}
			      void Sub11Disp()
				  {
				  Lcd_clear();
				  Disp_words(1,"增益设置",4);
				  Delay(2000);
				  }
				  void Sub11Op()	//	执行操作时应给出相应的提示信息
				  {

				  }
				  void Sub12Disp()
				  {
				  FILTERSEL=0;//低通滤波器
				  Lcd_clear();
				  Disp_words(1,"截止频率步进",6);
				  Delay(2000);
				  }
				  void Sub12Op()
				  {
				  Lcd_clear();
				  Disp_words(1,"截止频率为",5);			
				  Delay(2000);
				  DbSel=0;
				  LowPass++;
				  if((LowPass<20)||(LowPass==20))
				  {
				  	if((LowPass==17)||(LowPass==18)||(LowPass==19)||(LowPass==20))
					DbSel=1;
				  DDS9851_ComputeFreqWord(LowPass*100000,DDS9851FreTab);
				  DDS9851_WriteFreqWord(DDS9851FreTab);
				  Delay(2000);
				  }
				  else 
				      {LowPass=0;DbSel=0;}
				  Disp_number(16,LowPass);
				  Disp_chars(19,"KHz",3);
				  }
				  void Sub13Disp()
				  {
				  FILTERSEL=1;//高通滤波器
				  Lcd_clear();
				  Disp_words(1,"截至频率步进",6);
				  Delay(2000);
				  Hips();
				  }
				  void Sub13Op()
				  {	
				  Lcd_clear();
				  Disp_words(1,"截止频率为",5);
				  Delay(2000);
				  HighPass++;
				  if((HighPass<20)||(HighPass==20))
				  {
				  DDS9851_ComputeFreqWord(HighPass*56000,DDS9851FreTab);
				  DDS9851_WriteFreqWord(DDS9851FreTab);
				  Delay(2000);
				  }
				  else HighPass=0;
				  Disp_number(16,HighPass);
				  Disp_chars(19,"KHz",3);
				  }
				  void Sub14Disp()
				  {
				  Lcd_clear();
				  Disp_words(1,"扫频准备",4);
				  Delay(2000);
				  }
				  void Sub14Op()
				  {
				  	Lcd_clear();
				  	Disp_words(1,"扫频开始",4);	
					Delay(2000);
					AMP=~2;
					ChFr=100;
					RSN=0;
					ADCCON1= 0x9c;
					ADCCON2= 0x04;//选择通道4
					EADC = 1;
					CCONV = 1;
				  }
		
		
		void SubMenu2()
		{
			Lcd_clear();
			Disp_char(0,'1');
			Disp_words(1,"子菜单二一",5);
			Disp_char(16,'2');
			Disp_words(9,"子菜单二二",5);
			Disp_char(32,'3');
			Disp_words(17,"子菜单二三",5);
			Disp_char(48,'4');
			Disp_words(25,"子菜单二四",5);
			Cursor_Reset();
			Delay(2000);
		}
			      void Sub21Disp()
				  {
				  Lcd_clear();
				  Disp_words(1,"请输入频率",5);
				  Delay(2000);
				  }
				  void Sub21Op()
				  {
				  }
				  void Sub22Disp()
				  {
				  Lcd_clear();
				  Disp_words(1,"请输入幅度",5);
				  Delay(2000);
				  }
				  void Sub22Op()
				  {
				  }
				  void Sub23Disp()
				  {
				  }
				  void Sub23Op()
				  {
				  }
				  void Sub24Disp()
				  {
				  }
				  void Sub24Op()
				  {
				  }

		void SubMenu3()
		{
			Lcd_clear();
			Disp_char(0,'1');
			Disp_words(1,"子菜单三一",5);
			Disp_char(16,'2');
			Disp_words(9,"子菜单三二",5);
			Disp_char(32,'3');
			Disp_words(17,"子菜单三三",5);
			Disp_char(48,'4');
			Disp_words(25,"子菜单三四",5);
			Cursor_Reset();
			Delay(2000);
		}
			      void Sub31Disp()
				  {
				  }
				  void Sub31Op()
				  {
				  }
				  void Sub32Disp()
				  {
				  }
				  void Sub32Op()
				  {
				  }
				  void Sub33Disp()
				  {
				  }
				  void Sub33Op()
				  {
				  }
				  void Sub34Disp()
				  {
				  }
				  void Sub34Op()
				  {
				  }


		void SubMenu4()
		{
			Lcd_clear();
			Disp_char(0,'1');
			Disp_words(1,"子菜单四一",5);
			Disp_char(16,'2');
			Disp_words(9,"子菜单四二",5);
			Disp_char(32,'3');
			Disp_words(17,"子菜单四三",5);
			Disp_char(48,'4');
			Disp_words(25,"子菜单四四",5);
			Cursor_Reset();
			Delay(2000);
		}
			      void Sub41Disp()
				  {}
				  void Sub41Op()
				  {
				  }
				  void Sub42Disp()
				  {}
				  void Sub42Op()
				  {
				  }
				  void Sub43Disp()
				  {}
				  void Sub43Op()
				  {
				  }
				  void Sub44Disp()
				  {}
				  void Sub44Op()
				  {
				  }


/************************************************************************
*
*
*							以下为复用数字键1
*					选择NumKeyBuffer[N]作为菜单的子菜单一的输入缓存
*                 需要时,自行在相应的菜单case语句中添加变量缓存数据
*
***************************************************************************/
void Key1Func()
{
	//按键代码
	if(Confirm==0) 			//表示还没有按下确认键的操作,也就是根菜单的选择
	{
		Cursor_Set(0);
		Menu=1;	
		MenuSelect=1;
	}
	if(Confirm==1) 			//第一层菜单的选择
	{
		Cursor_Set(0);
		SubMenu=1;
		SubMenuSelect=1;	
	}
	if(Confirm==3)
	{
				switch(Menu)				   //选择子菜单进入
				{
				case 1:
						switch(SubMenu)
						{
						case 1:					   //选择NumKeyBuffer[N]作为菜单的子菜单一的输入缓存
								{				   //NumKeyTimes表示按下子菜单一数字键的次数
								Disp_chars(16,"10",2);
								Disp_chars(19,"DB",2);
								Delay(2000);
								AMP=~0;
								}
						break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 2:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 3:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 4:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				}
	}	
}
/************************************************************************
*
*
*							以下为复用数字键2
*					选择NumKeyBuffer[N]作为菜单的子菜单一的输入缓存
*                 需要时,自行在相应的菜单case语句中添加变量缓存数据
*
***************************************************************************/	
void Key2Func()
{
	//按键代码
	if(Confirm==0)
	{
		Cursor_Set(8);	
		Menu=2;	
		MenuSelect=1;
	}
	if(Confirm==1) 			//第一层菜单的选择
	{
		Cursor_Set(8);
		SubMenu=2;
		SubMenuSelect=1;	
	}
	if(Confirm==3)
	{
				switch(Menu)				   //选择子菜单进入
				{
				case 1:
						switch(SubMenu)
						{
						case 1:
								{
								Disp_chars(16,"20",2);
								Disp_chars(19,"DB",2);
								Delay(2000);
								AMP=~1;
								}
						break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 2:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 3:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 4:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				}
	}	
}
/************************************************************************
*
*
*							以下为复用数字键3
*					选择NumKeyBuffer[N]作为菜单的子菜单一的输入缓存
*                 需要时,自行在相应的菜单case语句中添加变量缓存数据
*
***************************************************************************/	
void Key3Func()
{
	//按键代码
	if(Confirm==0)
	{
		Cursor_Set(16);	
		Menu=3;
		MenuSelect=1;	
	}
	if(Confirm==1) 			//第一层菜单的选择
	{
		Cursor_Set(16);
		SubMenu=3;
		SubMenuSelect=1;	
	}
	if(Confirm==3)
	{
				switch(Menu)				   //选择子菜单进入
				{
				case 1:
						switch(SubMenu)
						{
						case 1:
								{
								Disp_chars(16,"30",2);
								Disp_chars(19,"DB",2);
								Delay(2000);
								AMP=~2;
								}
						break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 2:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 3:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 4:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				}
	}	
}
/************************************************************************
*
*
*							以下为复用数字键4
*					选择NumKeyBuffer[N]作为菜单的子菜单一的输入缓存
*                 需要时,自行在相应的菜单case语句中添加变量缓存数据
*
***************************************************************************/	
void Key4Func()
{
	//按键代码
	if(Confirm==0)
	{
		Cursor_Set(24);	
		Menu=4;	
		MenuSelect=1;
	}
	if(Confirm==1) 			//第一层菜单的选择
	{
		Cursor_Set(24);
		SubMenu=4;
		SubMenuSelect=1;	
	}
	if(Confirm==3)
	{
				switch(Menu)				   //选择子菜单进入
				{
				case 1:
						switch(SubMenu)
						{
						case 1:
								{
								Disp_chars(16,"40",2);
								Disp_chars(19,"DB",2);
								Delay(2000);
								AMP=~3;
								}
						break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 2:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 3:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 4:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				}
	}	
}
/************************************************************************
*
*
*							以下为复用数字键5
*					选择NumKeyBuffer[N]作为菜单的子菜单一的输入缓存
*                 需要时,自行在相应的菜单case语句中添加变量缓存数据
*
***************************************************************************/	
void Key5Func()
{
	//按键代码
	if(Confirm==3)
	{
				switch(Menu)				   //选择子菜单进入
				{
				case 1:
						switch(SubMenu)
						{
						case 1:
								{
								Disp_chars(16,"50",2);
								Disp_chars(19,"DB",2);
								Delay(2000);
								AMP=~4;
								}
						break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 2:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 3:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;
						}
				break;
				case 4:
						switch(SubMenu)
						{
						case 1:break;
						case 2:break;
						case 3:break;
						case 4:break;

⌨️ 快捷键说明

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