// 基于《Stellaris外设驱动库》的例程扩展:按键控制LED
// 包含必要的头文件 #include "LED.H" #include "KEY.H" #include <hw_types.h> #include <hw_memmap.h> #include <hw_sysctl.h> #include <hw_gpio.h> #include <sysctl.h> #include <gpio.h>
// PA0 HC595_HC166_CLK // PA1 HC595_STR // PA2 HC595_DATA // PA3 HC166_S_L // PA4 HC166_Q_H
// 将较长的标识符定义成较短的形式 #define SysCtlPeriEnable SysCtlPeripheralEnable #define SysCtlPeriDisable SysCtlPeripheralDisable #define GPIOPinTypeIn GPIOPinTypeGPIOInput #define GPIOPinTypeOut GPIOPinTypeGPIOOutput
// 定义KEY #define KEY_PERIPH SYSCTL_PERIPH_GPIOG #define KEY_PORT GPIO_PORTG_BASE #define KEY_PIN GPIO_PIN_5
// 定义全局的系统时钟变量 unsigned long TheSysClock = 12000000UL; /*************************** 【函数】:seg[16] 【功能】:显示段码 【参数】:无 ***************************/ unsigned char seg[16]= { 0xC0,0xF9,0xA4,0xB0, /* 0 1 2 3*/ 0x99,0x92,0x82,0xF8, /* 4 5 6 7 */ 0x80,0x90,0x88,0x83, /* 8 9 A B */ 0xC6,0xA1,0x86,0x8E /* C D E F */ };
/*************************** 【函数】:DigTab[6] 【功能】:LED位扫描 【参数】:无 ***************************/ unsigned char DigTab[6] = // 定义数码管位选数据 { 0x01, 0x02, 0x04, 0x08, 0x10, 0x00 };
/*************************** 【函数】:JTAG_Wait(void) 【功能】:防止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端口 }
/*************************** 【函数】:Delay() 【功能】:延时 【参数】:无 ***************************/ void Delay(unsigned long ulVal) { while ( --ulVal != 0 ); }
/*************************** 【函数】:SystemInit() 【功能】:系统初始化 【参数】:无 ***************************/ 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 }
/*************************** 【函数】:IoInit(void) 【功能】:IO初始化 【参数】:无 ***************************/ void IoInit(void) { SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA); // 使能GPIOA端口 GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_0); // 设置PA0为输入类型 GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_0 , 0x00); // PA0输出低电平 GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_1); // 设置PA1为输出类型 GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_1 , 0x00<< 1); // PA1输出低电平 GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_2); // 设置PA2为输出类型 GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_2 , 0x00<< 2); // PA2输出低电平 GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_3); // 设置PA3为输出类型 GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_3 , 0x00<< 3); // PA2输出低电平 GPIOPinTypeIn(GPIO_PORTA_BASE , GPIO_PIN_4); // 设置PA4输入类型 SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB); // 使能GPIOB端口 GPIOPinTypeIn(GPIO_PORTB_BASE , GPIO_PIN_0); // 设置PB0输入类型
LED_Init(LED1 | LED2); // 初始化LED1和LED2 KEY_Init(KEY1 | KEY2); }
/*************************** 【函数】:HC595_HC166_CLK_Hi(void) 【功能】:io设定 【参数】:无 ***************************/ void HC595_HC166_CLK_Hi(void)//PA0管脚输出高电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_0 , 0x01); // PA0输出高电平 }
/*************************** 【函数】:HC595_HC166_CLK_Lo(void) 【功能】:io设定 【参数】:无 ***************************/ void HC595_HC166_CLK_Lo(void)//PA0管脚输出低电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_0 , 0x00); // PA0输出低电平 }
/*************************** 【函数】:HC595_STR_Hi(void) 【功能】:io设定 【参数】:无 ***************************/ void HC595_STR_Hi(void)//PA1管脚输出高电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_1 , 0x01<< 1); // PA1输出高电平 }
/*************************** 【函数】:HC595_STR_Lo(void) 【功能】:io设定 【参数】:无 ***************************/ void HC595_STR_Lo(void)//PA1管脚输出低电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_1 , 0x00<< 1); // PA1输出低电平 }
/*************************** 【函数】:HC595_DATA_Hi(void) 【功能】:io设定 【参数】:无 ***************************/ void HC595_DATA_Hi(void)//PA2管脚输出高电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_2 , 0x01<< 2); // PA2输出高电平 }
/*************************** 【函数】:HC595_DATA_Lo(void) 【功能】:io设定 【参数】:无 ***************************/ void HC595_DATA_Lo(void)//PA2管脚输出低电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_2 , 0x00<< 2); // PA2输出低电平 }
/*************************** 【函数】:HC166_SL_Hi(void) 【功能】:io设定 【参数】:无 ***************************/ void HC166_SL_Hi(void)//PA3管脚输出高电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_3 , 0x01<< 3); // PA3输出高电平 }
/*************************** 【函数】:HC166_SL_Lo(void) 【功能】:io设定 【参数】:无 ***************************/ void HC166_SL_Lo(void)//PA3管脚输出低电平 { GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_3 , 0x00<< 3); // PA3输出低电平 } /*************************** 【函数】:HC166_read(void) 【功能】:io设定 【参数】:无 ***************************/ unsigned char HC166_read(void)//HC166_read { unsigned char i,set; HC166_SL_Lo(); //cp底电平 HC595_HC166_CLK_Lo(); //CLK底电平 //Delay(1); HC595_HC166_CLK_Hi(); //CLK高电平 //Delay(1); HC166_SL_Hi(); //cp高电平 //Delay(1); for(i = 0, set = 0; i < 8;i ++)//依次读取锁存的8位数据 { set <<= 1; if ( GPIOPinRead(GPIO_PORTA_BASE , GPIO_PIN_4) == 0x00 ) // 如果PA4为低电平 { set ++; } HC595_HC166_CLK_Lo(); //CLK底电平 //Delay(1); HC595_HC166_CLK_Hi(); //CLK高电平//第8个脉冲将SER发送出来 } return set; }
/*************************** 【函数】:DataOut(void) 【功能】:io设定 【参数】:无 ***************************/ void DataOut(unsigned char nValue) { int i; //int j; for(i = 0;i < 8;i++) { if ((nValue & 0x80) == 0x80) { HC595_DATA_Hi();//输出高电平 } else { HC595_DATA_Lo();//输出低电平 } HC595_HC166_CLK_Hi();//时钟高电平,上升沿有效 HC595_HC166_CLK_Lo();//时钟低电平 nValue <<= 1; } return; }
/*************************** 【函数】:Show_Led_Bit(void) 【功能】:io设定 【参数】:DigValue//显示位数, SegValue//显示值 ***************************/ void Show_Led_Bit(unsigned char DigValue,unsigned char SegValue) {
HC595_STR_Lo();//清除锁存信号 //DigValue = 4;//输出高8位是 扫描数据 DataOut(DigTab[DigValue]); //SegValue =0; //输出2 给段码 DataOut(seg[SegValue]); HC595_STR_Hi();//给锁存信号,共送了16位数据 高8位是 扫描数据 低8位是段码 }
/*************************** 【函数】:Show_Led_5(void)//5位数码管 【功能】:io设定 【参数】:根据Led_Bit显示位数, 根据SegValue显示数据 ***************************/ void Show_Led_5(unsigned int Led_Bit,unsigned int Led_Value) { unsigned char DispBuf[5]; DispBuf[0] = Led_Value / 10000; DispBuf[1] = Led_Value % 10000 / 1000; DispBuf[2] = Led_Value % 1000 / 100; DispBuf[3] = Led_Value % 100 / 10; DispBuf[4] = Led_Value % 10; switch(Led_Bit) //读取扫描值 { case 0: Show_Led_Bit(5,DispBuf[0]);break; //close show case 1: Show_Led_Bit(4,DispBuf[4]);break; //show1 case 2: Show_Led_Bit(3,DispBuf[3]); Show_Led_Bit(4,DispBuf[4]);break; //show2 case 3: Show_Led_Bit(2,DispBuf[2]); Show_Led_Bit(3,DispBuf[3]); Show_Led_Bit(4,DispBuf[4]);break; //show3 case 4: Show_Led_Bit(1,DispBuf[1]); Show_Led_Bit(2,DispBuf[2]); Show_Led_Bit(3,DispBuf[3]); Show_Led_Bit(4,DispBuf[4]);break; //show4 case 5: Show_Led_Bit(0,DispBuf[0]); Show_Led_Bit(1,DispBuf[1]); Show_Led_Bit(2,DispBuf[2]); Show_Led_Bit(3,DispBuf[3]); Show_Led_Bit(4,DispBuf[4]); break; //show5 default : break; } }
/*************************** 【函数】:main(void) 【功能】:io设定 【参数】:主函数 ***************************/ // 主函数(程序入口) int main(void) { unsigned char HC66_DATA; JTAG_Wait(); // 防止JTAG失效,重要! SystemInit(); // 系统初始化 IoInit(); // IO始化 //LED_On(LED1 | LED2); // 点亮LED1和LED2 //Delay(1000 * (TheSysClock / 4000)); // 延时约1000ms //LED_Off(LED1 | LED2); // 熄灭LED1和LED2 for (;;) { HC66_DATA=HC166_read();//读键盘 //Show_Led_5(0,0); switch(HC66_DATA) //读取扫描值 { case 0x01: Show_Led_5(1,1); break; //点亮LED1 case 0x02: Show_Led_5(1,2); break; //点亮LED1 case 0x04: Show_Led_5(1,3); break; //点亮LED1 case 0x08: Show_Led_5(1,4); break; //点亮LED1 case 0x10: Show_Led_5(1,5); break; //点亮LED1 case 0x20: Show_Led_5(1,6); break; //点亮LED1 case 0x40: Show_Led_5(1,7); break; //点亮LED1 case 0x80: Show_Led_5(1,8); break; //点亮LED1 case 0xFF: Show_Led_5(2,88); break; //点亮LED2 case 0x00: Show_Led_5(3,888); break; //点亮LED2 case 0x03: Show_Led_5(2,13); break; //点亮LED2 //case 0xFE: LED_Off(LED2); break; //1 //case 0xFD: LED_On(LED1); break; //2 //case 0xFB: LED_On(LED1); break; //3 //case 0xF7: LED_On(LED1); break; //4 //case 0xEF: LED_On(LED1); break; //5 //case 0xDF: LED_On(LED1); break; //6 //case 0xBF: LED_On(LED1); break; //7 //case 0x7F: LED_On(LED1); break; //8 //case 0xFF: LED_On(LED2); break; //点亮LED2 //case 0x00: LED_On(LED2); break; //点亮LED2 default : Show_Led_5(5,88888); break; //点亮LED2 } //Delay(10 * (TheSysClock / 4000)); // 延时约10ms LED_Off(LED1 | LED2); // 熄灭LED1和LED2 } }
|