|
針對PICC網(wǎng)上的例程少,一些網(wǎng)友發(fā)表的例程格式不標準、注釋不清等對初學(xué)C的朋支們會造成一些誤導(dǎo),我決定把一些曾經(jīng)的例程更改為可在陳老大的實驗板上直接運行的標準PICC的例程,今天特送上PICC時鐘程序:
由于我也和大家一樣都是PICC的初學(xué)者,只能說和大家一起學(xué)習(xí)!
在此還要感謝網(wǎng)友 夢幻空花 的熱情解答!
哪位有空能把前段時間 石魚 版主的精確定時加進去,那將更準確。 /********************************************** 功能說明:利用TMR0中斷掃描數(shù)碼管、產(chǎn)生秒時鐘信號 單片機:PIC16F72、PIC16F877、PIC16F873等 晶振:4MHZ www.dangdangdz.com ************************************************/
#include "pic.h"
unsigned char dispbitcnt; //數(shù)碼管位碼掃描變量 unsigned char second; //秒變量 unsigned char minite; //分變量 unsigned char hour; //時變量 unsigned char tcnt; //秒信號產(chǎn)生變量 unsigned char mstcnt; //掃描時間變量
const unsigned char dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //0123456789段碼 const unsigned char dispbitcode[6]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf}; //123456位碼 unsigned char dispbuf[6]={0,0,0,0,0,0}; //緩沖數(shù)組
//**************TMR0中斷數(shù)碼管掃描程序********************* void interrupt tmr0(void) { if(T0IE && T0IF) { T0IF=0; //清除中斷標志位 { PORTC=dispcode[dispbuf[dispbitcnt]]; PORTA=dispbitcode[dispbitcnt]; dispbitcnt++; if(dispbitcnt==6) {dispbitcnt=0; } } tcnt++; //中斷產(chǎn)生秒信號 if(tcnt==244) {tcnt=0; second++; if(second==60) {second=0; minite++; if(minite==60) {minite=0; hour++; if(hour==24) {hour=0; } } } dispbuf[4]=second%10; dispbuf[5]=second/10; dispbuf[2]=minite%10; dispbuf[3]=minite/10; dispbuf[0]=hour%10; dispbuf[1]=hour/10; } } }
///****************1ms延時程序****************** void delay_1ms(unsigned int i) { unsigned char j; for(;i!=0;i--) for(j=141;j!=0;j--); }
///****************按鍵檢測********************* void key_scan(void) { while(1) { if(RB0==0) { delay_1ms(20); if(RB0==0) {second++; if(second==60) {second=0; } dispbuf[4]=second%10; dispbuf[5]=second/10; while(RB0==0); } } if(RB1==0) { delay_1ms(20); if(RB1==0) { minite++; if(minite==60) {minite=0; } dispbuf[2]=minite%10; dispbuf[3]=minite/10; while(RB1==0); } } if(RB2==0) { delay_1ms(20); if(RB2==0) { hour++; if(hour==24) { hour=0; } } dispbuf[0]=hour%10; dispbuf[1]=hour/10; while(RB2==0); } } }
//***************端口初始化*********************** void PORT_INIT(void) { TRISA=0; //A口輸出 ADCON1=0x06; //數(shù)字I/O TRISC=0; //C口輸出 TRISB=0XFF; //B口輸入 } //***************TMR0初始************************** void TMR0_INIT(void) { GIE=1; //開啟全局中斷 OPTION=0X03; //開啟內(nèi)部上拉,預(yù)分頻比1/16 T0IF=0; //清中斷標志 T0IE=1; //允許TMR0中斷 }
//*************主程序******************** void main(void) { while(1) { dispbitcnt=0; PORT_INIT(); PORTC=0x00; //開段碼 PORTA=0x00; //開位碼 delay_1ms(200); //延時 delay_1ms(200); //延時 delay_1ms(200); //延時 delay_1ms(200); //延時 PORTA=0xff; //關(guān)位碼 TMR0_INIT(); //調(diào)初始子程序 TMR0=0; //開啟TMR0中斷 key_scan(); //按鍵檢測子程序 } }
|