找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8361|回复: 7
收起左侧

STC单片机74HC595驱动8个数码管

  [复制链接]
ID:187220 发表于 2017-4-7 18:25 | 显示全部楼层 |阅读模式
74HC595驱动8个数码管源程序:
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- QQ:  800003751 -------------------------------------------------*/
  8. /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
  9. /*---------------------------------------------------------------------*/


  10. /*************        本程序功能说明        **************

  11. 用STC的MCU的IO方式控制74HC595驱动8位数码管。

  12. 显示效果为: 数码时钟.

  13. 使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.

  14. ******************************************/

  15. #define         MAIN_Fosc                22118400L        //定义主时钟

  16. #include        "STC15Fxxxx.H"

  17. /****************************** 用户定义宏 ***********************************/

  18. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒

  19. /*****************************************************************************/


  20. #define DIS_DOT                0x20
  21. #define DIS_BLACK        0x10
  22. #define DIS_                0x11




  23. /*************        本地常量声明        **************/
  24. u8 code t_display[]={                                                //标准字库
  25. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  26.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  27. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  28.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  29.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  30. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码


  31. /*************        IO口定义        **************/
  32. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  33. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  34. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock

  35. /*************        本地变量声明        **************/

  36. u8         LED8[8];                //显示缓冲
  37. u8        display_index;        //显示位索引
  38. bit        B_1ms;                        //1ms标志

  39. u8        hour,minute,second;
  40. u16        msecond;

  41. /*************        本地函数声明        **************/


  42. /****************  外部函数声明和外部变量声明 *****************/


  43. /********************** 显示时钟函数 ************************/
  44. void        DisplayRTC(void)
  45. {
  46.         if(hour >= 10)        LED8[0] = hour / 10;
  47.         else                        LED8[0] = DIS_BLACK;
  48.         LED8[1] = hour % 10;
  49.         LED8[2] = DIS_;
  50.         LED8[3] = minute / 10;
  51.         LED8[4] = minute % 10;
  52.         LED8[5] = DIS_;
  53.         LED8[6] = second / 10;
  54.         LED8[7] = second % 10;
  55. }

  56. /********************** RTC演示函数 ************************/
  57. void        RTC(void)
  58. {
  59.         if(++second >= 60)
  60.         {
  61.                 second = 0;
  62.                 if(++minute >= 60)
  63.                 {
  64.                         minute = 0;
  65.                         if(++hour >= 24)        hour = 0;
  66.                 }
  67.         }
  68. }


  69. /********************** 主函数 ************************/
  70. void main(void)
  71. {
  72.         u8        i,k;
  73.        
  74.         P0M1 = 0;        P0M0 = 0;        //设置为准双向口
  75.         P1M1 = 0;        P1M0 = 0;        //设置为准双向口
  76.         P2M1 = 0;        P2M0 = 0;        //设置为准双向口
  77.         P3M1 = 0;        P3M0 = 0;        //设置为准双向口
  78.         P4M1 = 0;        P4M0 = 0;        //设置为准双向口
  79.         P5M1 = 0;        P5M0 = 0;        //设置为准双向口
  80.         P6M1 = 0;        P6M0 = 0;        //设置为准双向口
  81.         P7M1 = 0;        P7M0 = 0;        //设置为准双向口

  82.         AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
  83.         TH0 = (u8)(Timer0_Reload / 256);
  84.         TL0 = (u8)(Timer0_Reload % 256);
  85.         ET0 = 1;        //Timer0 interrupt enable
  86.         TR0 = 1;        //Tiner0 run
  87.         EA = 1;                //打开总中断
  88.        
  89.         display_index = 0;
  90.         hour   = 11;        //初始化时间值
  91.         minute = 59;
  92.         second = 58;
  93.         RTC();
  94.         DisplayRTC();
  95.        
  96. //        for(i=0; i<8; i++)        LED8[i] = DIS_BLACK;        //上电消隐
  97.         for(i=0; i<8; i++)        LED8[i] = i;        //显示01234567
  98.         k = 0;

  99.         while(1)
  100.         {
  101.                 if(B_1ms)        //1ms到
  102.                 {
  103.                         B_1ms = 0;
  104.                         if(++msecond >= 1000)        //1秒到
  105.                         {
  106.                                 msecond = 0;
  107.                                 RTC();
  108.                                 DisplayRTC();
  109.                         }

  110.                 }
  111.         }
  112. }
  113. /**********************************************/


  114. /**************** 向HC595发送一个字节函数 ******************/
  115. void Send_595(u8 dat)
  116. {               
  117.         u8        i;
  118.         for(i=0; i<8; i++)
  119.         {
  120.                 dat <<= 1;
  121.                 P_HC595_SER   = CY;
  122.                 P_HC595_SRCLK = 1;
  123.                 P_HC595_SRCLK = 0;
  124.         }
  125. }

  126. /********************** 显示扫描函数 ************************/
  127. void DisplayScan(void)
  128. {       
  129.         Send_595(~T_COM[display_index]);                                //输出位码
  130.         Send_595(t_display[LED8[display_index]]);        //输出段码

  131.         P_HC595_RCLK = 1;
  132.         P_HC595_RCLK = 0;                                                        //锁存输出数据
  133.         if(++display_index >= 8)        display_index = 0;        //8位结束回0
  134. }


  135. /********************** Timer0 1ms中断函数 ************************/
  136. void timer0 (void) interrupt TIMER0_VECTOR
  137. {
  138.         DisplayScan();        //1ms扫描显示一位
  139.         B_1ms = 1;                //1ms标志

  140. }


复制代码

下载:
C语言.rar (19.47 KB, 下载次数: 100)
回复

使用道具 举报

ID:69536 发表于 2017-8-14 11:43 | 显示全部楼层
如果 配SCH 比较只管了。
回复

使用道具 举报

ID:36359 发表于 2018-4-9 20:43 | 显示全部楼层
谢谢分享 下载研究一下
回复

使用道具 举报

ID:140183 发表于 2019-2-1 19:17 | 显示全部楼层
很好!下载学习学习
回复

使用道具 举报

ID:337487 发表于 2020-1-29 14:04 | 显示全部楼层
不错的学习程序,学习一下,谢谢!
回复

使用道具 举报

ID:372579 发表于 2020-3-12 10:43 | 显示全部楼层
这个可以学习下,带上原理图就好了,不过也值得点赞
回复

使用道具 举报

ID:1011444 发表于 2022-6-10 20:15 | 显示全部楼层
终于找到595时钟程序了,有电路图就更好了,不过还是要谢谢楼主的分享!
回复

使用道具 举报

ID:1037083 发表于 2022-7-29 12:22 | 显示全部楼层
是不是需要两片595才行?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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