/******************************************
功能:数控功率放大器
(按相应的按键,数码管显示功率增益)
单片机:AT89S52
数模转换:DAC0832
******************************************/
#include
typedef unsigned int uint ;
typedef unsigned char uchar ;
uchar temp,a,GAIN;
sbit P7=P0^7; // 数码管的接口
sbit P6=P0^6;
sbit P5=P0^5;
sbit P4=P0^4;
sbit DAT=P0^3; //数码管的驱动
sbit CLK=P0^2;
void delay(uint); // 延迟程序
void sendbyte(uchar); // 数码管显示
void display(uint); // 增益显示
uchar keyscan();
uchar code tab[]={
0xed,0x09,0xbc,0x9d,0x59,0xd5,
0xf5,0x0d,0xfd,0xdd,0x7d,0xf1,
0xe4,0xb9,0xf4,0x74,0x00} ; //0-F, 全灭
void main (void)
{
sendbyte(0); //初始时数码管无显示
P1=0x01;
while(1)
{
GAIN = keyscan(); //按键扫描
display(GAIN);
if(GAIN == 0)
{
P1=0x01;
}
if(GAIN == 1)
{
P1=0x01; // 10db
}
if(GAIN == 2)
{
P1=0x02; // 20db
}
if(GAIN == 3)
{
P1=0x07; // 30db
}
if(GAIN == 4)
{
P1=0x15; // 40db
}
if(GAIN == 5)
{
P1=0x43; // 50db
}
if(GAIN == 6)
{
P1=0xd5; // 60db
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void sendbyte(uchar byte)
{
uchar num,c;
num=tab[byte];
for(c=0;c8;c++)
{
CLK=0;
DAT=num0x01;
CLK=1;
num>>=1; //右移位赋值
}
}
void display(uint Gain) //数码管的动态显示子函数
{
P5=0;
P6=0;
P7=0;
sendbyte(Gain);
P4=1;
delay(1);
P4=0;
P6=0;
P7=0;
sendbyte(0); // 0
P5=1;
delay(1);
P4=0;
P5=0;
P7=0;
sendbyte(13); // d
P6=1;
delay(1);
P4=0;
P5=0;
P6=0;
sendbyte(11); // b
P7=1;
delay(1);
}
uchar keyscan()
{
/*第一行按键的扫描*/
P2=0xfe; //确定第一行的按键有效
temp=P2; //将其赋给一个变量(处理I/O口时,一般先赋值给一个变量,然后通过处理变量来处理I/O口)
temp=temp0xf0; //用于检测第一行的哪个按键按下
while(temp!=0xf0) /*这个部分只要是用来消除按下抖动的*/
{
delay(5);
temp=P2;
temp=temp0xf0;
while(temp!=0xf0) //这个地方,已经消除了按下抖动,P2口的值已经确定
{
temp=P2; //将P2口得值赋给变量
switch(temp) //这个switch语句,用来确定哪一个按键按下时,数码管的显示值
{
case 0x7e:a=1;
break; //这个break很重要,表示如果有匹配的值,就跳出switch语句,防止程序跳不出来。
case 0xbe:a=2;
break;
case 0xde:a=3;
break;
case 0xee:a=4;
break;
default : a=0;
break;
}
while(temp!=0xf0) /*这个部分只要是用来消除释放抖动的*/
{
temp=P2;
temp=temp0xf0;
}
}
}
/*第二行按键的扫描*/
P2=0xfd;
temp=P2;
temp=temp0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x7d:a=5;
break;
case 0xbd:a=6;
break;
case 0xdd:a=0;
break;
case 0xed:a=0;
break;
default : a=0;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp0xf0;
}
}
}
return a;
}