//__________________________________________________________________________________ //版权:温州电子开发实验室 夏德仙 www.rf315.net //用途: TC1297控制程序 //创建日期:2006 //最后修改日期: //编译环境: Keil uVision3 V8.08a //___________________________________________________________________________________ #include #define DELAY_TIME 5 #define TRUE 1 #define FALSE 0 #define SLAW 0xca /*器件地址(写)*/ sbit SCL=P1^3; sbit SDA=P1^4; /*TC1297II2Cbus*/ sbit MSCL=P2^7; sbit MSDA=P2^6; /*24c02IICbus*/ sbit prog=P1^5; sbit freq=P1^6; sbit ps=P1^7; sbit tpgs=P3^3; sbit psa=P3^4; sbit wo=P3^5; sbit inc=P3^6; sbit dec=P3^7; unsigned char code LED_S[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; unsigned char code LED_D[]={0xc1,0xc2,0xc4,0xc8,0xd0,0xe0}; unsigned char bdata C1=0x86,C2=0x08,PD1=0x24,PD2=0xf4; sbit N1=PD2^4; sbit N2=PD2^5; sbit N3=PD2^6; sbit N4=PD2^7; sbit N5=PD1^0; sbit N6=PD1^1; sbit N7=PD1^2; sbit N8=PD1^3; sbit N9=PD1^4; sbit N10=PD1^5; sbit TSG=PD1^6; sbit FA0=C2^3; sbit FA1=C2^4; sbit PSA=C2^6; sbit WO=C2^7; sbit LE=C1^0; sbit PS0=C1^1; sbit PS1=C1^2; sbit PS2=C1^3; unsigned char data t,dis_d[6],conc,digit,t; unsigned char data prog_c,freq_c; unsigned int freq_vco=471; bit t_flag,prog_k,key_b,freq_k; /*定时器1中断*/ //4mS扫描一次数码管 void time1(void) interrupt 3 using 1 { TH1=0xf0; TL1=0x60; if(++t==100) { t=0; t_flag=~t_flag; } if(++digit>=6) { digit=0; } P0=LED_S[dis_d[digit]]; if(t_flag&&digit==(conc-1)) P0=0xff; P2=LED_D[digit]; } /******************** Function Definition 函数定义 *************************/ /*延时函数*/ void DELAY(unsigned char t) { while(t!=0) t--; } /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ void I2C_Start(void) { SCL=0; DELAY(DELAY_TIME); SDA=1; SCL=1; DELAY(DELAY_TIME); SDA=0; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/ void I2C_Stop(void) { SDA=0; SCL=1; DELAY(DELAY_TIME); SDA=1; DELAY(DELAY_TIME); //SCL=0; //DELAY(DELAY_TIME); } /*发送0,在SCL为高电平时使SDA信号为低*/ void SEND_0(void) /* SEND UNACK */ { SDA=0; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } /*发送1,在SCL为高电平时使SDA信号为高*/ void SEND_1(void) { SDA=1; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } /*发送完一个字节后检验设备的应答信号*/ bit Check_Acknowledge(void) { bit F0; SDA=1; SCL=1; DELAY(DELAY_TIME); F0=SDA; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); if(F0==1) return FALSE; return TRUE; } /*主控器发送停止信号前发送的非应答信号*/ /* void Send_UnAcknowledge(void) { SDA=0; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); }*/ /*向I2C总线写一个字节*/ void WriteI2CByte(unsigned char b)//reentrant { unsigned char i; for(i=0;i<8;i++) { if((b<0;i--) { for(j=255;j>0;j--); } } //按键处理程序 void key(void) { unsigned char temp; if(!prog) delay(); if(!prog) { prog_k=~prog_k; conc=1; if(!prog_k) { conc=0; } while(!prog); } if(!inc&&prog_k) delay(); if(!inc&&prog_k) { if(++prog_c>6) prog_c=1; P1=(prog_c-1)|0xf8; dis_d[0]=prog_c; while(!inc); } if(!dec&&prog_k) delay(); if(!dec&&prog_k) { if(--prog_c<=0) prog_c=6; P1=(prog_c-1)|0xf8; dis_d[0]=prog_c; while(!dec); } if(!freq) delay(); if(!freq) { freq_k=1; if(++freq_c>3) { freq_c=0; freq_k=0; } conc=freq_c+1; if(!freq_k) conc=0; while(!freq); } if(!inc&&freq_k) delay(); if(!inc&&freq_k) { switch(freq_c) { case 1: { freq_vco+=100; if(freq_vco>855) { freq_vco=471; } } break; case 2: { freq_vco+=10; if(freq_vco>855) { freq_vco=471; } } break; case 3: { freq_vco+=1; if(freq_vco>855) { freq_vco=471; } } break; } dis_d[0]=prog_c; dis_d[1]=freq_vco/100; temp=freq_vco%100; dis_d[2]=temp/10; dis_d[3]=temp%10; dis_d[4]=2; dis_d[5]=5; N1=(bit)freq_vco&0x01; N2=(bit)freq_vco&0x02; N3=(bit)freq_vco&0x04; N4=(bit)freq_vco&0x08; N5=(bit)freq_vco&0x10; N6=(bit)freq_vco&0x20; N7=(bit)freq_vco&0x40; N8=(bit)freq_vco&0x80; N9=(bit)freq_vco&0x100; N10=(bit)freq_vco&0x200; key_b=1; while(!inc); } if(!dec&&freq_k) { switch(freq_c) { case 1: { freq_vco-=100; if(freq_vco<471) { freq_vco=855; } } break; case 2: { freq_vco-=10; if(freq_vco<471) { freq_vco=855; } } break; case 3: { freq_vco-=1; if(freq_vco<471) { freq_vco=855; } } break; } dis_d[0]=prog_c; dis_d[1]=freq_vco/100; temp=freq_vco%100; dis_d[2]=temp/10; dis_d[3]=temp%10; dis_d[4]=2; dis_d[5]=5; N1=(bit)freq_vco&0x01; N2=(bit)freq_vco&0x02; N3=(bit)freq_vco&0x04; N4=(bit)freq_vco&0x08; N5=(bit)freq_vco&0x10; N6=(bit)freq_vco&0x20; N7=(bit)freq_vco&0x40; N8=(bit)freq_vco&0x80; N9=(bit)freq_vco&0x100; N10=(bit)freq_vco&0x200; key_b=1; while(!dec); } } /************************main函数***********************************/ void main() { bit se=0; unsigned char sdata[5]; sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; TMOD=0x10; TH1=0xf0; TL1=0x60; EA=1; ET1=1; TR1=1; N1=1; N2=1; N3=1; N4=1; N5=1; N6=0; N7=1; N8=0; N9=0; N10=1; FA1=1; PSA=1; P1=0xf8;delay(); sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; while(!se) { se=Write_One_Byte(sdata); } N1=1; N2=1; N3=1; N4=1; N5=0; N6=1; N7=1; N8=0; N9=0; N10=1; PSA=1; P1=0xf9;delay(); sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; se=0; while(!se) { se=Write_One_Byte(sdata); } N1=1; N2=1; N3=1; N4=1; N5=1; N6=1; N7=1; N8=0; N9=0; N10=1; PSA=1; P1=0xfa;delay(); sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; se=0; while(!se) { se=Write_One_Byte(sdata); } N1=1; N2=1; N3=1; N4=1; N5=0; N6=0; N7=0; N8=1; N9=0; N10=1; PSA=1; P1=0xfb;delay(); sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; se=0; while(!se) { se=Write_One_Byte(sdata); } N1=1; N2=1; N3=1; N4=1; N5=1; N6=0; N7=0; N8=1; N9=0; N10=1; PSA=1; P1=0xfc; delay(); sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; se=0; while(!se) { se=Write_One_Byte(sdata); } N1=1; N2=1; N3=1; N4=1; N5=0; N6=1; N7=0; N8=1; N9=0; N10=1; PSA=1; P1=0xfd; delay(); sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; se=0; while(!se) { se=Write_One_Byte(sdata); } while(1) { key(); if(0) { key_b=0; sdata[0]=C1; sdata[1]=C2; sdata[2]=PD1; sdata[3]=PD2; sdata[4]='#'; while(!se) { se=Write_One_Byte(sdata); } } } } /*************************programme end****************************************/