在线时间116 小时
UID3123257
注册时间2016-10-11
NXP金币0
TA的每日心情 | 奋斗 2017-1-18 20:00 |
---|
签到天数: 45 天 连续签到: 1 天 [LV.5]常住居民I
高级会员

- 积分
- 533
- 最后登录
- 2024-11-23
|
本帖最后由 云淡风轻1213 于 2016-12-21 10:39 编辑
利用LPC1114驱动74HC595点亮两个数码管
数码管经常被用来做数字显示的功能,而数码管引脚多,使用SPI驱动595的方式可以大大节约引脚数量。我们这里驱动两个数码管电路图如下:
引脚分配在电路图中已经给出,SPI使用的是LPC1114的SPI0
首先写SPI驱动程序,如下:
- /*********************************************************************************************************
- ** Function name£º SSP_Init()
- ** Descriptions: ½«SSP¿ØÖÆÆ÷ÉèÖÃΪÖ÷»úSPI¡£
- ** input parameters£º ÎÞ
- ** output parameters£º ÎÞ
- ** Returned value: ÎÞ
- *********************************************************************************************************/
- void SSP_Init(void)
- {
- LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16); /* ÅäÖÃIOCONÄ£¿éʱÖÓ */
- LPC_IOCON->PIO0_2 |= 0x01; /* ³õʼ»¯SPI0Òý½Å */
- LPC_IOCON->PIO0_6 |= 0x02;
- LPC_IOCON->PIO0_8 |= 0x01;
- LPC_IOCON->PIO0_9 |= 0x01;
- LPC_SYSCON->PRESETCTRL |= 0x01; /* ½ûÖ¹SPI0¸´Î» */
- LPC_IOCON->SCK_LOC = 0x02; /* P0.6ÅäÖÃΪSCK */
- LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11); /* ´ò¿ªSPI0ÍâÉè */
- LPC_SYSCON->SSP0CLKDIV = 0x01; /* SSPʱÖÓ·ÖÆµ */
-
- LPC_SSP0->CR0 = (0x01 << 8) | /* SCR ÉèÖÃSPIʱÖÓ·ÖÆµ */
- (0x00 << 7) | /* CPHA ʱÖÓÊä³öÏàλ, */
- /* ½öSPIģʽÓÐЧ */
- (0x00 << 6) | /* CPOL ʱÖÓÊä³ö¼«ÐÔ, */
- /* ½öSPIģʽÓÐЧ */
- (0x00 << 4) | /* FRF Ö¡¸ñʽ 00=SPI,01=SSI, */
- /* 10=Microwire,11=±£Áô */
- (0x07 << 0); /* DSS Êý¾Ý³¤¶È,0000-0010=±£Áô,*/
- /* 0011=4λ,0111=8λ,1111=16λ */
- LPC_SSP0->CR1 = (0x00 << 3) | /* SOD ´Ó»úÊä³ö½ûÄÜ,1=½ûÖ¹ */
- (0x00 << 2) | /* MS Ö÷´ÓÑ¡Ôñ,0=Ö÷»ú,1=´Ó»ú */
- (0x01 << 1) | /* SSE SSPʹÄÜ */
- (0x00 << 0); /* LBM »ØÐ´Ä£Ê½ */
-
- LPC_SSP0->CPSR = 2; /* PCLK·ÖƵֵ */
- LPC_SSP0->ICR = 0x03; /* ÖжÏÇå³ý¼Ä´æÆ÷ */
- }
- /*********************************************************************************************************
- ** Function name£º SSP_SendData()
- ** Descriptions£º SSP½Ó¿ÚÏòSPI×ÜÏß·¢ËÍÊý¾Ý¡£
- ** input parameters£º data ´ý·¢Ë͵ÄÊý¾Ý
- ** output parameters£º ·µ»ØÖµÎª¶ÁÈ¡µÄÊý¾Ý
- ** Returned value: ÎÞ
- *********************************************************************************************************/
- uint8_t SSP_SendData(uint8_t data)
- {
- LPC_SSP0->DR = data;
- while( (LPC_SSP0->SR & 0x01) == 0 ); //µÈ´ýTFEÖÃ룬¼´·¢ËÍFIFO¿Õ µÈ´ý·¢ËÍÍê±Ï
- return(LPC_SSP0->DR);
- }
复制代码 接下来就是写定时器,利用定时器更新数码管显示的内容,程序如下:
- /***************************************/
- /* º¯Êý¹¦ÄÜ£ºTIM32B0zÖжϷþÎñº¯Êý */
- /***************************************/
- void TIMER32_0_IRQHandler(void)
- {
- static unsigned int num;
- num++;
- if(num==400)
- {
- num=0;
- uidata++;
- }
- if(uidata>99)
- {
- uidata=0;
- }
- LPC_TMR32B0->IR = 0x01; // ÇåËùÓÐÖжϱêÖ¾
- }
- void timer0Init(void)
- {
- LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 9);
-
- LPC_TMR32B0->IR = 1;
- LPC_TMR32B0->PR = 0;
- LPC_TMR32B0->MCR = 3;
-
- LPC_TMR32B0->MR0 = SystemFrequency / 400;
- LPC_TMR32B0->TCR = 0x01;
- NVIC_EnableIRQ(TIMER_32_0_IRQn); // ʹÄÜTIM32B0ÖжÏ
- NVIC_SetPriority(TIMER_32_0_IRQn, 3);
- }
复制代码 还要分配两个引脚控制数码管共阳极(阴极)的引脚,程序如下:
- //P1.10
- #define LED8H_1 (1<<10)
- #define LED8H_1_LOW() LPC_GPIO1->DATA &=~LED8H_1 //Êä³öµÍµçƽ
- #define LED8H_1_HIGH() LPC_GPIO1->DATA |= LED8H_1 //Êä³ö¸ßµçƽ
- //P2.11
- #define LED8H_2 (1<<11)
- #define LED8H_2_LOW() LPC_GPIO2->DATA &=~LED8H_2 //Êä³öµÍµçƽ
- #define LED8H_2_HIGH() LPC_GPIO2->DATA |= LED8H_2 //Êä³ö¸ßµçƽ
复制代码- //³õʼ»¯8¶ÎÊýÂë¹Ü¹²Ñô¼«µÄ¿ØÖÆÒý½Å
- void DisplayCtlPinInit(void)
- {
- LPC_IOCON->PIO1_10 &=~0x07; //½«P1.10³õʼ»¯ÎªGPIO¹¦ÄÜ
- LPC_GPIO1->DIR |=LED8H_1; //½«P1.10·½ÏòÉèÖÃΪÊä³ö
- LPC_GPIO1->DATA &=~LED8H_1; //½«P1.10³õʼ»¯Êä³öµÍµçƽ
- LPC_IOCON->PIO2_11 &=~0x07; //½«P2.11³õʼ»¯ÎªGPIO¹¦ÄÜ
- LPC_GPIO2->DIR |=LED8H_2; //½«P2.11·½ÏòÉèÖÃΪÊä³ö
- LPC_GPIO2->DATA &=~LED8H_2; //½«P2.11³õʼ»¯Êä³öµÍµçƽ
- }
复制代码 数码管显示扫描函数如下:
- /*********************************************************************************************************
- ** Function name: DisplayNumber
- ** Descriptions: ÔÚÊýÂë¹ÜÉÏÏÔʾÊý×Ö
- ** input parameters: number
- ** output parameters: ÎÞ
- ** Returned value: ÎÞ
- *********************************************************************************************************/
- void DisplayNum(char number)
- {
- switch(number)
- {
- case 0: SSP_SendData(LED_TBL[0]); break;
- case 1: SSP_SendData(LED_TBL[1]); break;
- case 2: SSP_SendData(LED_TBL[2]); break;
- case 3: SSP_SendData(LED_TBL[3]); break;
- case 4: SSP_SendData(LED_TBL[4]); break;
- case 5: SSP_SendData(LED_TBL[5]); break;
- case 6: SSP_SendData(LED_TBL[6]); break;
- case 7: SSP_SendData(LED_TBL[7]); break;
- case 8: SSP_SendData(LED_TBL[8]); break;
- case 9: SSP_SendData(LED_TBL[9]); break;
- default:break;
-
-
- }
- }
- /*********************************************************************************************************
- ** Function name: LedDisplayScan
- ** Descriptions: ɨÃè²¢ÏÔʾÊý×Ö
- ** input parameters: ÎÞ
- ** output parameters: ÎÞ
- ** Returned value: ÎÞ
- *********************************************************************************************************/
- void LedDisplayScan()
- {
- static unsigned char ucIndex=0;
- LED8H_1_LOW();
- LED8H_2_LOW();
-
- DisplayNum(SegBuf[ucIndex]);
- switch (ucIndex)
- {
- case 0: LED8H_1_HIGH(); break;
- case 1: LED8H_2_HIGH(); break;
- default:break;
- }
- DispDelay(1);
- ucIndex++;
- if (ucIndex>=2) ucIndex=0;
- }
- void ChangeNum(void)
- {
-
- SegBuf[0]=uidata%10;
- SegBuf[1]=uidata/10;
- LedDisplayScan();
- }
复制代码 基本完成了,在猪肝书里调用ChangeNum();就行了。
我设计的现象图如下:
程序如下:使用的环境是周立功的TKstudio
LED8H_595.rar
(183.43 KB, 下载次数: 18)
|
|