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

📄 main.c

📁 。SSI接口是Stellaris系列ARM都支持的标准外设
💻 C
字号:
#include  "systemInit.h"
#include  <ssi.h>
#include  <timer.h>


#define  PART_LM3S1138
#include  <pin_map.h>


unsigned char dispBuf[8];                                   //  定义显示缓冲区


//  SSI初始化
void ssiInit(void)
{
    unsigned long ulBitRate = TheSysClock / 10;

    SysCtlPeriEnable(SYSCTL_PERIPH_SSI0);                   //  使能SSI模块

    SysCtlPeriEnable(SSI0CLK_PERIPH);                       //  使能SSI0接口所在的GPIO端口
    SysCtlPeriEnable(SSI0FSS_PERIPH);
    SysCtlPeriEnable(SSI0RX_PERIPH);
    SysCtlPeriEnable(SSI0TX_PERIPH);

    GPIOPinTypeSSI(SSI0CLK_PORT, SSI0CLK_PIN);              //  将相关GPIO设置为SSI功能
    GPIOPinTypeSSI(SSI0FSS_PORT, SSI0FSS_PIN);
    GPIOPinTypeSSI(SSI0RX_PORT, SSI0RX_PIN);
    GPIOPinTypeSSI(SSI0TX_PORT, SSI0TX_PIN);

    //  SSI配置:基址,协议格式,主/从模式,位速率,数据宽度
    SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, ulBitRate, 16);

    SSIEnable(SSI0_BASE);                                   //  使能SSI收发
}


//  定时器初始化
void timerInit(void)
{
    unsigned long ulClock = TheSysClock / (60 * 8);         //  扫描速度在60Hz以上时
                                                            //  人眼才不会明显感到闪烁

    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0);                 //  使能Timer模块

    TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);      //  配置为32位周期定时器
    TimerLoadSet(TIMER0_BASE, TIMER_A, ulClock);            //  设置Timer初值

    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);        //  使能Timer超时中断
    IntEnable(INT_TIMER0A);                                 //  使能Timer中断
    IntMasterEnable();                                      //  使能处理器中断
    TimerEnable(TIMER0_BASE, TIMER_A);                      //  使能Timer计数
}


//  动态数码管显示初始化
void dispInit(void)
{
    unsigned short i;

    for (i = 0; i < 8; i++) dispBuf[i] = 0x00;
    ssiInit();
    timerInit();
}


//  在坐标ucX处显示一个数字ucData
void dispDataPut(unsigned char ucX, unsigned char ucData)
{
    dispBuf[ucX & 0x07] = ucData;
}


//  主函数(程序入口)
int main(void)
{
    unsigned char i, x;

    jtagWait();                                             //  防止JTAG失效,重要!
    clockInit();                                            //  时钟初始化:晶振,6MHz
    dispInit();                                             //  动态数码管显示初始化

    for (;;)
    {
        for (i = 0; i < 9; i++)                             //  在数码管上滚动显示0~F
        {
            for (x = 0; x < 8; x++) dispDataPut(x, i+x);
            SysCtlDelay(2000 * (TheSysClock / 3000));
        }
    }
}


//  定时器的中断服务函数
void Timer0A_ISR(void)
{
    const unsigned char SegTab[16] =                        //  定义数码管段选数据
    {
        0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
        0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
    };

    const unsigned char DigTab[8] =                         //  定义数码管位选数据
    {
        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
    };

    static unsigned char n = 0;
    unsigned short t;
    unsigned long ulStatus;

    ulStatus = TimerIntStatus(TIMER0_BASE, true);           //  读取中断状态
    TimerIntClear(TIMER0_BASE, ulStatus);                   //  清除中断状态,重要!

    if (ulStatus & TIMER_TIMA_TIMEOUT)                      //  如果是Timer超时中断
    {
        t = DigTab[n] ^ 0xFF;                               //  获取位选数据
        t <<= 8;                                            //  位选数据放在高8位
        t |= SegTab[dispBuf[n] & 0x0F];                     //  段选数据放在低8位
        SSIDataPut(SSI_BASE, t);                            //  输出数据,共16个有效位

        n++;
        n &= 0x07;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -