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

📄 main.c

📁 基于LM3S1138ARM处理器的矩阵键盘+数码管显示源程序。
💻 C
字号:
//  基于《Stellaris外设驱动库》的例程:LED闪烁发光


//  包含必要的头文件
#include  <hw_types.h>
#include  <hw_memmap.h>
#include  <hw_sysctl.h>
#include  <hw_gpio.h>
#include  <sysctl.h>
#include  <gpio.h>


//  将较长的标识符定义成较短的形式
#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput
#define  GPIOPinTypeOD          GPIOPinTypeGPIOOutputOD


//  定义KEY
#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOG
#define  KEY_PORT               GPIO_PORTG_BASE
#define  KEY_PIN                GPIO_PIN_5


//  防止JTAG失效
void  JTAG_Wait(void)
{
    SysCtlPeriEnable(KEY_PERIPH);                               //  使能KEY所在的GPIO端口
    GPIOPinTypeIn(KEY_PORT , KEY_PIN);                          //  设置KEY所在管脚为输入
    
    if ( GPIOPinRead(KEY_PORT , KEY_PIN)  ==  0x00 )            //  如果复位时按下KEY,则进入
    {
        for (;;);                                               //  死循环,以等待JTAG连接
    }

    SysCtlPeriDisable(KEY_PERIPH);                              //  禁止KEY所在的GPIO端口
}


//  定义LED
#define  LED_PERIPH             SYSCTL_PERIPH_GPIOG
#define  LED_PORT               GPIO_PORTG_BASE
#define  LED_PIN                GPIO_PIN_3
#define  LED_On()               GPIOPinWrite(LED_PORT , LED_PIN , 0x00 << 3)
#define  LED_Off()              GPIOPinWrite(LED_PORT , LED_PIN , 0x01 << 3)
#define  LED_Toggle()           GPIOPinWrite(LED_PORT , LED_PIN , ~GPIOPinRead(LED_PORT , LED_PIN))
#define  uint unsigned int
#define  uchar unsigned char
uchar duantable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00},
	  shuru[]={16,16,16,16,16,16,16,16,16},k,h,weitable[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe},yu,guan,shu;
uint duanum,weinum,t,i;
//  定义全局的系统时钟变量
unsigned long  TheSysClock  =  12000000UL;

//  延时
void  Delay(unsigned long  ulVal)
{
    while ( --ulVal  !=  0 );
}
void display()
{
	uint q;
	if(duanum==8)
		duanum=0;
	if(weinum==8)
		weinum=0;
	h=weitable[weinum];
	for(q=0;q<8;q++)
	{
		GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0x00);//srclk=0;
		yu=0x80&h;
                h=h<<1;
		GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,yu>>7);//ser=yu;
		GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0x02);//srclk=1;
	}
	t=shuru[duanum];
	h=duantable[t];
	for(q=0;q<8;q++)
	{
		GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0x00);//srclk=0;
		yu=0x80&h;
                h=h<<1;
		GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0,yu>>7);//ser=yu;
		GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0x02);//srclk=1;
	}
	GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0x00);//rclk=0;
	GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_2,0x04);//rclk=1;
	duanum++;
	weinum++;
}




//  系统初始化
void  SystemInit(void)
{
   /* SysCtlLDOSet(SYSCTL_LDO_2_50V);                             //  设置LDO输出电压

    SysCtlClockSet(SYSCTL_USE_OSC |                             //  系统时钟设置,采用主振荡器
                   SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ |
                   SYSCTL_SYSDIV_1);*/

    SysCtlLDOSet(SYSCTL_LDO_2_75V);                             //  配置PLL前须将LDO电压设置为2.75V

    SysCtlClockSet(SYSCTL_USE_PLL |                             //  系统时钟设置,采用PLL
                   SYSCTL_OSC_MAIN |                            //  主振荡器
                   SYSCTL_XTAL_6MHZ |                           //  外接6MHz晶振
                   SYSCTL_SYSDIV_10);                           //  分频结果为20MHz/

    TheSysClock  =  SysCtlClockGet();                           //  获取系统时钟,单位:Hz

    SysCtlPeriEnable(LED_PERIPH);                               //  使能LED所在的GPIO端口
    GPIOPinTypeOut(LED_PORT, LED_PIN);                          //  设置LED所在管脚为输出
    LED_Off();                                                  //  熄灭LED
}

