请选择 进入手机版 | 继续访问电脑版
查看: 1044|回复: 8

[原创] [我为LPC代言]利用LPC1114驱动74HC595点亮两个数码管

[复制链接]
  • TA的每日心情
    奋斗
    2017-1-18 20:00
  • 签到天数: 45 天

    [LV.5]常住居民I

    17

    主题

    262

    帖子

    0

    金豆

    高级会员

    Rank: 4

    积分
    773
    最后登录
    2017-4-30
    发表于 2016-12-21 10:39:36 | 显示全部楼层 |阅读模式
    本帖最后由 云淡风轻1213 于 2016-12-21 10:39 编辑

    利用LPC1114驱动74HC595点亮两个数码管
    数码管经常被用来做数字显示的功能,而数码管引脚多,使用SPI驱动595的方式可以大大节约引脚数量。我们这里驱动两个数码管电路图如下: 搜狗截图16年12月21日1018_1.png

    引脚分配在电路图中已经给出,SPI使用的是LPC1114的SPI0

    首先写SPI驱动程序,如下:
    1. /*********************************************************************************************************
    2. ** Function name£º      SSP_Init()
    3. ** Descriptions:        ½«SSP¿ØÖÆÆ÷ÉèÖÃΪÖ÷»úSPI¡£
    4. ** input parameters£º   ÎÞ
    5. ** output parameters£º  ÎÞ
    6. ** Returned value:      ÎÞ
    7. *********************************************************************************************************/
    8. void  SSP_Init(void)
    9. {
    10.     LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16);                             /* ÅäÖÃIOCONÄ£¿éʱÖÓ            */
    11.     LPC_IOCON->PIO0_2 |= 0x01;                                          /* ³õʼ»¯SPI0Òý½Å               */
    12.     LPC_IOCON->PIO0_6 |= 0x02;
    13.     LPC_IOCON->PIO0_8 |= 0x01;
    14.     LPC_IOCON->PIO0_9 |= 0x01;

    15.     LPC_SYSCON->PRESETCTRL |= 0x01;                                     /* ½ûÖ¹SPI0¸´Î»                 */

    16.     LPC_IOCON->SCK_LOC        = 0x02;                                   /* P0.6ÅäÖÃΪSCK                */
    17.     LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11);                             /* ´ò¿ªSPI0ÍâÉè                 */
    18.     LPC_SYSCON->SSP0CLKDIV     = 0x01;                                  /* SSPʱÖÓ·ÖƵ                  */
    19.    
    20.     LPC_SSP0->CR0 = (0x01 << 8) |                                       /* SCR  ÉèÖÃSPIʱÖÓ·ÖƵ         */
    21.                     (0x00 << 7) |                                       /* CPHA ʱÖÓÊä³öÏàλ,           */
    22.                                                                         /* ½öSPIģʽÓÐЧ                */
    23.                     (0x00 << 6) |                                       /* CPOL ʱÖÓÊä³ö¼«ÐÔ,           */
    24.                                                                         /* ½öSPIģʽÓÐЧ                */
    25.                     (0x00 << 4) |                                       /* FRF  Ö¡¸ñʽ 00=SPI,01=SSI,   */
    26.                                                                         /* 10=Microwire,11=±£Áô         */
    27.                     (0x07 << 0);                                        /* DSS  Êý¾Ý³¤¶È,0000-0010=±£Áô,*/
    28.                                                                         /* 0011=4λ,0111=8λ,1111=16λ  */

    29.     LPC_SSP0->CR1 = (0x00 << 3) |                                       /* SOD  ´Ó»úÊä³ö½ûÄÜ,1=½ûÖ¹     */
    30.                     (0x00 << 2) |                                       /* MS   Ö÷´ÓÑ¡Ôñ,0=Ö÷»ú,1=´Ó»ú  */
    31.                     (0x01 << 1) |                                       /* SSE  SSPʹÄÜ                 */
    32.                     (0x00 << 0);                                        /* LBM  »Øдģʽ                */
    33.             
    34.     LPC_SSP0->CPSR = 2;                                                 /* PCLK·ÖƵֵ                   */
    35.     LPC_SSP0->ICR  = 0x03;                                              /* ÖжÏÇå³ý¼Ä´æÆ÷               */
    36. }

    37. /*********************************************************************************************************
    38. ** Function name£º      SSP_SendData()
    39. ** Descriptions£º       SSP½Ó¿ÚÏòSPI×ÜÏß·¢ËÍÊý¾Ý¡£
    40. ** input parameters£º   data    ´ý·¢Ë͵ÄÊý¾Ý
    41. ** output parameters£º  ·µ»ØֵΪ¶ÁÈ¡µÄÊý¾Ý
    42. ** Returned value:      ÎÞ
    43. *********************************************************************************************************/
    44. uint8_t  SSP_SendData(uint8_t data)
    45. {  
    46.     LPC_SSP0->DR = data;
    47.     while( (LPC_SSP0->SR & 0x01) == 0 );               //µÈ´ýTFEÖÃ룬¼´·¢ËÍFIFO¿Õ    µÈ´ý·¢ËÍÍê±Ï
    48.     return(LPC_SSP0->DR);
    49. }
    复制代码
    接下来就是写定时器,利用定时器更新数码管显示的内容,程序如下:
    1. /***************************************/
    2. /* º¯Êý¹¦ÄÜ£ºTIM32B0zÖжϷþÎñº¯Êý      */
    3. /***************************************/
    4. void TIMER32_0_IRQHandler(void)
    5. {
    6.         static unsigned int num;
    7.         num++;
    8.         if(num==400)
    9.         {
    10.                 num=0;
    11.                 uidata++;
    12.         }
    13.         if(uidata>99)
    14.         {
    15.                 uidata=0;
    16.         }
    17.         LPC_TMR32B0->IR = 0x01; // ÇåËùÓÐÖжϱêÖ¾
    18. }

    19. void timer0Init(void)
    20. {
    21.     LPC_SYSCON->SYSAHBCLKCTRL  |= (1 << 9);

    22.     LPC_TMR32B0->IR      = 1;
    23.     LPC_TMR32B0->PR       = 0;      
    24.                 LPC_TMR32B0->MCR     = 3;      
    25.            
    26.     LPC_TMR32B0->MR0     = SystemFrequency / 400;     
    27.     LPC_TMR32B0->TCR     = 0x01;      
    28.     NVIC_EnableIRQ(TIMER_32_0_IRQn);   // ʹÄÜTIM32B0ÖжÏ
    29.     NVIC_SetPriority(TIMER_32_0_IRQn, 3);            
    30. }
    复制代码
    还要分配两个引脚控制数码管共阳极(阴极)的引脚,程序如下:
    1. //P1.10
    2. #define LED8H_1  (1<<10)
    3. #define LED8H_1_LOW()   LPC_GPIO1->DATA &=~LED8H_1                //Êä³öµÍµçƽ
    4. #define LED8H_1_HIGH()  LPC_GPIO1->DATA |= LED8H_1                //Êä³ö¸ßµçƽ

    5. //P2.11
    6. #define LED8H_2  (1<<11)
    7. #define LED8H_2_LOW()   LPC_GPIO2->DATA &=~LED8H_2                //Êä³öµÍµçƽ
    8. #define LED8H_2_HIGH()  LPC_GPIO2->DATA |= LED8H_2                //Êä³ö¸ßµçƽ
    复制代码
    1. //³õʼ»¯8¶ÎÊýÂë¹Ü¹²Ñô¼«µÄ¿ØÖÆÒý½Å
    2. void DisplayCtlPinInit(void)
    3. {        
    4.         LPC_IOCON->PIO1_10 &=~0x07;                                                           //½«P1.10³õʼ»¯ÎªGPIO¹¦ÄÜ
    5.         LPC_GPIO1->DIR    |=LED8H_1;                                                //½«P1.10·½ÏòÉèÖÃΪÊä³ö
    6.         LPC_GPIO1->DATA   &=~LED8H_1;                                       //½«P1.10³õʼ»¯Êä³öµÍµçƽ

    7.         LPC_IOCON->PIO2_11 &=~0x07;                                                           //½«P2.11³õʼ»¯ÎªGPIO¹¦ÄÜ
    8.         LPC_GPIO2->DIR    |=LED8H_2;                                                //½«P2.11·½ÏòÉèÖÃΪÊä³ö
    9.         LPC_GPIO2->DATA   &=~LED8H_2;                                                //½«P2.11³õʼ»¯Êä³öµÍµçƽ
    10. }
    复制代码
    数码管显示扫描函数如下:
    1. /*********************************************************************************************************
    2. ** Function name:      DisplayNumber
    3. ** Descriptions:       ÔÚÊýÂë¹ÜÉÏÏÔʾÊý×Ö
    4. ** input parameters:    number
    5. ** output parameters:   ÎÞ
    6. ** Returned value:      ÎÞ
    7. *********************************************************************************************************/
    8. void DisplayNum(char number)
    9. {
    10.         switch(number)
    11.         {
    12.                 case 0:  SSP_SendData(LED_TBL[0]);  break;
    13.                 case 1:  SSP_SendData(LED_TBL[1]);  break;
    14.                 case 2:  SSP_SendData(LED_TBL[2]);  break;
    15.                 case 3:  SSP_SendData(LED_TBL[3]);  break;
    16.                 case 4:  SSP_SendData(LED_TBL[4]);  break;
    17.                 case 5:  SSP_SendData(LED_TBL[5]);  break;
    18.                 case 6:  SSP_SendData(LED_TBL[6]);  break;
    19.                 case 7:  SSP_SendData(LED_TBL[7]);  break;
    20.                 case 8:  SSP_SendData(LED_TBL[8]);  break;
    21.                 case 9:  SSP_SendData(LED_TBL[9]);  break;
    22.                 default:break;
    23.                         
    24.                         
    25.         }
    26. }

    27. /*********************************************************************************************************
    28. ** Function name:       LedDisplayScan
    29. ** Descriptions:        É¨Ãè²¢ÏÔʾÊý×Ö
    30. ** input parameters:    ÎÞ
    31. ** output parameters:   ÎÞ
    32. ** Returned value:      ÎÞ
    33. *********************************************************************************************************/
    34. void LedDisplayScan()
    35. {   
    36.         static unsigned char ucIndex=0;
    37.         LED8H_1_LOW();
    38.         LED8H_2_LOW();
    39.         
    40.         DisplayNum(SegBuf[ucIndex]);
    41.         switch (ucIndex)
    42.         {
    43.                 case 0: LED8H_1_HIGH();   break;
    44.                 case 1: LED8H_2_HIGH();   break;
    45.                 default:break;
    46.         }
    47.         DispDelay(1);
    48.         ucIndex++;
    49.         if (ucIndex>=2)  ucIndex=0;
    50. }
    51. void ChangeNum(void)
    52. {
    53.         
    54.         SegBuf[0]=uidata%10;
    55.         SegBuf[1]=uidata/10;
    56.         LedDisplayScan();
    57. }
    复制代码
    基本完成了,在猪肝书里调用ChangeNum();就行了。
    我设计的现象图如下:
    IMG_20161221_103042.jpg
    程序如下:使用的环境是周立功的TKstudio
    LED8H_595.rar (183.43 KB, 下载次数: 7)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 604 天

    [LV.9]以坛为家II

    53

    主题

    1987

    帖子

    24

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    3460
    最后登录
    2019-3-21
    发表于 2016-12-21 10:45:13 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-13 08:29
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    531

    主题

    2048

    帖子

    0

    金豆

    中级会员

    Rank: 3Rank: 3

    积分
    204
    最后登录
    2018-8-14
    发表于 2016-12-21 10:46:41 | 显示全部楼层
    到时候麻烦楼主把发的这些帖子整理成一个帖子 这样子方便评选
    签到 签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:16
  • 签到天数: 191 天

    [LV.7]常住居民III

    11

    主题

    664

    帖子

    0

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    1722
    最后登录
    2017-10-15
    发表于 2016-12-21 11:11:24 | 显示全部楼层
    谢谢分享                           
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-18 20:00
  • 签到天数: 45 天

    [LV.5]常住居民I

    17

    主题

    262

    帖子

    0

    金豆

    高级会员

    Rank: 4

    积分
    773
    最后登录
    2017-4-30
     楼主| 发表于 2016-12-21 11:39:37 | 显示全部楼层
    肖久 发表于 2016-12-21 10:46
    到时候麻烦楼主把发的这些帖子整理成一个帖子 这样子方便评选

    已整理,谢谢肖总
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-18 20:00
  • 签到天数: 45 天

    [LV.5]常住居民I

    17

    主题

    262

    帖子

    0

    金豆

    高级会员

    Rank: 4

    积分
    773
    最后登录
    2017-4-30
     楼主| 发表于 2016-12-21 11:39:57 | 显示全部楼层

    谢谢支持
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-18 20:00
  • 签到天数: 45 天

    [LV.5]常住居民I

    17

    主题

    262

    帖子

    0

    金豆

    高级会员

    Rank: 4

    积分
    773
    最后登录
    2017-4-30
     楼主| 发表于 2016-12-21 11:40:14 | 显示全部楼层

    谢谢支持
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:10
  • 签到天数: 847 天

    [LV.10]以坛为家III

    45

    主题

    3306

    帖子

    22

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    4415
    最后登录
    2019-3-24
    发表于 2016-12-21 11:45:31 | 显示全部楼层
    谢谢分享     
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-24 08:30
  • 签到天数: 50 天

    [LV.5]常住居民I

    22

    主题

    812

    帖子

    0

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    1693
    最后登录
    2019-2-16
    发表于 2016-12-21 12:20:51 | 显示全部楼层
    谢谢分享     
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|恩智浦技术社区

    GMT+8, 2019-3-25 01:15 , Processed in 0.148574 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表