[Cortex-M0技术交流] [2012助学第一期]hzy41y学习笔记之二(用HC595和LS164驱动7位LED)

[复制链接]
2935|9
 楼主| hzy41y 发表于 2012-6-8 14:56 | 显示全部楼层 |阅读模式
本帖最后由 hzy41y 于 2012-6-8 15:23 编辑

功能:通过PC14;PC15;PC6控制74HC595和74LS164驱动7位数码管显示。
  现在已完成电路部份,大虾们看看电路有何不对请指教, 正在编写源码,完成后马上上传。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| hzy41y 发表于 2012-6-8 14:58 | 显示全部楼层
本帖最后由 hzy41y 于 2012-6-8 15:22 编辑

备用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ningling_21 发表于 2012-6-9 22:12 | 显示全部楼层
不错,继续...
hotpower 发表于 2012-6-10 16:03 | 显示全部楼层
继续努力,最好加压缩包
 楼主| hzy41y 发表于 2012-6-13 14:38 | 显示全部楼层

程序终于完成了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| hzy41y 发表于 2012-6-13 14:41 | 显示全部楼层
display[8]  为 LED显示缓存

  1. //基于NUC120学习套件用HC595和LS164驱动7位数码管
  2. //作者:hzy41y
  3. //最后更新日期2012年06月13日11:06
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "NUC1xx.h"
  7. #include "Driver\DrvSYS.h"
  8. #include "Driver\DrvGPIO.h"
  9. #include "DrvTimer.h"
  10. #include "hzy.h"
  11. #define SCL595_set DrvGPIO_SetBit(E_GPC,14)
  12. #define SCL164_set DrvGPIO_SetBit(E_GPC,15)
  13. #define SDA_set DrvGPIO_SetBit(E_GPC,6)
  14. #define SCL595_clr DrvGPIO_ClrBit(E_GPC,14)
  15. #define SCL164_clr DrvGPIO_ClrBit(E_GPC,15)
  16. #define SDA_clr DrvGPIO_ClrBit(E_GPC,6)

  17. uint16_t timer; //全局时间延时变量

  18. uint8_t tabl[] = {0xfa,0x60,0xdc,0xec,0x66,0xae,0xbe,0xe0,0xfe,0xee,0x08,0x10,0x04};
  19. /* 0 1 2 3 4 5 6 7 8 9
  20. display[0]对应LED左边第一位,display[6]对应LED最后第七位;
  21. display[7]为闪烁使能,最高位对应LED左边第一位,那位为0则闪烁 */
  22. uint8_t display[8]; //LED显示缓存

  23. //***定时器回调函数*************//
  24. void Timer0_Callback(void) // Timer0 interrupt subroutine
  25. { static uint16_t S_counter; //各位闪烁计数器
  26. static uint8_t S_Enable; //各位闪烁使能
  27. static uint8_t ch; //1-7显示通道变量
  28. static hzy_b bit;
  29. uint8_t j;
  30. uint8_t display1;

  31. if(bit.bg)
  32. bit.bn=S_Enable>>7;
  33. else bit.bn=1; //判Led相对位要闪烁
  34. S_Enable<<=1; //判Led相对位不闪烁
  35. display1=display[ch];
  36. for(j=8;j>0;j--)
  37. { if(bit.bn)
  38. { if(display1>>7)SDA_set;
  39. else SDA_clr;
  40. display1<<=1;
  41. }else SDA_clr; //判Led相对位要闪烁595各段输出为低电平

  42. SCL595_set;
  43. SCL595_clr; // 595--11pin
  44. }
  45. if(ch==0)SDA_clr;
  46. else SDA_set; // 595--14pin和164--1pin/2pin
  47. SCL164_set;
  48. SCL164_clr; // 595--12pin/13pin 和164--8pin
  49. ch++; //显示通道加1
  50. if(ch==8)
  51. { SCL164_set;SCL164_clr;ch=0;
  52. S_Enable=display[7];
  53. }
  54. S_counter++;
  55. if(S_counter==500)
  56. { bit.bg=!bit.bg;
  57. S_counter=0;
  58. }
  59. timer++; //全局时间延时变量
  60. TIMER0->TISR.TIF =1;
  61. }


  62. //---------TIMER0初始化-----------------------------//
  63. void InitTIMER0(void)
  64. {
  65. //第1步。启用和选择时钟源 /
  66. SYSCLK->CLKSEL1.TMR0_S = 0; // Timer0的时钟源选择12MHZ
  67. SYSCLK->APBCLK.TMR0_EN =1; //使能定时器时钟源

  68. //第2步。选择操作模式//
  69. TIMER0->TCSR.MODE=1; //选择定期模式,运作模

  70. /*第3步。选择了时间周期=(周期定时器时钟输入)*(8位预分频+1)*(24位TCMP)
  71. Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
  72. TIMER0->TCSR.PRESCALE=255; // Set Prescale [0~255]
  73. TIMER0->TCMPR = 100; // Set TCMPR [0~16777215]
  74. // (1/12000000)*(255+1)*(2765)=

  75. /* Step 4. Enable interrupt */
  76. TIMER0->TCSR.IE = 1;
  77. TIMER0->TISR.TIF = 1; //Write 1 to clear for safty
  78. NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt

  79. /* Step 5. Enable Timer module */

  80. DrvTIMER_SetTimerEvent(E_TMR0,1,(TIMER_CALLBACK) Timer0_Callback,0);
  81. TIMER0->TCSR.CRST = 1; //Reset up counter
  82. TIMER0->TCSR.CEN = 1; //Enable Timer0

  83. // TIMER0->TCSR.TDR_EN=1; // Enable TDR function
  84. }


  85. //***************IO和显示初始化*****************************//
  86. void init()
  87. { uint8_t i;

  88. DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
  89. DrvGPIO_Open( E_GPC, 6, E_IO_QUASI ); //标准数字双向口
  90. DrvGPIO_Open( E_GPC, 14, E_IO_QUASI );
  91. DrvGPIO_Open( E_GPC, 15, E_IO_QUASI );

  92. for(i=0;i<7;i++)
  93. { display[i]=tabl[8];}
  94. display[7]=0x00; //设置闪烁位
  95. InitTIMER0();
  96. timer=0;
  97. while (timer<5000);
  98. for(i=0;i<7;i++)
  99. { display[i]=tabl[i];}
  100. display[7]=0xFF; //设置闪烁位
  101. timer=0;
  102. while (timer<5000);
  103. }

  104. /*----------------------------------------------------------------------------
  105. MAIN function
  106. ----------------------------------------------------------------------------*/
  107. int32_t main (void)
  108. {
  109. UNLOCKREG();
  110. SYSCLK->PWRCON.XTL12M_EN = 1;
  111. LOCKREG();
  112. init();
  113. while(1);

  114. }



display[0]对应LED左边第一位,display[6]对应LED最后第七位;
display[7]为闪烁使能,最高位对应LED左边第一位,那位为0则闪烁
 楼主| hzy41y 发表于 2012-6-13 14:42 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
john_lee 发表于 2012-6-13 17:51 | 显示全部楼层
楼主可以继续改进,使用SPI接口来驱动595。
mcs8098 发表于 2012-6-26 22:38 | 显示全部楼层
 楼主| hzy41y 发表于 2012-7-3 11:13 | 显示全部楼层
自顶一吓
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

75

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部