//  主函数(程序入口)
int  main(void)
{
    JTAG_Wait();                                                //  防止JTAG失效,重要!
    SystemInit();                                               //  系统初始化
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    GPIOPinTypeOut(GPIO_PORTB_BASE,0Xff);
    GPIOPinTypeOut(GPIO_PORTA_BASE,0Xff);
    GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0X0f);
    GPIOPinWrite(GPIO_PORTB_BASE,0x08,0X08);
    GPIOPinTypeOut(GPIO_PORTA_BASE,0Xf0);
    GPIOPinTypeIn(GPIO_PORTA_BASE,0X0f);
    //GPIODirModeSet(GPIO_PORTA_BASE,0xff,GPIO_DIR_MODE_IN);
    //GPIOPinTypeIn(GPIO_PORTA_BASE,0X0F);   
   // GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0XF0);
    //GPIOPinWrite(GPIO_PORTB_BASE,0x08,0X08);
    while(1)
    {
       //GPIOPinTypeIn(GPIO_PORTA_BASE,0x00);
       //GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0XF0);
      GPIOPinTypeOut(GPIO_PORTA_BASE,0Xff);
      GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0X0f);
      GPIOPinTypeOut(GPIO_PORTA_BASE,0Xf0);
      GPIOPinTypeIn(GPIO_PORTA_BASE,0X0f);
      guan=GPIOPinRead(GPIO_PORTA_BASE,0XFF);
      display();
      if(guan!=0x0f)
      {
         GPIOPinWrite(GPIO_PORTB_BASE,0x08,0X00);
         Delay(100*TheSysClock/4000);
         GPIOPinWrite(GPIO_PORTB_BASE,0x08,0X08);
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xff);
         GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0X7f);
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xf0);
         GPIOPinTypeIn(GPIO_PORTA_BASE,0X0f);
         guan=GPIOPinRead(GPIO_PORTA_BASE,0XFF);
         if(guan!=0x7f)
         {
          switch(guan)
          {
             case 0x7e:
             shuru[shu++]=12;
             break;
             case 0x7d:
             shuru[shu++]=13;
             break;
             case 0x7b:
             shuru[shu++]=14;
             break;
             case 0x77:
             shuru[shu++]=15;
             break;  
          }
         }
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xff);
         GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0Xbf);
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xf0);
         GPIOPinTypeIn(GPIO_PORTA_BASE,0X0f);
         guan=GPIOPinRead(GPIO_PORTA_BASE,0XFF);
         if(guan!=0xbf)
         {
          switch(guan)
          {
             case 0xbe:
             shuru[shu++]=8;
             break;
             case 0xbd:
             shuru[shu++]=9;
             break;
             case 0xbb:
             shuru[shu++]=10;
             break;
             case 0xb7:
             shuru[shu++]=11;
             break;  
          }
         }
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xff);
         GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0Xdf);
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xf0);
         GPIOPinTypeIn(GPIO_PORTA_BASE,0X0f);
         guan=GPIOPinRead(GPIO_PORTA_BASE,0XFF);
         if(guan!=0xdf)
         {
          switch(guan)
          {
             case 0xde:
             shuru[shu++]=4;
             break;
             case 0xdd:
             shuru[shu++]=5;
             break;
             case 0xdb:
             shuru[shu++]=6;
             break;
             case 0xd7:
             shuru[shu++]=7;
             break;  
          }
         }
         display();
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xff);
         GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0Xef);
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xf0);
         GPIOPinTypeIn(GPIO_PORTA_BASE,0X0f);
         guan=GPIOPinRead(GPIO_PORTA_BASE,0XFF);
         if(guan!=0xef)
         {
          switch(guan)
          {
             case 0xee:
             shuru[shu++]=0;
             break;
             case 0xed:
             shuru[shu++]=1;
             break;
             case 0xeb:
             shuru[shu++]=2;
             break;
             case 0xe7:
             shuru[shu++]=3;
             break;  
          }
         }
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xff);
         GPIOPinWrite(GPIO_PORTA_BASE,0XFF,0X0f);
         GPIOPinTypeOut(GPIO_PORTA_BASE,0Xf0);
      GPIOPinTypeIn(GPIO_PORTA_BASE,0X0f);
         while(GPIOPinRead(GPIO_PORTA_BASE,0XFF)!=0x0f)
           display();
       }
       display();
       if(shu==9)
       {
         shu=0;
         for(i=0;i<10;i++)
         {
           shuru[i]=16;
         }
       }
    }
   /* for (;;)
    {
        LED_On();                                               //  点亮LED
        Delay(200 * (TheSysClock / 4000));                      //  延时约200ms

        LED_Off();                                              //  熄灭LED
        Delay(300 * (TheSysClock / 4000));                      //  延时约300ms
    }*/
}

⌨️ 快捷键说明

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