#include<reg52.h>
#include <I2C.H>
#define PCF8591 0x90 //PCF8591 地址
#define uchar unsigned char
#define uint unsigned int
sbit EN=P3^5;
sbit oe=P1^3;
sbit dula=P1^4;
sbit wela=P1^5;
uchar seat=6,wave=0;//按键功能选择值
data uchar test[4]={1,0,2,0};//存储按键值
uchar sled_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义点亮数码管位选码
data uchar disp[8]={5,1,15,0,0,0,1,0};
uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴极数码管显示段码(0-F)
void ConfigTimer0(unsigned int ms);
void SetWaveFreq(unsigned char freq);
unsigned char code SinWave[] = { //正弦波波表
127, 152, 176, 198, 217, 233, 245, 252,
255, 252, 245, 233, 217, 198, 176, 152,
127, 102, 78, 56, 37, 21, 9, 2,
0, 2, 9, 21, 37, 56, 78, 102,
};
unsigned char code SawWave[] = { //锯齿波表
0, 8, 16, 24, 32, 40, 48, 56,
64, 72, 80, 88, 96, 104, 112, 120,
128, 136, 144, 152, 160, 168, 176, 184,
192, 200, 208, 216, 224, 232, 240, 248,
};
unsigned char a=0,b=0,c=0,num=10,func=6,set=0;
static unsigned char i = 0;
//static unsigned char q=0;
unsigned char Vpp;
static unsigned char fWave; //波形频率
unsigned char code *pWave; //波表指针
unsigned char T0RH = 0; //T0重载值的高字节
unsigned char T0RL = 0; //T0重载值的低字节
unsigned char T1RH = 1; //T1重载值的高字节
unsigned char T1RL = 1; //T1重载值的低字节
void KeyDriver();
extern void KeyScan();
/*(void delay(unsigned int i)
{
// uint j;
// for(j=0;j<250;j++)
while(i--);
}*/
void delay1( n ) //延时函数
data uchar n;
{ data uchar m;
while(n--)
for(m=0;m<1;m++);
}
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送控制字节
if(ack==0)return(0);
SendByte(Val); //发送DAC的数值
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
void main(void)
{
IT0=1;
// EX0=1;
EA=1;
EN=0;
P2=0xff;
TMOD=0x11;
TH0 = (65536-300)/ 256;
TL0 = (65536-300)% 256;
ET0 = 1; //开放定时器1中断控制位
TR0 = 1;
pWave = SinWave;
fWave=test[0]*10+test[1];
SetWaveFreq(fWave);
while(1)
{
KeyDriver();
}
}
void KeyDriver()
{
static unsigned char q=0;
KeyScan();
if(func==0)
{
delay1(20);
if(func==0)
{
if(num>=0&&num<=9)
{
if(q==0)
{
test[0]=num;
}
else if(q==1)
{
test[2]=num;
}
disp[6]=num;
num=16;
}
}
}
else if(func==1)
{
delay1(20);
if(func==1)
{
if(num>=0&&num<=9)
{
if(q==0)
{
test[1]=num;
}
else if(q==1)
{
test[3]=num;
}
disp[7]=num;
num=16;
}
}
}
else if(func==4)
{
delay1(20);
if(func==4)
{
q=q+1;
if(q>2)
q=0;
if(q==0)
{
disp[2]=15;
disp[6]=test[0];
disp[7]=test[1];
}
else if(q==1)
{
disp[2]=10;
disp[6]=test[2];
disp[7]=test[3];
}
func=6;
}
}
else if(func==3)
{
delay1(20);
if(func==3)
{
wave=wave+1;
pWave = SawWave;
func=6;
if(wave>=2)
{
wave=0;
pWave = SinWave;
}
disp[1]=wave+1;
num=16;
}
}
fWave=(test[0]*10+test[1]);
Vpp=(test[2]*10+test[3]);
// SetWaveFreq(fWave);
}
void KeyScan(void)
{
// unsigned char a=0,b=0,c=0,num;
P2=0xf0;
delay1(10);
P2=0xf0;
delay1(10);
a=P2;
P2=0x0f;
delay1(10);
P2=0x0f;
delay1(10);
b=P2;
a=a|b;
if(a!=0xff)
{while(P2!=0x0f);
switch(a)
{
case 0xee: num=0; break;//0
case 0xde: num=1; break;//1
case 0xbe: num=2; break;//2
case 0x7e: num=3; break;//3
case 0xed: num=4; break;//4
case 0xdd: num=5; break;//5
case 0xbd: num=6; break;//6
case 0x7d: num=7; break;//7
case 0xdb: num=8; break;//8
case 0xbb: num=9; break;//9
case 0xeb: func=0; break;//左
case 0x7b: func=1; break;//右
case 0xe7: func=2; break;//设置
case 0xd7: func=3; break;//选波
case 0xb7: func=4; break;//选参
case 0x77: func=5; break;//确认
}
// KeyDriver();
}
}
void SetWaveFreq(unsigned char freq)
{
unsigned long tmp;
tmp = (12059200/12)/(freq * 32);
tmp = 65536 - tmp;
tmp = tmp + 33;
T1RH = (unsigned char)(tmp >> 8);
T1RL = (unsigned char)tmp/2;
TMOD &= 0x0F;
TMOD |= 0X10;
TH1 = T1RH;
TL1 = T1RL;
ET1 = 1;
PT1 = 1;
TR1 = 1;
}
void InterruptTimer1() interrupt 3
{
static unsigned char i = 0;
TH1 = T1RH;
TL1 = T1RL;
SetWaveFreq(fWave);
DACconversion(PCF8591,0x40,pWave[i]*Vpp/50);
i++;
if (i >= 32)
{
i = 0;
}
}
void InterruptTimer0(void) interrupt 1
{
uchar k;
static uchar j=0;
TH0=(65536-250)/256;
TL0=(65536-250)%256;
oe=1; // 关闭2个573输出,防止在送数据时相互影响
k = disp[j]; // 每次显示ar[j]的数据
P0 = table[k]; // 相应显示数字段码
dula=1;
dula=0; // 锁存段码
if(func==0&&set<=100)
{
sled_bit[6]=0xbf;
}
else if(func==0&&set>100)
{
sled_bit[6]=0xff;
}
if(func==1&&set<=100)
{
sled_bit[7]=0x7f;
}
else if(func==1&&set>100)
{
sled_bit[7]=0xff;
}
P0=sled_bit[j]; // 选择相应数码管位选
wela=1;
wela=0; // 锁存位码
oe=0; // 打开2个573三态门,输出段码和位码
j++; // 为下一个显示做准备
if(j>=8)j=0;
set++;
if(set>=200)set=0;
}