电子元器件原材料
采购信息平台

手机洽洽

扫一扫下载客户端
随时随地,生意尽握手中

PIC16F72定时器C程序

来源:华强电子网 作者:华仔 浏览:793

标签:

摘要: >//*APPLICATIONNOTEE6000ICEXPLORER*************** //*Title:FORcolk_timewww、picavr、com* //*Version:00* //*LastUpdated:2006.06.29* //*MCU:PIC16F72* //***************************************************

>//*APPLICATIONNOTEE6000ICEXPLORER***************
//*Title:FORcolk_timewww、picavr、com*
//*Version:00*
//*LastUpdated:2006.06.29*
//*MCU:PIC16F72*
//***************************************************
//****ROMPCLATH.D3=0000H-7FFH;
//PCLATH.D3=1800H-FFFH;
//***************************************************
//**RAMBANK0=20H---7FHSTATUSRP0=0,RP1=0*
//**BANK1=A0H---FFHSTATUSRP0=1,RP1=0*
//***************************************************
//__________________
//MCLR/VPP/TH-|128|-RB7/PGD
//RA0/AN0-|227|-RB6/PGC
//RA1/AN1-|326|-RB5
//RA2/AN2/VRref--|425|-RB4
//RA3/AN3/VRref+-|524|-RB3/PGM
//RA4/TOCKI-|623|-RB2
//RA5/AN4/SS-|722|-RB1
//VSS-|821|-RB0/INT
//OSC1/CLKIN-|920|-VDD
//OSC2/CLKOUT-|1019|-VSS
//RC0/TISO/TICKI-|1118|-RC7/RX/DT
//RC1/T1OSI/CCP2-|1217|-RC6/TX/CK
//RC2/CCP1-|1316|-RC5/SDO
//RC3/SCK/SCL-|1415|-RC4/SDA
//|________________|
//16F72
//***************************************************
#include//
#include//
#include//
#defineucharunsignedchar//
#defineuintunsignedint//
//------------------------------------------
#defineKEY_UPRC1//
#defineKEY_DOWNRA4//
#defineKEY_SETRC2// www、picavr、com
//------------------------------------------
voidcom_buf(void);//
voiddisplay(void);//
voidbuf_initial(void);//
voidad_program(void);//
voidadd_colk(void);//
voidkeywork1(void);//
voidPORT_DATA(void);//
voidsub_colk(void);//
voidtimr0int(void);//
voidcolk_stt(void);//
//------------------------------------------
staticvolatileunsignedcharADRES@0x1E;
staticvolatileunsignedcharFLAG1@0x20;//可位寻址的状态寄存器

