📄 suzigongfang.c
字号:
#include <AT89X51.H>
#include<intrins.h>
#include "diver.h"
/*各种显示的级数为十六级显示格式为如下:
**************************************
* VOLUE 13 *
* @@@@@@@@@@@@@@@@@@@@@@@ *
**************************************/
/*延时程序*/
void delay(uchar j)
{
uchar m,n,s;
for(m=j;m>0;m--)
{ for(n=20;n>0;n--)
for(s=248;s>0;s--);}
}
/*数据缓冲*/
void KM(uchar vol) //VOL
{A[0]=0x20;
A[1]=0x20;
A[2]=DC[(vol/100)];
A[3]=DC[((vol%100)/10)];
A[4]=DC[(vol%10)];
}
/*I2C的开始发送程序*/
I2C_start()
{SDA=1;
SCL=1;
_nop_(); _nop_(); _nop_(); _nop_();
SDA=0;
_nop_(); _nop_(); _nop_(); _nop_();
SCL=0;
}
/*I2C的停止发送程序*/
I2C_stop()
{SCL=0;
SDA=0;
_nop_(); _nop_(); _nop_(); _nop_();
SCL=1;
_nop_(); _nop_(); _nop_(); _nop_();
SDA=1;
}
/*I2C等待数码电位
的应答信号*/
wait_ack()
{SDA=1;
_nop_(); _nop_(); _nop_(); _nop_();
SCL=1;
_nop_(); _nop_(); _nop_(); _nop_();
while(SDA==1); //////////////////////////////////
}
/*I2C向数字电位器发送一字节得数据*/
I2C_sendbyte(uchar a)
{
uchar i=8;
while (i--)
{
SCL=0;
_nop_();
SDA=(a&0x80); a<<=1;
_nop_(); _nop_(); _nop_(); _nop_();
SCL=1;
_nop_(); _nop_(); _nop_(); _nop_();
}
SCL=0;
}
/*发送命令到液晶*/
lcd_com(char b)
{_nop_();_nop_();_nop_();_nop_();
RS=0;
RW=0;
E=1;
_nop_();_nop_();_nop_();_nop_();
P0=b;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
E=0;}
/*发送数据到液晶*/
lcd_data(char a)
{_nop_();_nop_();_nop_();_nop_();
RS=1;
RW=0;
E=1;
_nop_();_nop_();_nop_();_nop_();
P0=a;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
E=0;}
/*液晶显示缓冲*/
Lcd_dis(uchar k[],char M) ////////////////////////////////////////////////////////////
{char i,j;
lcd_com(0x01);
delay(1); /////////////////////////////////////
for(i=0;i<M;i++)
{lcd_data(k[i]);
}
for(j=0;j<5;j++)
{lcd_data(A[j]);}
}
/*电源开程序*/
power_on()
{char i;
lcd_com(0x01); //清屏
delay(10);
OFF_ON=0;
lcd_com( 0x0c); //开显示
for(i=0;i<14;i++)
{lcd_data(ONd[i]);}
delay(200);
SPEAK=0;
K=0;
}
/*电源关程序*/ //////////////////////////////////////////////////////////////////
power_off()
{char i;
lcd_com(0x01); //清屏
delay(10);
SPEAK=1;
for(i=0;i<14;i++)
{lcd_data(OFFd[i]);}
delay(244);
OFF_ON=1;
//lcd_com( 0x08);
K=1;}
/*电源开关判断程序*/
offon()
{if(K==1)
{power_on();}
else
{power_off();}
}
/*键盘扫描*/
uchar key(void)
{uchar sccode,recode;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{delay(2); //要更改一下
if((P1&0xf0)!=0xf0)
{sccode=0xfe;
while((sccode&0x10)!=0)
{P1=sccode;
if((P1&0xf0)!=0xf0)
{recode=(P1&0xf0)|0x0f; /************/
P1=0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
P1=0xf0;
return(0);
}
/*I2C发送缓冲*/
I2C_send(uchar a,uchar b,uchar c) //a为器件地址,b为器件内部地址,c为数据
{I2C_start();
I2C_sendbyte(a);
wait_ack();
I2C_sendbyte(b);
wait_ack();
I2C_sendbyte(c);
wait_ack();
I2C_stop();
}
/*左右声道一起增大*/
all_up()
{
if(Vol_R<=254) //////////////hu
{Vol_R++;}
if(Vol_L<=254) //////////////hu
{Vol_L++;}
VOL=((Vol_L/2)+(Vol_R/2));
KM(VOL);
Lcd_dis(VOLUE,7);
I2C_send(0x50,0x12,VOL); //左
I2C_send(0x50,0x11,VOL); //右
}
/*左右声道一起减少*/
all_down()
{
if(Vol_R>0)
{Vol_R--;}
if(Vol_L>0)
{Vol_L--;}
VOL=((Vol_L/2)+(Vol_R/2));
KM(VOL);
Lcd_dis(VOLUE,7);
I2C_send(0x50,0x12,VOL); //左
I2C_send(0x50,0x11,VOL); //右
}
/*右声道高音增大大*/
high_R_up()
{if(High_R<=254) ///////////hu
{High_R++;}
KM(High_R);
Lcd_dis(HR,7);
I2C_send(0x54,0x11,High_R); //右
}
/*左声道高音增大大*/
high_L_up()
{if(High_L<=254) /////////////hu
{High_L++;}
KM(High_L);
Lcd_dis(HL,7);
I2C_send(0x54,0x12,High_L); //左
}
/*左声道高音减少*/
high_L_down()
{if(High_L>0)
{High_L--;}
KM(High_L);
Lcd_dis(HL,7);
I2C_send(0x54,0x12,High_L); //左
}
/*右声道高音减少*/
high_R_down()
{if(High_R>0)
{High_R--;}
KM(High_R);
Lcd_dis(HR,7);
I2C_send(0x54,0x11,High_R); //右
}
/*右声道低音增加*/
bass_R_up()
{if(Bass_R<=254) //////////hu
{Bass_R++;}
KM(Bass_R);
Lcd_dis(BR,7);
I2C_send(0x52,0x11,Bass_R); //右
}
/*左声道低音增加*/
bass_L_up()
{if(Bass_L<=254) ///////////hu
{Bass_L++;}
KM(Bass_L);
Lcd_dis(BL,7);
I2C_send(0x52,0x12,Bass_L); //右
}
/*左声道低音减少*/
bass_L_down()
{if(Bass_L>0)
{Bass_L--;}
KM(Bass_L);
Lcd_dis(BL,7);
I2C_send(0x52,0x12,Bass_L); //右
}
/*右声道低音减少*/
bass_R_down()
{if(Bass_R>0)
{Bass_R--;}
KM(Bass_R);
Lcd_dis(BR,7);
I2C_send(0x52,0x11,Bass_R); //右
}
/*声道平衡右*/
balan_R_down()
{if(Vol_R>0)
{Vol_R--;Vol_L++;} ////////////hu
KM(Vol_R);
Lcd_dis(VR,7);
I2C_send(0x50,0x11,Vol_R); //右
}
/*声道平衡左*/
balan_L_down()
{if(Vol_L>0)
{Vol_L--;Vol_R++;} /////////////hu
KM(Vol_L);
Lcd_dis(VL,7);
I2C_send(0x50,0x12,Vol_L); //左
}
/*键盘扫描缓冲*/
void transfer()
{int j,i;
while(1)
{j=key();
if(j==0x11)
{offon();break;}
else
{switch(j)
{case 0x48:all_up();break; //表值对应
case 0x28:all_down();break;
case 0x41:balan_L_down();break;
case 0x81:balan_R_down();break;
case 0x12:high_L_down();break;
case 0x22:high_L_up();break;
case 0x42:high_R_down();break;
case 0x82:high_R_up();break;
case 0x14:bass_L_down();break;
case 0x24:bass_L_up();break;
case 0x44:bass_R_down();break;
case 0x84:bass_R_up();break;
}
if(S==1)
{S=0;
for(i=0;i<=100;i++)
{delay(1); //要改HU
if((P1&0xf0)==0xf0)break;
}
}
delay(1); //要改HU
if((P1&0xf0)==0xf0)break;
}}}
void sleep()
{if(slp==0)
counter++;
if(counter>65000)
{counter=0;
power_off();
}
if(slp==1)
counter=0;
}
/*主函数*/
main()
{
//液晶显示初此化
lcd_com(0x14);
lcd_com(0x06);
lcd_com(0x18);
lcd_com(0x01);
I2C_send(0x50,0x12,VOL); //左hu
I2C_send(0x50,0x11,VOL); //右hu
P1=0xf0;
while(1)
{if((P1&0xf0)!=0xf0)
{S=1;
transfer();
}
//sleep();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -