此程序?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)掃描,返回
} }
//等鍵松開(kāi)子程序 void keyrelax() {
while(1)
{
dispaly();
//調(diào)用一次顯示子程序
if (4==1) break;
//為防止按鍵過(guò)于靈敏,每次等鍵松開(kāi)才返回
}
}
/*高優(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 寫(xiě)入一個(gè)調(diào)整值。因?yàn)閷?xiě)入TMR0 后接著的
//兩個(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();
//鍵掃描,直到開(kāi)始鍵按下
keyrelax();
//等鍵松開(kāi)
=1;
//總中斷允許
KEYSCAN();
//鍵掃描直到停止鍵按下,在鍵掃描時(shí)有顯示
keyrelax();
//等鍵松開(kāi)
=0;
//總中斷禁止
KEYSCAN();
//鍵掃描到清 0 鍵按下,在鍵掃描時(shí)有顯示
keyrelax();
//等鍵松開(kāi)
} }
相關(guān)熱詞搜索:秒表 計(jì)時(shí) 時(shí)鐘
熱點(diǎn)文章閱讀