📄 51
字号:
}
//-------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//-------------------------------------------------------------------
uchar IICreceiveByte(void)
{
uchar idata n=8; // 从SDA线上读取一上数据字节,共八位
uchar tdata=0;
while(n--)
{
SDA = 1;
SCL = 1;
tdata =tdata<<1; //左移一位
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe; // 否则数据的最后一位置0
SCL = 0;
}
return(tdata);
}
//-------------------------------------------------------------------
// 函数名称: DAC_PCF8591
// 入口参数: slave_add从机地址,n要发送的数据个数
// 函数功能: 发送n位数据子程序
//-------------------------------------------------------------------
void DAC_PCF8591(uchar controlbyte)
{
iic_start(); // 启动I2C
delayNOP();
IICSendByte(PCF8591_WRITE); // 发送地址位
check_ACK(); // 检查应答位
if(flag == 1)
{
SystemError = 1;
return; // 若非应答,置错误标志位
}
IICSendByte(controlbyte&0x77); //Control byte
check_ACK(); //检查应答位
if(flag == 1)
{
SystemError = 1;
return; // 若非应答,置错误标志位
}
}
//-------------------------------------------------------------------
// 函数名称: ADC_PCF8591
// 入口参数: controlbyte控制字
// 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
//-------------------------------------------------------------------
/*
void ADC_PCF8591(uchar controlbyte)
{
uchar idata i; //,receive_da;
iic_start();
IICSendByte(PCF8591_WRITE); //控制字
check_ACK();
if(flag == 1)
{
SystemError = 1;
return;
}
IICSendByte(controlbyte); //控制字
check_ACK();
if(flag == 1)
{
SystemError = 1;
return;
}
iic_start(); //重新发送开始命令
IICSendByte(PCF8591_READ); //控制字
check_ACK();
if(flag == 1)
{
SystemError = 1;
return;
}
IICreceiveByte(); //空读一次,调整读顺序
slave_ACK(); //收到一个字节后发送一个应答位
// while(i<4)
for(i=0;i<4;i++)
{
// receive_da=IICreceiveByte();
// receivebuf[i]=receive_da;
receivebuf[i] = IICreceiveByte();
slave_ACK(); //收到一个字节后发送一个应答位
}
slave_NOACK(); //收到最后一个字节后发送一个非应答位
iic_stop();
}*/
/*********************************************************
输出三角波
*********************************************************/
void Triangle()
{
uchar l;
for(l=0;l<255;l++)
{
IICSendByte(l); //data byte
check_ACK(); //检查应答位
if(flag == 1)
{
SystemError = 1;
return; //置错误标志位SystemError
}
}
for(l=255;l>1;l--)
{
IICSendByte(l); //data byte
check_ACK(); //检查应答位
if(flag == 1)
{
SystemError = 1;
return; //置错误标志位SystemError
}
}
}
/*********************************************************
输出方波函数
*********************************************************/
void Square()
{
IICSendByte(N); //data byte
check_ACK(); //检查应答位
if(flag == 1)
{
SystemError = 1;
return; //置错误标志位SystemError
}
delay(15);
N=~N;
}
/*********************************************************
输出正弦波函数
*********************************************************/
void sin()
{
uint i;
for(i=0; i<256; i++)
{
IICSendByte(sin_tab[i]); //data byte
check_ACK(); //检查应答位
if(flag == 1)
{
SystemError = 1;
return; //置错误标志位SystemError
}
}
}
/*********************************************************
输出锯齿波函数
*********************************************************/
void Sawtooth()
{
uchar l;
for(l=0;l<255;l++)
{
IICSendByte(l); //data byte
check_ACK(); //检查应答位
if(flag == 1)
{
SystemError = 1;
return; //置错误标志位SystemError
}
}
}
/*********************************************************
功能健函数
*********************************************************/
void keyscan()
{
uchar m;
if((K2==0)&(!START)) //启动输出后,屏蔽K2健
{
k_count++;
beep();
switch (k_count)
{
case 1:
lcd_pos(0x00);
for(m=0;m<16;m++)
lcd_wdat(dis2[m]);
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(dis5[m]);
out1=1;
out4=0;
break;
case 2:
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(dis6[m]);
out1=0;
out2=1;
break;
case 3:
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(dis7[m]);
out2=0;
out3=1;
break;
case 4:
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(dis8[m]);
k_count=0;
out3=0;
out4=1;
break;
default:
out4=0; out3=0; out2=0; out1=0;
break;
}
}
if(K3==0) //启动输出
{
START=1;
beep();
}
if(K4==0) //停止输出
{
START=0;
beep();
}
}
/*******************************************************************/
/* */
/* 主函数 */
/* */
/*******************************************************************/
main()
{
uchar i;
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行
for(i=0;i<16;i++)
lcd_wdat(dis1[i]); //显示字符
lcd_pos(0x40); //设置显示位置为第二行
for(i=0;i<16;i++)
lcd_wdat(dis2[i]); //显示字符
delay(1500);
lcd_pos(0); //设置显示位置为第一行
for(i=0;i<16;i++)
lcd_wdat(dis3[i]); //显示字符
lcd_pos(0x40); //设置显示位置为第二行
for(i=0;i<16;i++)
lcd_wdat(dis4[i]); //显示字符
DAC_PCF8591(0x40);
while(1)
{
keyscan();
while(out1&START)
{
sin(); //输出正弦波
keyscan();
}
while(out2&START)
{
Square(); //输出方波
keyscan();
}
while(out3&START)
{
Triangle(); //输出三角波
keyscan();
}
while(out4&START)
{
Sawtooth(); //输出锯齿波
keyscan();
}
}
}
//*********************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -