此程序?qū)崿F(xiàn)計(jì)時(shí)秒表功能,時(shí)鐘顯示范圍0000~999秒,分辨度秒

        發(fā)布時(shí)間:2020-10-04 來(lái)源: 事跡材料 點(diǎn)擊:

         //此程序?qū)崿F(xiàn)計(jì)時(shí)秒表功能,時(shí)鐘顯示范圍 00.00~99.99 秒,分辨度:0.01 秒

         #include "p18f458.h"

         unsigned

         char

         s[4];

          //定義 0.01 秒、0.1 秒、1 秒、10 秒計(jì)時(shí)器 unsigned

         char

         k,data,sreg; unsigned

         int i; const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};

          //不帶小數(shù)點(diǎn)的顯示段碼表 const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};

          //帶小數(shù)點(diǎn)的顯示段碼表

         void clkint(void);

         //TMR0 初始化子程序 void tmint() {

         T0CON=0XCF;

         //設(shè)定TMR0L 工作于8 位定時(shí)器方式

         //內(nèi)部時(shí)鐘,TMR0 不用分頻

         INTCON=0X20;

          //總中斷禁止,TMR0 中斷允許,清除TMR0 的中斷標(biāo)志

         0IP=1;

         //TMR0 中斷高優(yōu)先級(jí)

         =1;

          //使能中斷優(yōu)先級(jí) }

         //系統(tǒng)其它部分初始化子程序 void initial() {

         TRISA=0x00;

         //A 口設(shè)置為輸出

         TRISB=0XF0;

         //RB1 輸出,RB4 輸入

         TRISC=0x00;

         //SDO 引腳為輸出,SCK 引腳為輸出

         TRISE=0x00;

         //E 口設(shè)置為輸出

         SSPCON1=0x30;

          //SSPEN=1;CKP=1,F(xiàn)OSC/4

         SSPSTAT=0xC0;

          //時(shí)鐘下降沿發(fā)送數(shù)據(jù)

         PIR1=0;

          //清除 SSPIF 標(biāo)志

         data=0X00;

         //待顯示的寄存器賦初值

         1=0;

         3=0;

         PORTE=0;

         //將 K1,K2,K3,K4 四條列線置 0

         }

         //SPI 傳輸數(shù)據(jù)子程序 void

          SPILED(char data) {

         SSPBUF=data;

         //啟動(dòng)發(fā)送

         do

         {

         ;

         }while(==0);

         =0; }

         //顯示子程序,顯示 4 位數(shù) void dispaly() {

         5=0;

          //準(zhǔn)備鎖存

         for(k=0;k<4;k++)

         {

          data=s[k];

          if(k==2) data=table0[data];

         //個(gè)位需要顯示小數(shù)點(diǎn)

          else data=table[data];

          SPILED(data);

          //發(fā)送顯示段碼

         }

         for(k=0;k<4;k++)

         {

          data=0xFF;

          SPILED(data);

          //連續(xù)發(fā)送4 個(gè)DARK,使顯示好看一些

         }

         5=1;

          //最后給鎖存信號(hào),代表顯示任務(wù)完成 }

         //軟件延時(shí)子程序 void

         DELAY() {

         for(i = 3553; --i ;)

         continue; }

          //鍵掃描子程序 void KEYSCAN() {

         while(1)

         {

          dispaly();

          //調(diào)用一次顯示子程序

          while(4==0)

         {

         DELAY();

          //若有鍵按下,則軟件延時(shí)

          break;

          }

          if (4==0) break;

         //若還有鍵按下,則終止循環(huán)掃描,返回

          } }

         //等鍵松開子程序 void keyrelax() {

         while(1)

         {

          dispaly();

          //調(diào)用一次顯示子程序

          if (4==1) break;

         //為防止按鍵過(guò)于靈敏,每次等鍵松開才返回

         }

          }

         /*高優(yōu)先級(jí)中斷向量*/ #pragma code InterruptVectorHigh=0x08 void InterruptVectorHigh (void) {

          _asm

          goto clkint

          //跳到中斷程序

          _endasm }

         //中斷服務(wù)程序 #pragma code #pragma interrupt clkint

         void clkint() {

         TMR0=0X13;

          //對(duì)TMR0 寫入一個(gè)調(diào)整值。因?yàn)閷懭隩MR0 后接著的

          //兩個(gè)周期不能增量,中斷需要 3 個(gè)周期的響應(yīng)時(shí)間,

          //以及 C 語(yǔ)言自動(dòng)進(jìn)行現(xiàn)場(chǎng)保護(hù)要消耗周期

         INTCONbits.T0IF=0;

         //清除中斷標(biāo)志

         sreg=sreg+1;

          //中斷計(jì)數(shù)器加1

         if(sreg==40)

          //中斷次數(shù)為 40 后,才對(duì) S0,S1,S2,S3 操作

         {

          sreg=0;

          s[0]=s[0]+1;

          if(s[0]==10)

          {

         s[0]=0 ;

         s[1]=s[1]+1;

         if(s[1]==10)

         {

          s[1]=0 ;

          s[2]=s[2]+1;

          if(s[2]==10)

          {

         s[2]=0;

         s[3]=s[3]+1;

         if(s[3]==10) s[3]=0;

          }

         }

          }

         } }

         //主程序 main() {

         tmint();

          //TMR0 初始化

         initial();

          //spi 顯示初始化及系統(tǒng)其它部分初始化

         =0;

          //總中斷禁止

         while(1)

         {

         for(k=0;k<4;k++)

          {

         s[k]=0;

          }

          sreg=0;

         //賦顯示初值

          dispaly();

         //調(diào)用一次顯示子程序

          KEYSCAN();

          //鍵掃描,直到開始鍵按下

          keyrelax();

          //等鍵松開

          =1;

         //總中斷允許

          KEYSCAN();

          //鍵掃描直到停止鍵按下,在鍵掃描時(shí)有顯示

          keyrelax();

          //等鍵松開

          =0;

         //總中斷禁止

          KEYSCAN();

          //鍵掃描到清 0 鍵按下,在鍵掃描時(shí)有顯示

         keyrelax();

          //等鍵松開

         } }

        相關(guān)熱詞搜索:秒表 計(jì)時(shí) 時(shí)鐘

        版權(quán)所有 蒲公英文摘 www.zuancaijixie.com
        91啦在线播放,特级一级全黄毛片免费,国产中文一区,亚洲国产一成人久久精品