⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplestopwatch.c

📁 《dsPIC通用数字信号控制器原理及应用》源码
💻 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 + -