📄 simplestopwatch.c
字号:
/*****************************************************
文件名 :SimpleStopwatch.c **
功能说明:简单秒表,具有记时、累加记时、清零等基本功**
能,记时精度为0.01S,记时范围0.01S~99.99S**
*****************************************************/
#include "p30f6014.h"
#include "SimpleStopwatch.h"
void InitializeSys()
{
INTCON1 = 0x0000; //关中断
INTCON2 = 0x0000;
IEC0 = 0x0000; //IECx中断禁止
IEC1 = 0x0000;
IEC2 = 0x0000;
}
void InitializeSPIOut()
{
TRISF = TRISF&0xfebf; //SCK(RF6)、SDO(RF8)输出
TRISG = TRISG&0xfdff; //LACK(RG9)输出
SPI1CON = 0x0379; // CKP=1,CKE=1,FOSC/32,时钟上升沿发送数据
SPI1STATbits.SPIEN = 1; //SPI1EN=1
IFS0bits.SPI1IF = 0; //清除SPI1IF中断标志
}
void InitializeTMR1()
{
TMR1 = 0; //定时器1计数寄存器TMR1=0
T1CON = 0x0000; //关闭定时器,使用内部时钟,预分频比为1:1
PR1 = 0x4e20; //定时器Timer1周期寄存器PR1=0x4e20,10ms初值
IFS0bits.T1IF = 0; //清除TMR1的中断标志
IPC0bits.T1IP = 7; //中断优先级为7
IEC0bits.T1IE = 1; //使能中断
}
void InitializeKeyboard()
{
TRISD = (TRISD | 0xff00); //将RD8-RD15配置为输入,D0~D7
TRISD = (TRISD & 0xfff8); //RD0-RD2配置为输出,作138译码
PORTD = (PORTD & 0xfff8); //选中KEYA
}
void DealWithKeys()
{
unsigned int i = 0;
if((PORTD&0xff00) == 0xfe00)
{
for(i=0; i<1000; i++); //延时消抖
if((PORTD&0xff00) == 0xfe00)
S1Val = (!S1Val)&0x0001;
while((PORTD&0xff00) == 0xfe00); //不对一次常按按键进行多次采样
}
if((PORTD&0xff00) == 0xfd00)
{
for(i=0; i<1000; i++); //延时消抖
if((PORTD&0xff00) == 0xfd00)
S2Val = (!S2Val)&0x0001;
while((PORTD&0xff00) == 0xfd00); //不对一次常按按键进行多次采样
}
if(S1Val == 0)
T1CONbits.TON = 0; //关闭定时器1
if(S2Val == 1)
{
T1CONbits.TON = 0; //关闭定时器1
for(i=0; i<4; i++)
s[i] = 0; //记时初值清零
S2Val = 0;
}
if((S1Val==1) & (S2Val==0))
T1CONbits.TON = 1; //开定时器1
}
void FormatClock()
{
s[0] += 1;
if(s[0] == 10) //0.1S记时时间到
{
s[1] += 1;
s[0] = 0;
if(s[1] == 10) //1S记时时间到
{
s[2] += 1;
s[1] = 0;
if(s[2] == 10) //10S记时时间到
{
s[3] += 1;
s[2] = 0;
if(s[3] == 10) //100S记时时间到
s[3] = 0;
}
}
}
}
void DisplayOnLED()
{
int j,k,m;
PORTGbits.RG9 = 0; //LACK送低电平,为锁存做准备
for(k=0; k<4; k++) //熄灭前四个数码管
{
SPI1BUF = 0xff;
while(SPI1STATbits.SPITBF == 1);
}
for(j=3; j>=0; j--) //显示记时值
{
m = s[j];
if(j == 2)
{
SPI1BUF = Table1[m];
}
else
SPI1BUF = Table0[m];
while(SPI1STATbits.SPITBF == 1);
}
SPI1BUF = 0xff;
while(SPI1STATbits.SPITBF ==1 );
PORTGbits.RG9 = 1; //给锁存信号,显示数字
}
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
TMR1=0;
IFS0bits.T1IF = 0; //清定时器中断标志
FormatClock(); //处理定时器中断子程序
}
int main()
{
InitializeSys();
InitializeSPIOut();
InitializeKeyboard();
InitializeTMR1();
DisplayOnLED();
while(1)
{
DealWithKeys();
DisplayOnLED();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -