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

📄 exall.c

📁 easyarm1001_CDROM.rar 需要的快快下载
💻 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 + -