📄 exall.c
字号:
#include "VI2C_LM3S101.H"
#include "hw_memmap.h"
#include "hw_types.h"
#include "hw_ints.h"
#include "hw_gpio.h"
#include "src/ssi.h"
#include "src/gpio.h"
#include "src/sysctl.h"
#include "src/timer.h"
#include "src/interrupt.h"
#include "src/uart.h"
#ifndef uchar
#define uchar unsigned char
#endif
// I2C引脚的定义。
#define SDA GPIO_PIN_3 // 模拟I2C数据传送位
#define SCL GPIO_PIN_2 // 模拟I2C时钟控制位
#define CSI24c02 0xA0 // 从机地址
#define writeaddr 0x00 // 对24c02写操作的子地址。
#define readaddr 0x00 // 对24c02读操作的子地址。
#define BitRate 115200 // 设定波特率
#define DataWidth 8 // 设定数据宽度
#define LED1 GPIO_PIN_4 // 定义LED1指示定时器0工作
#define LED2 GPIO_PIN_5 // 定义LED2指示定时器1工作
#define KEY1 GPIO_PIN_1 // 定义KEY1
#define KEY2 GPIO_PIN_3 // 定义KEY2
#define BEEP GPIO_PIN_2 // 定义蜂鸣器
uchar DISP_TAB2[16] = {
0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x81,
0x83, 0x87, 0x8F, 0x9F, 0xDF, 0xFF, 0x80, 0xFF};
static volatile const unsigned char *g_pucBuffer = 0;
static volatile unsigned long g_ulCount = 0;
// 初始化状态选择。
static volatile unsigned long g_ulState = 0;
//----------------------------------------------------------------------------
// 定义待发送的数据串。用户可自定义修改。
//----------------------------------------------------------------------------
static const unsigned char g_pucString[] =
"welcome to http://www.zlgmcu.com\r\n";
static const unsigned char g_pucString1[] =
"please input 0x55 or 'U' and try again!\r\n";
//-----------------------------------------------------------------------------
// 函数原形:void delay(unsigned long d)
// 功能描述:延时数量为 d 个指令周期。
// 参数说明:unsigned long d,将要延时的时间数。
// 返回值:无
//-----------------------------------------------------------------------------
void delay1(unsigned long d)
{
for(;d;d--);
}
void Delays(uchar nom)
{
int i,j;
for(; nom>0; nom--)
{
for(i=0; i<150; i++)
for(j=0; j<255; j++);
}
}
//----------------------------------------------------------------------------
// 函数名称:UARTTxIntHandler()。
// 函数功能:UART发送中断处理程序。
// 输入参数:无。
// 输出参数:无。
//----------------------------------------------------------------------------
void UARTTxIntHandler(void)
{
while(g_ulCount && UARTSpaceAvail(UART0_BASE))
{
UARTCharNonBlockingPut(UART0_BASE, *g_pucBuffer++); // 发送下一个字符。
g_ulCount--; // 发送字符数自减。
}
}
//----------------------------------------------------------------------------
// 函数名称:UARTSend() 。
// 函数功能:向UART发送字符串。
// 输入参数:无。
// 输出参数:无。
//----------------------------------------------------------------------------
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
while(g_ulCount); // 等待,直到之前的字符串发送完毕。
g_pucBuffer = pucBuffer; // 保存待传输的数据缓冲。
g_ulCount = ulCount; // 保存计数值。
UARTIntDisable(UART0_BASE, UART_INT_TX); // 使能发送前先禁能。
UARTTxIntHandler();
UARTIntEnable(UART0_BASE, UART_INT_TX); // 使能UART发送。
}
//----------------------------------------------------------------------------
// 函数名称:UARTRxIntHandler()。
// 函数功能:UART接收中断处理程序。
// 输入参数:无。
// 输出参数:无。
//----------------------------------------------------------------------------
void UARTRxIntHandler(void)
{
UARTIntClear(UART0_BASE, UART_INT_RX);
if( UARTCharGet(UART0_BASE) == 0x55 )
{
UARTSend(g_pucString, sizeof(g_pucString) - 1);
}
else
{
UARTSend(g_pucString1, sizeof(g_pucString1) - 1);
}
}
//----------------------------------------------------------------------------
// 函数名称:UART0IntHandler()。
// 函数功能:UART 中断处理器。
// 输入参数:无。
// 输出参数:无。
//----------------------------------------------------------------------------
void UART0IntHandler(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART0_BASE, true); // 获得中断状态。
UARTIntClear(UART0_BASE, ulStatus); // 清除等待响应的中断。
if(ulStatus & UART_INT_TX) // 检查是否有未响应的传输中断。
{
UARTTxIntHandler(); // 处理传输中断。
}
else if((ulStatus & UART_INT_RX) || (ulStatus & UART_INT_RT)) //接收中断
{
UARTRxIntHandler();
}
}
//-----------------------------------------------------------------------------
// 函数名称:GPIO_Port_B_ISR(void)
// 功能描述:首先清除中断标志,再点亮LED1。
// 输入参数:无
// 输出参数:无
//-----------------------------------------------------------------------------
void GPIO_Port_B_ISR(void)
{
// 设置连接KEY1的PB1为输入
GPIODirModeSet(GPIO_PORTB_BASE, KEY1 , GPIO_DIR_MODE_IN);
GPIODirModeSet(GPIO_PORTB_BASE, KEY2, GPIO_DIR_MODE_IN);
if( GPIOPinRead(GPIO_PORTB_BASE, KEY1) == 0 )
{
GPIOPinIntDisable(GPIO_PORTB_BASE, KEY2); // 禁能KEY2中断。
while(!GPIOPinRead(GPIO_PORTB_BASE, KEY1));
GPIOPinIntClear(GPIO_PORTB_BASE, KEY1); // 清除中断标志
g_ulState = 2; // 改变状态为读写EEPROM。
}
else if( GPIOPinRead(GPIO_PORTB_BASE, KEY2) == 0 )
{
while(!GPIOPinRead(GPIO_PORTB_BASE, KEY2));
GPIOPinIntClear(GPIO_PORTB_BASE, KEY2); // 清除中断标志
g_ulState = 1; // 改变状态为串口发送数据。
}
}
//------------------------------------------------------------------------------------
// 函数名称 Timer0A
// 函数功能 定时器0中断处理程序。工作在32位周期触发模式下。
// 输入参数 无。
// 输出参数 无。
//------------------------------------------------------------------------------------
void Timer0A(void)
{
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 清除定时器0中断。
GPIOPinWrite(GPIO_PORTB_BASE, LED1,GPIOPinRead(GPIO_PORTB_BASE, LED1) ^ LED1);
// 翻转GPIO B4 端口。
TimerEnable(TIMER0_BASE, TIMER_A); // 使能定时器0。
}
//------------------------------------------------------------------------------------
// 函数名称 Timer1A
// 函数功能 定时器1中断处理程序。工作在32位周期触发模式下。
// 输入参数 无。
// 输出参数 无。
//------------------------------------------------------------------------------------
void Timer1A(void)
{
TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); // 清除定时器1中断。
GPIOPinWrite(GPIO_PORTB_BASE, LED2,GPIOPinRead(GPIO_PORTB_BASE, LED2) ^ LED2);
// 翻转GPIO B5 端口
TimerEnable(TIMER0_BASE, TIMER_A); // 使能定时器0。
}
int main(void)
{
SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); // 使能定时器0外设。
SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); // 使能定时器1外设。
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
// 使能 SSI
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI);
// 使能 GPIO A 口外设。
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// 使能 GPIO B 口外设。
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );
// 设定 GPIO A 2~5 引脚为使用外设功能
GPIODirModeSet(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 |
GPIO_PIN_5), GPIO_DIR_MODE_HW);
// 设置 GPIO B0和B1为输出口
GPIODirModeSet(GPIO_PORTB_BASE, LED1 | LED2,GPIO_DIR_MODE_OUT);
// 设置连接KEY1,KEY2的PB1,PB3为输入
GPIODirModeSet(GPIO_PORTB_BASE, KEY1 | KEY2, GPIO_DIR_MODE_IN);
// 配置相关引脚,以进行I2C操作。
GPIODirModeSet(GPIO_PORTB_BASE, SDA | SCL,GPIO_DIR_MODE_OUT);
// 设置GPIO的A0和A1为UART引脚。(A0->RXD,A1->TXD)
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// 配置 SSI
SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, BitRate, DataWidth);
// 设置KEY1,KEY2中触发方式为低电平触发
GPIOIntTypeSet(GPIO_PORTB_BASE, KEY1 | KEY2, GPIO_LOW_LEVEL);
// 配置UART 为 115200 波特率, 8-N-1模式发送数据。
UARTConfigSet(UART0_BASE, 115200, (UART_CONFIG_WLEN_8 |
UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); // 设置定时器0为周期触发模式。
TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER); // 设置定时器1为周期触发模式。
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()); // 设置定时器装载值。定时1秒。
TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet()/2); // 设置定时器装载值。定时0.5秒。
TimerIntRegister(TIMER0_BASE,TIMER_A,Timer0A);
TimerIntRegister(TIMER1_BASE,TIMER_A,Timer1A);
UARTIntRegister(UART0_BASE,UART0IntHandler);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 设置定时器为溢出中断。
TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
UARTIntEnable(UART0_BASE, UART_INT_TX | UART_INT_RX | UART_INT_RT );
// 使能KEY1中断
GPIOPinIntEnable(GPIO_PORTB_BASE, KEY1 | KEY2);
// 使能GPIO B 口中断
IntEnable(INT_GPIOB);
// 使能 SSI
SSIEnable(SSI_BASE);
// 使能定时器
TimerEnable(TIMER0_BASE, TIMER_A);
TimerEnable(TIMER1_BASE, TIMER_A);
unsigned char i,j,k,m;
while (1)
{
switch( g_ulState )
{
case 0:
{
GPIOPinIntDisable(GPIO_PORTB_BASE, KEY2); // 禁能KEY2中断。
uchar W_DATA1[16];
uchar R_DATA1[16];
for (i=0; i<16; i++)
{
// 循环输出 0~F 的字模
SSIDataPut(SSI_BASE, DISP_TAB2[i]);
// 输出后延时一段时间
delay1(100000);
}
for ( m=0 ; m<16 ; m++ )
{
W_DATA1[ m ] = m;
}
ISendStr(CSI24c02,writeaddr,W_DATA1,16); // 向24C02中写入数据
Delays(1); // 等待主机向24C02中写入数据延时。
IRcvStr(CSI24c02,readaddr,R_DATA1,16); // 从24C02中读出数据
Delays(1);
for ( m=0 ; m<16 ; m++)
{
if( R_DATA1[ m ] == m )
{
SSIDataPut( SSI_BASE , 0xC0 );
delay1(100000);
}
else
{
SSIDataPut( SSI_BASE , 0x80 );
delay1(100000);
}
}
GPIODirModeSet(GPIO_PORTB_BASE, BEEP,GPIO_DIR_MODE_OUT);
HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (BEEP << 2))) = ~BEEP; // BEEP = 0;
Delays(50);
HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (BEEP << 2))) = BEEP; // BEEP = 1;
g_ulState = 3;
GPIOPinIntEnable(GPIO_PORTB_BASE, KEY2);
break;
}
case 1:
{
GPIODirModeSet(GPIO_PORTB_BASE, BEEP,GPIO_DIR_MODE_OUT);
for( j=0 ; j<20 ; j++ )
{
// 向UART发送一个字符串。
UARTSend(g_pucString, sizeof(g_pucString) - 1);
delay1(100000);
}
HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (BEEP << 2))) = ~BEEP; // BEEP = 0;
Delays(10);
HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (BEEP << 2))) = BEEP; // BEEP = 1;
g_ulState = 3;
break;
}
case 2:
{
uchar W_DATA[16] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; // 主机向24C02写入的数据
uchar R_DATA[16]; // 主机从24C02读出的数据缓存
GPIODirModeSet(GPIO_PORTB_BASE, SDA,GPIO_DIR_MODE_OUT); //置数据线为输出方式
ISendStr(CSI24c02,writeaddr,W_DATA,16); // 向24C02中写入数据
Delays(5); // 等待主机向24C02中写入数据延时。
IRcvStr(CSI24c02,readaddr,R_DATA,16); // 从24C02中读出数据
Delays(5);
for ( k=0 ; k<16 ; k++ )
{
SSIDataPut(SSI_BASE, R_DATA[k]); // 循环显示读出的数据。
delay1(100000);
}
g_ulState = 3;
GPIOPinIntEnable(GPIO_PORTB_BASE, KEY2);
break;
}
default:
{
for (i=0; i<16; i++)
{
// 循环输出 0~F 的字模
SSIDataPut(SSI_BASE, DISP_TAB2[i]);
// 输出后延时一段时间
delay1(100000);
}
break;
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -