📄 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 + -