?? main.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 + -