欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7099|回復: 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)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩1
回復

使用道具 舉報

沙發
ID:753786 發表于 2020-5-19 13:06 | 只看該作者
謝謝分離,,,我正好需要
回復

使用道具 舉報

板凳
ID:574338 發表于 2022-3-18 14:08 | 只看該作者
優秀的電子作品,值得學習
回復

使用道具 舉報

地板
ID:796531 發表于 2022-3-31 20:31 | 只看該作者
謝謝分享,我正好需要這個測試
回復

使用道具 舉報

5#
ID:634830 發表于 2022-6-11 20:55 | 只看該作者
原理圖有嗎
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
7#
無效樓層,該帖已經被刪除
8#
ID:155424 發表于 2022-6-12 17:39 | 只看該作者

優秀的電子作品,值得學習
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表