• <menu id="ugcm4"><strong id="ugcm4"></strong></menu>
  • 技術熱線: 4007-888-234

    PIC單片機C語言編程實例三

    更新時間: 2019-01-05
    閱讀量:1748

    秒 表
    7.2.2 程序清單
    該源程序已在實驗板上調試通過,讀者可直接引用,并可利用軟件編程的靈活性,加以拓展,實現更為復雜的功能。

    include

    include

    //此程序實現計時秒表功能,時鐘顯示范圍00.00~99.99秒,分辨度:0.01秒
    unsigned char s0,s1,s2,s3;
    //定義0.01 秒、0.1 秒、1秒、10秒計時器
    unsigned char s[4];
    unsigned char k ,data ,sreg;
    unsigned int i;
    const table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
    //不帶小數點的顯示段碼表
    const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
    //帶小數點的顯示段碼表
    //TMR0初始化子程序
    void tmint()
    {
    T0CS=0; //TMR0工作于定時器方式
    PSA=1; //TMR0不用分頻
    T0IF=0; //清除TMR0的中斷標志
    T0IE=1; //TMR0中斷允許
    }
    //spi顯示初始化子程序
    void SPIINIT()
    {
    PIR1=0;
    SSPCON=0x30;
    SSPSTAT=0xC0;
    //設置SPI的控制方式,允許SSP方式,并且時鐘下降沿發送。與”74HC595,當其
    //SCLK從低到高跳變時,串行輸入寄存器”的特點相對應
    TRISC=0xD7; //SDO引腳為輸出,SCK引腳為輸出
    TRISA5=0; //RA5引腳置為輸出,輸出顯示鎖存信號
    }
    //系統其它部分初始化子程序
    void initial()
    {
    TRISB1=0;
    TRISB2=0;
    TRISB4=1;
    TRISB5=1; //設置與鍵盤有關的各口的輸入輸出方式
    RB1=0;
    RB2=0; //建立鍵盤掃描的初始條件
    }
    //SPI傳輸數據子程序
    void SPILED(data)
    {
    SSPBUF=data; //啟動發送
    do {
    ;
    }while(SSPIF==0);
    SSPIF=0;
    }
    //顯示子程序,顯示4位數
    void dispaly()
    {
    RA5=0; //準備鎖存
    for(k=4;k>0;k—)
    {
    data=s[k-1];
    if(k==3) data=table0[data];//第二位需要顯示小數點
    else data=table[data];
    SPILED(data); //發送顯示段碼
    }
    for(k=0;k<4;k++)
    {
    data=0xFF;
    SPILED(data); //連續發送4個DARK,使顯示好看一些
    }
    RA5=1; //最后給鎖存信號,代表顯示任務完成
    }
    //軟件延時子程序
    void DELAY()
    {
    for(i = 3553; —i ;) continue;
    }
    //鍵掃描子程序
    void KEYSCAN()
    {
    while(1){
    while(1)
    {
    dispaly(); //調用一次顯示子程序
    if ((RB5==0)||(RB4==0)) break;
    }
    DELAY(); //若有鍵按下,則軟件延時
    if ((RB5==0)||(RB4==0)) break;//若還有鍵按下,則終止循環掃描,返回
    }
    }
    //等鍵松開子程序
    void keyrelax()
    {
    while(1){
    dispaly(); //調用一次顯示子程序
    if ((RB5==1)&&(RB4==1)) break;
    } //為防止按鍵過于靈敏,每次等鍵松開才返回
    }
    //系統賦值初始化子程序
    void inizhi()
    {
    s0=0x00;
    s[0]=s0;
    s1=0x00;
    s[1]=s1;
    s2=0x00;
    s[2]=s2;
    s3=0x00;
    s[3]=s3; //s0=s1=s2=s3=0,并放入顯示緩沖數組中
    sreg=0x00; //tmr0中斷次數寄存器清0
    }
    //中斷服務程序
    void interrupt clkint(void)
    {
    TMR0=0X13; //對TMR0寫入一個調整值。因為寫入TMR0后接著的
    //兩個周期不能增量,中斷需要3個周期的響應時間,
    //以及C語言自動進行現場保護要消耗周期
    T0IF=0; //清除中斷標志
    CLRWDT();
    sreg=sreg+1; //中斷計數器加1
    if(sreg==40) //中斷次數為40后,才對S0,S1,S2,S3 操作
    {
    sreg=0;
    s0=s0+1;
    if(s0==10){
    s0=0 ;
    s1=s1+1;
    if(s1==10){
    s1=0 ;
    s2=s2+1;
    if(s2==10){
    s2=0;
    s3=s3+1;
    if(s3==10) s3=0 ;
    }
    }
    }
    }
    s[0]=s0;
    s[1]=s1;
    s[2]=s2;
    s[3]=s3;
    }
    //主程序
    main()
    {
    OPTION=0XFF;
    tmint(); //TMR0初始化
    SPIINIT(); //spi顯示初始化
    initial(); //系統其它部分初始化
    di(); //總中斷禁止
    while(1) {
    inizhi(); //系統賦值初始化
    KEYSCAN(); //鍵掃描,直到開始鍵按下
    keyrelax(); //等鍵松開
    ei(); //總中斷允許
    KEYSCAN(); //鍵掃描直到停止鍵按下,在鍵掃描時有顯示
    keyrelax() ; //等鍵松開
    di(); //總中斷禁止
    KEYSCAN(); //鍵掃描到清0鍵按下,在鍵掃描時有顯示
    keyrelax() ; //等鍵松開
    }
    }

    刺激欲乱狂亲伦
  • <menu id="ugcm4"><strong id="ugcm4"></strong></menu>