staticvolatilebitSET@(unsigned)&FLAG1*8+2;//
staticvolatilebitUP@(unsigned)&FLAG1*8+1;//
staticvolatilebitDOWN@(unsigned)&FLAG1*8+0;//
//----------------------------------------------------
staticbitB_JIAN0,B_JIAN1,B_JIAN2,B_JIAN3,B_ON,B_OFF,B_BUF,B_ADD;
staticbitB_DP,B_COM,B_END;//
unsignedcharbuf[4];//
unsignedchark,data,sreg,disppoint,msec,sec,ad_buf,SEL,spbuf;//
unsignedcharT_ON0,T_ON1,T_ON2,T_ON3,T_OFF0,T_OFF1,T_OFF2,T_OFF3;//
unsignedcharcolk0,colk1,colk2,colk3;//
unsignedinti,kcon1,kcon2,PORT_BUF;//
constchartable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};//
//*********************************
/*延时函数*/
//*********************************
voiddelay_10ms()//
{uintj;//
for(j=0;j<300;j++)//
{;}//
}//
//*********************************
voiddelay_50us()//
{ucharj;//
for(j=0;j<20;j++)//
{;}//
}//
//=================================
//延时最大255毫秒
//=================================
voiddelay_ms(ucharms)//
{
uchari,j;//
for(j=0;jfor(i=0;i<86;i++)//
{
#asm//
nop//
nop//
#endasm//
}
}
//==================================


//**********************************
voiddelay_1s()//延时1S
{
uintj;//
for(j=0;j<200;j++);//
{
display();//
keywork1();//
}
}
//********************************
voidds_sp()//报警程序
{
uchari;//
uintj;//
for(i=0;i<100;i++)//
{
for(j=0;j<20;j++);//
{
display();//
keywork1();//
}
RA2=!RA2;//
}
RA2=0;//
}
//*********************************
voidsp()//
{
uchari;//
for(i=0;i<20;i++)//
{
if(B_END==1)
{
B_COM=1;//
return;//
}
ds_sp();//
delay_1s();//
}
}
//*******************************
//显示清0程序
//*******************************
voidbuf_initial()//
{
buf[0]=0X00;//
buf[1]=0X00;//
buf[2]=0X00;//
buf[3]=0X00;//
T_ON0=0X00;T_ON1=0X07;T_ON2=0X00;T_ON3=0X00;//
T_OFF0=0X00;T_OFF1=0X07;T_OFF2=0X00;T_OFF3=0X05;//
sreg=0x00;//
msec=0x00;//
}//
//**********************************

//**********************************
voidput_num(charc)
{
PORTB=table[c&0x0f];//
RB7=0;//
if(B_DP==0)//
{
RB7=1;//
}
}
//*********************************

//**********************************
//显示子程序
//**********************************
voiddisplay()//
{
disppoint=0;//
put_num(buf[disppoint]);//
RC4=0;//
delay_ms(1);//
RC4=1;//

disppoint++;//
put_num(buf[disppoint]);//
RC5=0;//
delay_ms(1);//
RC5=1;//
CLRWDT();//
disppoint++;//
put_num(buf[disppoint]);//
RC6=0;//
delay_ms(1);//
RC6=1;//

disppoint++;//
put_num(buf[disppoint]);//
RC7=0;//
delay_ms(1);//
RC7=1;//
}
//*********************************

//*********************************
//AD转换初始化子程序//
//*********************************
voidad_program()//
{
TRISA=0XFF;//
ADCON1=0B00000010;//AN0-AN4=AVREF=VDD
PIE1=0;//

ADCON0=0B01001001;//fosc/8RA1/AN1ADON=1
INTCON=0;//
ADIF=0;//
ADRES=0;//
delay_50us();//
ADGO=1;//GODONE=1
while(ADIF==0);//
{
;
}//
ad_buf=ADRES;//
ADCON1=0B00000111;//RA0-RA5=D
TRISA=0X38;//RA3-RA5=IN
ADCON0=0B00000000;//fosc/2RA0/AN0ADON=0
}
//*********************************


//*********************************
//tmr0初始化子程序
//*********************************
voidtimr0int()
{
T0CS=0;//tmr0工作于定时器方式
PSA=1;//tmr0不用分频
T0IF=0;//清除tmr0的中断标志
T0IE=1;//tmr0中断允许
}
//**********************************


//**********************************
//按键等待程序
//**********************************
voidkeywait()//
{
while((PORTC&0x06)!=0x06)//
{
display();//
}//
}//
//**********************************
voidkeywait1()//
{
while((PORTA&0x10)!=0x10)//
{
display();//
}//
}//
//************************************

//*****************************************
//当前时间与开机,关机时间比较
//*****************************************
voidcom_buf()
{//
if((T_ON0==buf[0])&&(T_ON1==buf[1])&&(T_ON2==buf[2])&&(T_ON3==buf[3]))//
{//
RC3=1;return;//
}//

elseif((T_OFF0==buf[0])&&(T_OFF1==buf[1])&&(T_OFF2==buf[2])&&(T_OFF3==buf[3]))
{
RC3=0;//
B_COM=1;//
sp();//
return;//
}//
}//
//******************************************


//******************************************
//时钟显示程序
//******************************************
voidadd_colk()
{
CLRWDT();//
buf[3]++;//
B_COM=0;//
B_END=0;//
if(buf[3]>9)//
{
buf[3]=0;//
buf[2]++;//
if(buf[2]>5)//
{
buf[2]=0;//
buf[1]++;//
//----------------------------------
if(buf[1]==4)//
{
if(buf[0]==2)
{
buf[0]=0;//
buf[1]=0;//
return;//
}
return;//
}
//----------------------------------
elseif(buf[1]>9)
{
buf[1]=0;//
buf[0]++;//
}
}
}
}
//**********************************

//**********************************
voidsub_colk()
{
CLRWDT();//
if(buf[3]!=0)//
{
buf[3]--;//
return;//
}
buf[3]=9;
if(buf[2]!=0)//
{
buf[2]--;//
return;//
}
buf[2]=5;
if(buf[1]!=0)//
{
buf[1]--;//
return;//
}
buf[1]=9;
if(buf[0]!=0)//
{
buf[0]--;//
return;//
}
buf[1]=3;//
buf[0]=2;//
}
//***************************************************
voidcolk_to_time_on()
{
T_ON0=buf[0];T_ON1=buf[1];T_ON2=buf[2];T_ON3=buf[3];//
}
//---------------------------------------------------
voidcolk_to_time_off()
{
T_OFF0=buf[0];T_OFF1=buf[1];T_OFF2=buf[2];T_OFF3=buf[3];//
}
//---------------------------------------------------
voidcolk_to_disp_buf()
{
colk0=buf[0];colk1=buf[1];colk2=buf[2];colk3=buf[3];//
}
//***************************************************
voidcolk_stt()
{
CLRWDT();//
if(RC2==0)//
{
B_ADD=1;//
}
if(RC1==0)
{
B_ADD=0;//
}
//-----------------------------------
if(B_ON==1)
{
if(B_ADD==0)//
{
add_colk();//
colk_to_time_on();//
return;
}
sub_colk();//
colk_to_time_on();//
return;
}
//------------------------------------
if(B_OFF==1)
{
if(B_ADD==0)//
{
add_colk();//
colk_to_time_off();//
return;
}
sub_colk();
colk_to_time_off();//
return;
}
//------------------------------------------
if(B_BUF==1)
{
if(B_ADD==0)//
{
add_colk();//
colk_to_disp_buf();//
return;
}
sub_colk();//
colk_to_disp_buf();//
return;
}
}
//*********************************************
voidPORT_DATA()
{
TRISC=0X01;//RC7--RC1清0为输出,RC0置1为输入
RA0=1;//开LED显示
PORTC=PORT_BUF;//按键扫描完成后恢复I/O口状态
}
//*********************************************
//按键处理子程序//
//*********************************************
voidkeywork1()
{
PORT_BUF=PORTC;//在按键扫描期间保护I/O口状态
TRISC=0X07;//RC0,RC1,RC2置1为输入
RC1=1;RC2=1;//RC1,RC2置1
RA0=0;//关LED显示
if(B_JIAN1==1)//连加标志位B_JIAN1=1
{
//-------------------------------------------------------
JIAN_add:if(B_JIAN0==0)//按键按下时间为3S后置B_JIAN0=1,B_JIAN1=0为点动按键
{
if(B_JIAN1==0)//B_JIAN1=1时,计算第一次按下的时间,B_JIAN1=0为点动按键
{
delay_10ms();
if((RC2==0)||(RC1==0))
{
B_JIAN1=1;//KEY_UP按下,B_JIAN1=1
CLRWDT();//
//______________________________________________________
JIAN_add1:if((RC2==0)||(RC1==0))//
{
if(RC2==0)//
{
B_ADD=1;//时间减标志位
}
if(RC1==0)//
{
B_ADD=0;//时间加标志位
}
if((--kcon1)==0)//
{
kcon1=500;//设置第一次按键的计数值
B_JIAN0=1;//
colk_stt();//时间加
PORT_DATA();//
return;//子程序返回
}
else
{
PORT_DATA();//
return;//子程序返回
}
}
B_JIAN0=0;B_JIAN1=0;B_JIAN2=0;B_JIAN3=0;//清除按键标志位
colk_stt();//时间+1
PORT_DATA();//
return;//子程序返回
}
else
{
PORT_DATA();//
return;//子程序返回
}
}
gotoJIAN_add1;//B_JIAN1=1时,转JIAN_add1计算RB7按下的时间
//_________________________________________________________________________
}
if((RC2==0)||(RC1==0))//
{
//_________________________________________
if((--kcon1)==0)//
{
kcon1=20;//设置按键连加时的速度计数值
colk_stt();//
PORT_DATA();//
return;//子程序返回
}
else
{
PORT_DATA();//
return;//子程序返回
}
}
B_JIAN0=0;B_JIAN1=0;B_JIAN2=0;B_JIAN3=0;
PORT_DATA();///
return;
}
//---------------------------------------------
elseif((RC2==0)||(RC1==0))//比较KEY_UP键按下否
{
gotoJIAN_add;//RB7=0,KEY_UP按下,转到连加处JIAN_ADD
}
//----------------------------------------------
elseif((PORTA&0x10)!=0x10)//重读P1.2-P1.4位,若还是不全为1,定有键按下
{
delay_10ms();
if((PORTA&0x10)!=0x10)
{
di();//
B_DP=0;B_COM=1;B_END=1;//
SEL++;//
if(SEL==0X01)//
{
keywait1();//
TRISC=0X01;//
RA0=1;//开LED显示
RC1=0;RC2=1;//

buf[0]=T_ON0;buf[1]=T_ON1;buf[2]=T_ON2;buf[3]=T_ON3;//
B_ON=1;B_OFF=0,B_BUF=0;//
return;
}
if(SEL==0X02)
{
keywait1();//
TRISC=0X01;//
RA0=1;//开LED显示
RC1=1;RC2=0;//

buf[0]=T_OFF0;buf[1]=T_OFF1;buf[2]=T_OFF2;buf[3]=T_OFF3;//
B_ON=0;B_OFF=1,B_BUF=0;//
return;
}
if(SEL==0X03)
{
keywait1();
TRISC=0X01;//
RA0=1;//开LED显示
RC1=1;RC2=1;//

buf[0]=colk0;buf[1]=colk1;buf[2]=colk2;buf[3]=colk3;//
SEL=0x00;sreg=0x00;msec=0x00;sec=0x00;B_ON=0;B_OFF=0,B_BUF=1;//
ei();//开总中断
TMR0=0X15;//TMR0置初值
return;
}

}
}
//----------------------------------------------------------
B_JIAN0=0;B_JIAN1=0;B_JIAN2=0;B_JIAN3=0;//清除按键标志位
kcon1=20;//
PORT_DATA();//
CLRWDT();//
}
//***********************************************************

//***********************************************************
//按键处理子程序//
//***********************************************************
voidkeywork()//
{
if((PORTC&0x06)!=0x06)//如果P1.2--P1.4不为全1,可能有键按下
{
delay_10ms();//延时去抖动
if((PORTC&0x06)!=0x06)//重读P1.2-P1.4位,若还是不全为1,定有键按下
{
//----------------------------------
if(KEY_SET==0)//按下SET键,如在SET状态就退出,否则进入
{
keywait();
ei();//
TMR0=0X08;//
return;//
}
elseif(KEY_UP==0)//按下UP键
{
keywait();//
buf_initial();//
di();//
return;
}
}
}
elseif((PORTA&0x10)!=0x10)//如果P1.2--P1.4不为全1,可能有键按下
{
delay_10ms();//延时去抖动
if((PORTA&0x10)!=0x10)//重读P1.2-P1.4位,若还是不全为1,定有键按下
{
di();//
keywait1();//
add_colk();//
return;
}
}
}
//*******************************


//*******************************
//******Tmr0中断程序***********
//*******************************
voidinterruptclkint(void)
{
TMR0=0x15;//
T0IF=0;//
CLRWDT();//
sreg=sreg+1;//
if(sreg==40)//
{
sreg=0;//
msec=msec+1;//
if(msec>99)//
{
msec=0;//
B_DP=!B_DP;//
sec=sec+1;//
if(sec>59)//
{
sec=0;//
add_colk();//
}
}
}
}
//*******************************
//主函数
//*******************************
voidmain(void)//
{
OPTION=0;//
STATUS=0;//
ADCON1=0x07;//RA0-RA5=D
INTCON=0;//
PIE1=0;//
PIR1=0;//
T1CON=0;//

TRISA=0x10;//00111000=RA3,RA4,RA5
TRISB=0X00;//
TRISC=0X01;//

PORTB=0x00;//
PORTC=0X07;//
PORTA=0x10;//

B_DP=0;//
B_COM=0;//
B_END=0;//
B_ON=0;B_OFF=0,B_BUF=1;//
timr0int();//
buf_initial();//
di();//
while(1)//
{
CLRWDT();//
display();//
keywork1();//

if(B_COM==0)//
{
com_buf();//
}
}
}

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67
型号/产品名 平均报价 涨跌幅
STM8S003F3P6 1.72 1.12%
74HC573D 0.64 2.86%
2N7002 3.66 400.00%
STM32F103C8T6 7.47 27.87%
1N4007 1.58 0.00%
ADM2483BRWZ 8.90 3.21%
SHT10 16.21 5.88%
LM358 118206.75 16.67%
发布求购