📄 chengkonglvbo.c
字号:
//按键是低电平表示按下去,确认键作为就是做完作品中四个按键中的模式选择键//
#include<reg51.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define unit unsigned int
unsigned char code dis[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--f,不显示
unsigned char code shibie[8]={0x98,0x8c,0xb6,0x86,0xc6,0xc7,0x88,0x89};//符号q,p,三,E,【,L,A,H//
uchar key;
uchar key_moshi=2; //模式键 (本程序中以后好像没有用到过)
uchar key_plus=2; //下调键
uchar key_subb=2; //上调键
uchar queren=2; //确认键
uchar qiehuan=2; //高低通切换键
uchar time;
uchar once;
uchar once2;
int key_first_flag=-1; //0放大 1低通 2高通
int flag=-1;
int quren_flag=0;//确认标志
int qiehuan_flag0=0; //切换标志
int fangda[2]; //放大
int lvbo[3]; //低通滤波 显示数组
int hvbo[3]; //高通滤波 显示数组
sbit cs= P3^7; //接数字电位器
sbit sclk= P2^6; //接数字电位器
sbit si= P2^7; //接数字电位器
sbit F_ge=P2^2; //放大显示的个位
sbit F_shi=P2^1; //放大显示的十位
sbit F_bai=P2^0; //放大显示的百位
sbit L_ge=P2^5; //低通显示的各位
sbit L_shi=P2^4; //低通显示的十位
sbit L_bai=P2^3; //低通显示的百位
sbit A0=P3^0; //接262
sbit A1=P3^1; //接262
sbit A2=P3^2; //接262
sbit A3=P3^3; //接262
sbit D0=P3^5; //接262
sbit D1=P3^4; //接262
sbit WR_262=P3^6; //接262
/************************************
延时子程序
*************************************/
void delay(unsigned char time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<50;j++);
}
/************************************
延时子程序
*************************************/
void delay2(unsigned char time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<5;j++);
}
/************************************
延时子程序
*************************************/
void delay1(unsigned char time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<800;j++);
}
/******************************************************************/
/*************************************
模式选择 放大模式 滤波模式
************************************/
void MOSHI_set_program(void)
{
if(key_moshi==0)
{
key_moshi=1;
delay(2); //消抖延时
key_first_flag++;
if(key_first_flag>3)
{
key_first_flag=0;
}
}
}
/*******************************************
放大设置 增加 减少
******************************************/
void key_plus_fangda( ) //放大的上升键
{
if(key_first_flag==0&&key_plus==0&&quren_flag==0) //放大
{
key_plus=1;
delay(2); //消抖延时
fangda[1]++;
if (fangda[1]>6) fangda[1]=0;
}
}
void key_subb_fangda( ) //放大下调键
{
if(key_first_flag==0&&key_subb==0&&quren_flag==0) //放大
{
key_subb=1;
delay(2); //消抖延时
fangda[1]--;
if (fangda[1]<0) fangda[1]=6;
}
}
/*******************************************
滤波低通 增加 减少
******************************************/
void key_plus_lvbo( )
{
if(key_first_flag==1&&key_plus==0) //低通滤波上调键
{
key_plus=1;
delay(1); //消抖延时
lvbo[0]++;
if(lvbo[0]>9)
{
lvbo[0]=0;
lvbo[1]++ ;
}
lvbo[2]=lvbo[0]+lvbo[1]*10 ;
if(lvbo[2]>20) {lvbo[0]=0;lvbo[1]=0;}
}
}
void key_subb_lvbo( )
{
if(key_first_flag==1&&key_subb==0) //低通滤波下调键
{
key_subb=1;
delay(1); //消抖延时
lvbo[0]--;
if(lvbo[0]<0)
{
lvbo[0]=9;
lvbo[1]-- ;
if(lvbo[1]<0) lvbo[1]=2;
}
lvbo[2]=lvbo[0]+lvbo[1]*10 ;
if(lvbo[2]==29) {lvbo[0]=0;lvbo[1]=2;}
}
}
/*******************************************
滤波高通 增加 减少
******************************************/
void key_plus_hvbo( )
{
if(key_first_flag==2&&key_plus==0) //高通上调键
{
key_plus=1;
delay(2); //消抖延时
hvbo[0]++;
if(hvbo[0]>9)
{
hvbo[0]=0;
hvbo[1]++ ;
}
hvbo[2]=hvbo[0]+hvbo[1]*10 ;
if(hvbo[2]>20) {hvbo[0]=0;hvbo[1]=0;}
}
}
void key_subb_hvbo( )
{
if(key_first_flag==2&&key_subb==0) //高通下调键
{
key_subb=1;
delay(2); //消抖延时
hvbo[0]--;
if(hvbo[0]<0)
{
hvbo[0]=9;
hvbo[1]-- ;
if(hvbo[1]<0) hvbo[1]=2;
}
hvbo[2]=hvbo[0]+hvbo[1]*10 ;
if(hvbo[2]==29) {hvbo[0]=0;hvbo[1]=2;}
}
}
/************************************
确认按键
********************************/
void key_quren_flag()
{
if(queren==0)
{
delay(10);
queren=1;
quren_flag++;
if(quren_flag>1) { quren_flag=0; key_first_flag=0; }
}
}
/************************************
切换按键
********************************/
void key_qiehuan_flag()
{
if(qiehuan==0)
{
qiehuan=1;
qiehuan_flag0++;
if( qiehuan_flag0 >1 ){ qiehuan_flag0 =0;}
}
}
/*************************************
显示
***************************************/
void Dispaly()
{
/******************************
开机初始化 显示
*********************************/
if (key_first_flag==-1 )
{
F_ge=0;
F_shi=0;
L_ge=0;
L_shi=0;
L_bai=0;
F_bai=1;
P0=shibie[0];
delay(1) ;
F_bai=0;
L_bai=1;
P0=shibie[1];
delay(1) ;
L_bai=0;
}
/********************************
放大设置 显示
*********************************/
else if (key_first_flag==0 )
{
F_ge=1;
P0=dis[0]; //个位显示0
delay(1) ;
F_ge=0;
F_shi=1;
P0=dis[fangda[1]];
delay(1);
F_shi=0;
F_bai=1;
P0=shibie[2];
delay(1) ;
F_bai=0;
}
/********************************
确认 放大倍数
*******************************/
if (quren_flag==1 )
{
F_ge=1;
P0=dis[0];
delay(1) ;
F_ge=0;
F_shi=1;
P0=dis[fangda[1]];
delay(1);
F_shi=0;
F_bai=1;
P0=shibie[3];
delay(1) ;
F_bai=0;
}
/********************************
低通 设置 显示
***********************************/
else if (key_first_flag==1 )
{
L_ge=1;
P0= dis[lvbo[0]];
delay(1) ;
L_ge=0;
L_shi=1;
P0= dis[lvbo[1]];
delay(1) ;
L_shi=0;
L_bai=1;
P0=shibie[4] ;
delay(1) ;
L_bai=0;
}
/*****************************
低通 确认
***************************************/
if (quren_flag==1&&qiehuan_flag0==0 )
{
L_ge=1;
P0= dis[lvbo[0]];
delay(1) ;
L_ge=0;
L_shi=1;
P0= dis[lvbo[1]];
delay(1) ;
L_shi=0;
L_bai=1;
P0=shibie[5];
delay(1) ;
L_bai=0;
}
/**********************************
高通设置 显示
***********************************/
else if (key_first_flag==2) //高通也是用L_ge等的原因是因为高低通是同样的数码管显示
{
L_ge=1;
P0= dis[hvbo[0]];
delay(1) ;
L_ge=0;
L_shi=1;
P0= dis[hvbo[1]];
delay(1) ;
L_shi=0;
L_bai=1;
P0=shibie[6] ;
delay(1) ;
L_bai=0;
}
/***************************************
高通确认
***************************************/
if (quren_flag==1&&qiehuan_flag0==1)
{
L_ge=1;
P0= dis[hvbo[0]];
delay(1) ;
L_ge=0;
L_shi=1;
P0= dis[hvbo[1]];
delay(1) ;
L_shi=0;
L_bai=1;
P0=shibie[7];
delay(1) ;
L_bai=0;
}
}
/****************************************
中断初始化 定时器1
******************************************/
void initial()
{
TMOD=0X11;
TR1=0;
TH1=0XD8;
TL1=0XF0;
TR1=1;
ET1=1;
EA=1;
}
/********************************
定时器1中断操作 定时器的作用未知?
*********************************/
timer1_display () interrupt 3
{
Dispaly() ;
TH1=0Xe5;
TL1=0XF0;
TR1=1;
}
//按键消除抖动延时程序
void delays(uchar h)
{
uchar i;
for(i=h;i>0;i--);
}
uchar keyscan(void) //键盘扫描程序
{
uchar scode,recode;
P1=0XF0; // 列置为1,用此来判断是否有键按下
if((P1&0XF0)!=0XF0) //不相等说明可能有键按下去
{
delay1(25);//消除按键抖动
if((P1&0XF0)!=0XF0) // 去抖动后仍然不相等,说明有键按下
{
scode=0xfe; //实逐行扫描,即只给一行赋0,其它行都为1
while((scode&0x01)!=0x10)//判断是否扫描到了最后一行
{
P1=scode;//输出行扫描
if((P1&0XF0)!=0XF0) //说明本行有键按下,此时是从单片机中读入此时的数据
{
recode=(P1&0XF0)|0X0F;//求出列扫描码,既按键所在的列
return((~scode)+(~recode));//返回按键代码
}
else scode=(scode<<=1)|0x01;//扫描下一行
}
}
}
return(0); //如果没有按键按下,返回0
}
void read_key() //读出键盘的值
{
uchar key;
key=keyscan(); //键盘扫描
delay(5); //按键消除抖动
switch(key)
{
case 0x11: key_moshi=0;break;
case 0x21: qiehuan=0;break;
case 0x41: key_subb=0;break;
case 0x81: key_plus=0;break;
}
}
/*****************************************
MCP4110 数字电位器设定电阻
******************************************/
void write_mcp4110( uchar command,uchar m_data )
{
uchar i,j,k;
cs=1;
sclk=1;
for(k=0;k<10;k++);//延时
cs=0;
sclk=0;
for(k=0;k<10;k++);//延时
for(i=0;i<8;i++)
{
if(command&0x80) si=1;
else si=0;
sclk=0;
for(k=0;k<10;k++);//延时
sclk=1;
for(k=0;k<10;k++);//延时
command= command<<1;
}
for(j=0;j<8;j++)
{
if(m_data&0x80) si=1;
else si=0;
sclk=0;
for(k=0;k<10;k++);//延时
sclk=1;
for(k=0;k<10;k++);//延时
m_data= m_data<<1;
}
sclk=1;
cs=1;
}
void max262_addr(uchar i) //对MAX262进行设定
{
if(i==0) {A3=0;A2=0;A1=0;A0=0; }
else if(i==1){A3=0;A2=0;A1=0;A0=1; }
else if(i==2){A3=0;A2=0;A1=1;A0=0; }
else if(i==3){A3=0;A2=0;A1=1;A0=1; }
else if(i==4){A3=0;A2=1;A1=0;A0=0; }
else if(i==5){A3=0;A2=1;A1=0;A0=1; }
else if(i==6){A3=0;A2=1;A1=1;A0=0; }
else if(i==7){A3=0;A2=1;A1=1;A0=1; }
else if(i==8){A3=1;A2=0;A1=0;A0=0; }
else if(i==9){A3=1;A2=0;A1=0;A0=1; }
else if(i==10){A3=1;A2=0;A1=1;A0=0; }
else if(i==11){A3=1;A2=0;A1=1;A0=1; }
else if(i==12){A3=1;A2=1;A1=0;A0=0; }
else if(i==13){A3=1;A2=1;A1=0;A0=1; }
else if(i==14){A3=1;A2=1;A1=1;A0=0; }
else if(i==15){A3=1;A2=1;A1=1;A0=1; }
}
void D0D1_WITRE(uchar num0,uchar num1) //对MAX262的D0 D1写入数据
{
if (num0==1) D0=1;
else if (num0==0) D0=0;
if (num1==1) D1=1;
else if (num1==0) D1=0;
}
void lvbo_A_1() //262滤波器A为低通
{
WR_262=1;
for (time=0;time++;time<20) ;
max262_addr(0) ; //滤波器A方式1选择
D0D1_WITRE(1,0) ; //
for (time=0;time++;time<20) ;
WR_262=0 ;
for (time=0;time++;time<50) ;
WR_262=1;
for (time=0;time++;time<20) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -