找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6527|回复: 5
收起左侧

STC15W408AS单片机驱动74hc595源代码

[复制链接]
ID:319065 发表于 2018-6-14 20:39 | 显示全部楼层 |阅读模式
单片机源程序如下:

  1. #include "delay.h"
  2. #include "key.h"
  3. #include "hc595.h"
  4. #include "intrins.h "


  5. ///////////////////////////引脚定义///////////////////////////////
  6. sbit Hc595_Sck_P11 = P3^2; //输入串行移位时钟脉冲 sh_cp_595
  7. sbit Hc595_Rck_P12 = P3^3; //输出锁存器控制脉冲 st_cp_595
  8. //sbit Hc595_Oe_P13 = P1^5; //8 位并行输出使能禁能(高阻态)
  9. sbit Hc595_Ser_P14 = P3^4; //串行数据输入线

  10. unsigned char Hc595_Datas[6] = {0x00U}; //存放6个数码管显示的数据
  11. unsigned long Hc595_Count = 0U;//显示定时计数,
  12. unsigned long Hc595_Time_Count = 0U;//定时器超时计数


  13. unsigned long hc595_time_count_temp = 0U;//临时存储
  14. unsigned long hc595_time_count_temp_1 = 0U;//临时存储
  15. unsigned long hc595_time_count_temp_2 = 0U;//临时存储

  16. unsigned char Hc595_Led_Code[]={
  17.                                                                 0x3FU, // 0
  18.                                                                 0x06U, // 1
  19.                                                                 0x5BU, // 2
  20.                                                                 0x4FU, // 3
  21.                                                                 0x66U, // 4
  22.                                                                 0x6DU, // 5
  23.                                                                 0x7DU, // 6
  24.                                                                 0x07U, // 7
  25.                                                                 0x7FU, // 8
  26.                                                                 0x6FU, // 9
  27.                                                                 0x77U, // A
  28.                                                                 0x7CU, // B
  29.                                                                 0x39U, // C
  30.                                                                 0x5EU, // D
  31.                                                                 0x79U, // E
  32.                                                                 0x71U, // F
  33.                                                                 0x00U  //0x10:表示不显示
  34.                                                         };//共阳极数码管

  35. /////////////////////////////////////////////////外部调用函数/////////////////////////////////////////////
  36. /***********************************************************************************************
  37. //功能:单个数据往hc595发送,串行输入数据(SER)移入寄存器
  38. //输入:unsigned char SendVal:要发送的数据
  39. //输出:无
  40. //备注:无
  41. //日期:2018.06.05
  42. *************************************************************************************************/
  43. void Hc595SendData(unsigned char SendVal)//往hc595发送数据,串行输入数据(SER)移入寄存器
  44. {
  45.         unsigned char i;
  46.         for(i = 0U; i < 8U; i++)
  47.         {
  48.                 if((SendVal <<i ) & 0x80U)
  49.                 {
  50.                         Hc595_Ser_P14 = HC595_HIGH;
  51.                 }
  52.                 else
  53.                 {
  54.                         Hc595_Ser_P14 = HC595_LOW;
  55.                 }
  56.                 //由低电平跳为高电平,产生上升沿,串行输入数据(SER)移入寄存器
  57.                 Hc595_Sck_P11 = HC595_HIGH;
  58.                 _nop_();
  59.                 _nop_();
  60.                 Hc595_Sck_P11 = HC595_LOW;
  61.         }
  62. }

  63. /***********************************************************************************************
  64. //功能:数据显示.RCK_595 产生上升沿,(输出数据用于引脚)
  65. //输入:无
  66. //输出:无
  67. //备注:无
  68. //日期:2018.06.05
  69. *************************************************************************************************/
  70. void Hc595ShowData(void)//RCK_595 产生上升沿,(输出数据用于引脚)
  71. {
  72.         Hc595_Rck_P12 = HC595_LOW;
  73.         _nop_();
  74.         _nop_();
  75.         Hc595_Rck_P12 = HC595_HIGH;
  76.         _nop_();
  77.         _nop_();
  78.         Hc595_Rck_P12 = HC595_LOW;
  79.         _nop_();
  80.         _nop_();
  81. }                                                
  82.         
  83. /***********************************************************************************************
  84. //功能:6个数据级联显示
  85. //输入:无
  86. //输出:无
  87. //备注:无
  88. //日期:2018.06.05
  89. *************************************************************************************************/
  90. void Hc595LedDisplayN(void)
  91. {
  92.         unsigned char i;//,j;
  93.         unsigned char movebit[6];
  94.         //Hc595_Oe_P13 = HC595_LOW; //选中数码管
  95.         for(i = 0U; i < 6U; i++)
  96.         {
  97.                 movebit[i] = Hc595_Led_Code[Hc595_Datas[i]];
  98.         }
  99.         // P1 = 0U;
  100.         Delay(1U);
  101.         for(i = 0U; i< 6U; i++) //数据移位
  102.         {
  103.                 if(i == 1U)//第二个字段小数点常亮处理
  104.                 {
  105.                         Hc595SendData(movebit[i] & 0x7FU );//共阳极低电平点亮对应的二极管
  106.                 }
  107.                 else
  108.                 {
  109.                         Hc595SendData(movebit[i]);
  110.                 }
  111.                
  112.                 /*test = movebit[i];
  113.                 for(j = 0U;j < 8U; j++)
  114.                 {
  115.                         testb = (test & 0x80U);
  116.                         test = (test << 1U);
  117.                         if(testb)
  118.                         {
  119.                                 Hc595_Ser_P14 = HC595_HIGH;
  120.                         }
  121.                         else
  122.                         {
  123.                                 Hc595_Ser_P14 = HC595_LOW;
  124.                         }
  125.                         Hc595_Sck_P11 = HC595_HIGH;
  126.                         _nop_();
  127.                         _nop_();
  128.                         _nop_();
  129.                         Hc595_Sck_P11 = HC595_LOW;
  130.                 } //数据移位*/
  131.         }
  132.         
  133.         //显示数据,
  134.         Hc595ShowData();
  135.         /*Hc595_Rck_P12 = HC595_LOW;
  136.         _nop_();
  137.         _nop_();
  138.         _nop_();
  139.         Hc595_Rck_P12 = HC595_HIGH;
  140.         _nop_();
  141.         _nop_();
  142.         _nop_();
  143.         Hc595_Rck_P12 = HC595_LOW;
  144.         _nop_();
  145.         _nop_();
  146.         _nop_();*/
  147. }

  148. /***********************************************************************************************
  149. //功能:定时器计数处理函数,并将对应的数据转化为十进制数处理
  150. //输入:无
  151. //输出:无
  152. //备注:应用于中断中
  153. //日期:2018.06.05
  154. *************************************************************************************************/
  155. void Hc595TimerCountHandle(void)
  156. {
  157.         unsigned char hc595_key_status = 0U;//按键状态
  158.         unsigned char hc595_key_count_modle = 0U;//档位
  159.         unsigned char hc595_stop_display_flag = 0U;
  160.         
  161.         hc595_key_count_modle = KeyCheckCount();//取按键设置的档位显示
  162.         hc595_key_status = KeyCheckStatus();//获取按键状态
  163.         switch(hc595_key_status)
  164.         {        
  165.                 case KeySwitchModeTimeOutInit://上电初始化状态,可用于切换档位
  166.                         Hc595_Datas[0] = hc595_key_count_modle;//取按键设置的档位显示
  167.                         Hc595_Datas[1] = 0x10U;//不显示,全关处理
  168.                         Hc595_Datas[2] = 0x10U;//不显示,全关处理
  169.                         Hc595_Datas[3] = 0x10U;//不显示,全关处理
  170.                         Hc595_Datas[4] = 0x10U;//不显示,全关处理
  171.                         Hc595_Datas[5] = 0x10U;//不显示,全关处理
  172.                         Hc595_Count = 0U;
  173.                         break;
  174.                 case KeyTimeCountInit://档位设置完成后初始态,开启计数
  175.                 case KeyTimeCountStopClear://按键计时清零状态
  176.                 case KeyTimeCountOver://计时结束
  177.                 case KeyTimeCountOverStop://超出后停止状态
  178.                 case KeyTimeCountOverInit_1://超出后停止状态
  179.                 case KeyTimeCountOverInit://超出后初始化状态
  180.                         Hc595_Count = 0U;
  181.                         Hc595_Datas[0] = 0x00U;//全险0
  182.                         Hc595_Datas[1] = 0x00U;//全险0
  183.                         Hc595_Datas[2] = 0x00U;//全险0
  184.                         Hc595_Datas[3] = 0x00U;//全险0
  185.                         Hc595_Datas[4] = 0x00U;//全险0
  186.                         Hc595_Datas[5] = 0x00U;//全险0
  187.                         break;
  188.                 case KeyTimeCountStart://开启计数
  189.                         //根据档位处理时间

  190.                         Hc595_Count ++;                                
  191.                         hc595_time_count_temp_2 = Hc595_Count;
  192.                         //显示
  193.                         if(hc595_key_count_modle == 5U)//第5档只显示时间
  194.                         {
  195.                                 if(Hc595_Count >= 600000U)
  196.                                 {
  197.                                         Hc595_Count = 0U;
  198.                                         Key.Key_Status = KeyTimeCountOver;//计时结束
  199.                                 }
  200.                                 //分钟
  201.                                 Hc595_Datas[0] = (Hc595_Count / 6000U) / 10U;
  202.                                 Hc595_Datas[1] = (Hc595_Count / 6000U) % 10U;
  203.                                 //秒
  204.                                 Hc595_Datas[2] = (Hc595_Count % 6000U) / 1000U;
  205.                                 Hc595_Datas[3] = (Hc595_Count % 1000U) / 100U;
  206.                                 //毫秒
  207.                                 Hc595_Datas[4] = (Hc595_Count % 100U)/10U;
  208.                                 Hc595_Datas[5] = (Hc595_Count % 10U)/1U;
  209.                         }
  210.                         else
  211.                         {                                
  212.                                 hc595_time_count_temp = Hc595_Count;
  213.                                 if(hc595_key_count_modle == 0U)
  214.                                 {
  215.                                         hc595_time_count_temp = (Hc595_Count*5 + Hc595_Count%5);//400us                                                                                
  216.                                 }
  217.                                 else if(hc595_key_count_modle == 1U)
  218.                                 {
  219.                                         hc595_time_count_temp = (Hc595_Count*4 + Hc595_Count%4);
  220.                                 }
  221.                                 else if(hc595_key_count_modle == 2U)
  222.                                 {
  223.                                         hc595_time_count_temp = (Hc595_Count*3 + Hc595_Count%3);
  224.                                 }
  225.                                 else if(hc595_key_count_modle == 3U)
  226.                                 {
  227.                                         hc595_time_count_temp = (Hc595_Count*2 + Hc595_Count%2);
  228.                                 }
  229.                                 else if(hc595_key_count_modle == 4U)
  230.                                 {
  231.                                         hc595_time_count_temp = (Hc595_Count + Hc595_Count);
  232.                                 }
  233.                                 
  234.                                 //if((hc595_key_count_modle == 0U) || (hc595_key_count_modle == 1U) || (hc595_key_count_modle == 4U))
  235.                                 {
  236.                                         if(hc595_time_count_temp >= 10000U)
  237.                                         {
  238.                                                 Hc595_Count = 0U;
  239.                                                 hc595_time_count_temp = 0U;
  240.                                                 Key.Key_Status = KeyTimeCountOver;//计时结束
  241.                                         }

  242.                                         Hc595_Datas[0] = (Hc595_Count % 10000U)/1000U;
  243.                                         Hc595_Datas[1] = (Hc595_Count % 1000U)/100U;
  244.                                         Hc595_Datas[2] = (hc595_time_count_temp % 100U)/10U;
  245.                                         Hc595_Datas[3] = (hc595_time_count_temp % 10U)/1U;
  246.                                         Hc595_Datas[4] = (hc595_time_count_temp % 100U)/10U;
  247.                                         Hc595_Datas[5] = (hc595_time_count_temp % 10U)/1U;
  248.                                 }
  249.                                 hc595_time_count_temp_1 = ((unsigned long)Hc595_Datas[0])*100000U + ((unsigned long)Hc595_Datas[1])*10000U + ((unsigned long)Hc595_Datas[2])*1000U + ((unsigned long)Hc595_Datas[3])*100U + ((unsigned long)Hc595_Datas[4])*10U + (unsigned long)Hc595_Datas[4];
  250.                                 
  251.                         }
  252.                         break;
  253.                 case KeyTimeCountStop://停止计数状态
  254.                         if(hc595_key_count_modle !=        5U)
  255.                         {                                
  256.                                 switch(hc595_key_count_modle)
  257.                                 {
  258.                                         case 0U:
  259.                                                 if((hc595_time_count_temp_1 >= 99990U) && (hc595_time_count_temp_1 <= 100000U))
  260.                                                 {
  261.                                                         hc595_time_count_temp = 100000U;
  262.                                                         hc595_stop_display_flag = 1U;
  263.                                                 }
  264.                                                 break;
  265.                                         case 1U:
  266.                                                 if((hc595_time_count_temp_1 >= 99970U) && (hc595_time_count_temp_1 <= 100000U))
  267.                                                 {
  268.                                                         hc595_time_count_temp = 100000U;
  269.                                                         hc595_stop_display_flag = 1U;
  270.                                                 }
  271.                                                 break;
  272.                                         case 2U:
  273.                                                 if((hc595_time_count_temp_1 >= 99950U) && (hc595_time_count_temp_1 <= 100000U))
  274.                                                 {
  275.                                                         hc595_time_count_temp = 100000U;
  276.                                                         hc595_stop_display_flag = 1U;
  277.                                                 }
  278.                                                 break;
  279.                                         case 3U:
  280.                                                 if((hc595_time_count_temp_1 >= 99910U) && (hc595_time_count_temp_1 <= 100000U))
  281.                                                 {
  282.                                                         hc595_time_count_temp = 100000U;
  283.                                                         hc595_stop_display_flag = 1U;
  284.                                                 }
  285.                                                 break;
  286.                                         case 4U:
  287.                                                 if((hc595_time_count_temp_1 >= 98000U) && ((hc595_time_count_temp_1 <= 100000U)))
  288.                                                 {
  289.                                                         hc595_time_count_temp = 100000U;
  290.                                                         hc595_stop_display_flag = 1U;
  291.                                                 }
  292.                                                 break;
  293.                                         default:
  294.                                                 break;
  295.                                 }
  296.                                 if(hc595_stop_display_flag == 1U)
  297.                                 {
  298.                                         Hc595_Datas[0] = (hc595_time_count_temp % 1000000U)/100000U;
  299.                                         Hc595_Datas[1] = (hc595_time_count_temp % 100000U)/10000U;
  300.                                         Hc595_Datas[2] = (hc595_time_count_temp % 10000U)/1000U;
  301.                                         Hc595_Datas[3] = (hc595_time_count_temp % 1000U)/100U;
  302.                                         Hc595_Datas[4] = (hc595_time_count_temp % 100U)/10U;
  303.                                         Hc595_Datas[5] = (hc595_time_count_temp % 10U)/1U;
  304.                                 }
  305.                         }
  306.                         
  307.                         Hc595_Count = 0U;
  308.                         
  309.                         break;
  310.                
  311.                 default:
  312.                         break;
  313.         }
  314.         
  315.         Hc595LedDisplayN();//数据显示处理
  316. }
复制代码




  1. #include "stc15w408as.h"

  2. #include "hc595.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "timer0.h"

  6. int main(void)
  7. {
  8.         Timer0Init();
  9.         KeyInit();
  10.         
  11.         SYS_INTERUPT_EN();
  12.         while(1)
  13.         {
  14.                 //定时器0处理
  15.                 if(Timer0CheckIntFlag() == 1U)
  16.                 {
  17.                         Timer0ClearIntFlag();
  18.                         //KeyInitTimeOutHandle();
  19.                         //Hc595TimerCountHandle();
  20.                 }
  21.                 //按键处理
  22.                 if(KeyCheckUpDownStatus() == 1U)
  23.                 {
  24.                         KeyClearUpDownFlag();//清除按键标志
  25.                         KeyHandle();                        
  26.                 }
  27.                
  28.                 //数码管显示处理
  29.                
  30.         }
  31.         return 0U;
  32. }

复制代码

所有资料51hei提供下载:
STC15W408AS_V1.3.zip (124.7 KB, 下载次数: 157)
回复

使用道具 举报

ID:753786 发表于 2020-5-19 13:06 | 显示全部楼层
谢谢分离,,,我正好需要
回复

使用道具 举报

ID:574338 发表于 2022-3-18 14:08 | 显示全部楼层
优秀的电子作品,值得学习
回复

使用道具 举报

ID:796531 发表于 2022-3-31 20:31 | 显示全部楼层
谢谢分享,我正好需要这个测试
回复

使用道具 举报

ID:634830 发表于 2022-6-11 20:55 | 显示全部楼层
原理图有吗
回复

使用道具 举报

ID:155424 发表于 2022-6-12 17:39 | 显示全部楼层

优秀的电子作品,值得学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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