1. <span id="4x4v6"></span>

    1. <button id="4x4v6"><acronym id="4x4v6"></acronym></button>

      <tbody id="4x4v6"></tbody>

      <dd id="4x4v6"><pre id="4x4v6"></pre></dd>

      當前位置 博文首頁 > Moqim的博客:單片機學習(4——數碼管顯示)

        Moqim的博客:單片機學習(4——數碼管顯示)

        作者:[db:作者] 時間:2021-09-26 09:51

        注:此單片機型號為STC15F2K60S2.

        原理

        來源:我自己:)
        STC15F2K60S2的數碼管是八位數碼管,首先先看他們的接口。
        com接口:位選接口,用來選擇第1—8位數碼管,一次只能選中一個。當com接口為1時,選中。
        a——dp接口:段選接口,用來選擇數碼管上的對應橫豎LED燈管。當為0時,選中。dp為右下角的點。
        注:所有的數碼管的a—dp接口都是連在一起的。

        來源:我自己:)
        位選
        以第一個數碼管為例,要選中第一個數碼管,就要使得com1為1,可控管腳為P00—P07,所以要輸入P00為高電平。為了讓P00能夠影響到com1,就要使得鎖存器M74HC573M1R導通,即要讓管腳LE為高電平。又管腳LE與Y6C連接,所以Y6C也為高電平。
        圖片來源:我自己:)
        又Y6C連接了一個或非門,或非門的輸入端為Y6和WR。因為WR已用跳線帽與GND連接在了一起,GND為接地,所以WR為0(低電平)。

        l來源:我自己:)

        根據或非門邏輯表格:

        Y6	      WR	   Y6C
        0	       0	     1
        0          1   	     0
        1	       0	     0
        1	       1	     0
        

        所以,當Y6C為0時,Y6為1;當Y6C為1時,Y6為0.
        所以,要使得Y6C為高電平,Y6就要為低電平,即Y6為0.
        來源:我自己:)
        又Y6是由74HC138位譯碼器的輸入端A、B、C來控制,以C、B、A為邏輯順序,CBA組成二進制數,來選中Y0—Y7,被選中者即為低電平。

        所以,要使得Y6為低電平,CBA要為110.

        另外,由于P0口是復用的,意味著也要控制別的器件,所以如果一直讓LE為高,那么就在控制別的器件的時候就會影響到LED,所以在鎖存器導通后,應該截止保存住它的狀態。

        段選
        以點亮數字“1”為例,當要點亮數字“1”時,‘b1’‘c1’被選中,為低電平,其余則為高電平。
        來源:我自己:)
        由于’a1’—‘dp1’與‘a’—‘dp’相連,a’—‘dp’又通過鎖存器M74HC573M1R與P0口相連。
        來源:我自己:)
        所以,要選中’b’‘c’,則P0=0xF9. //1111 1001
        且還要鎖存器導通,即LE=1,即Y7C=1.
        在這里插入圖片描述
        來源:我自己:)
        又Y7C通過或非門與Y7相連,所以Y7為0,所以CBA為111.

        整合邏輯:
        段選:
                com1 -> P0 = 0x01 ->LE=1 -> Y6C=1 -> 
              Y6=0 -> CBA=110 ->鎖存CBA = 000
          
        位選:
               valus = 1 -> 選中b,c -> P0 = 0xF9 -> LE=1 -> 
               Y7C=1 -> Y7=0 -> CBA=111 ->鎖存CBA = 000
        

        代碼

        來源:藍橋杯官方。

        "seg.c"

        #include "seg.h"
        // 顯示轉換
        void Seg_Tran(unsigned char *pucSeg_Buf, unsigned char *pucSeg_Code)
        {
          unsigned char i, //i為段選數,com i
          j=0, temp;
        
          for(i=0; i<8; i++, j++)
          {
            switch(pucSeg_Buf[j])
            { // 低電平點亮段,段碼[MSB...LSB]對應碼順序為[dp g f e d c b a] //LSB最低有效位和MSB最高有效位
              case '0': temp = 0xc0; break;
              case '1': temp = 0xf9; break;
              case '2': temp = 0xa4; break;
              case '3': temp = 0xb0; break;
              case '4': temp = 0x99; break;
              case '5': temp = 0x92; break;
              case '6': temp = 0x82; break;
              case '7': temp = 0xf8; break;
              case '8': temp = 0x80; break;
              case '9': temp = 0x90; break;
              case 'A': temp = 0x88; break;
              case 'B': temp = 0x83; break;
              case 'C': temp = 0xc6; break;
              case 'D': temp = 0xA1; break;
              case 'E': temp = 0x86; break;
              case 'F': temp = 0x8E; break;
              case 'H': temp = 0x89; break;
              case 'L': temp = 0xC7; break;
              case 'N': temp = 0xC8; break;
              case 'P': temp = 0x8c; break;
              case 'U': temp = 0xC1; break;
              case '-': temp = 0xbf; break;
              case ' ': temp = 0xff; break;
              default: temp = 0xff;
            }	
            if(pucSeg_Buf[j+1] == '.')
            {
              temp = temp&0x7f;
              j++;
            }
            pucSeg_Code[i] = 0xc0;
          }
        }
        // 數碼管顯示
        void Seg_Disp(unsigned char *pucSeg_Code, unsigned char ucSeg_Pos)
        {
          P0 = 0xff; 						// 消隱
          P2 = P2 & 0x1F | 0xE0;			// P27~P25清零,再定位Y7C
          P2 &= 0x1F;						// P27~P25清零
        	
          P0 = 1<<ucSeg_Pos; 				// 位選
          P2 = P2 & 0x1F | 0xC0;			// P27~P25清零,再定位Y6C
          P2 &= 0x1F;						// P27~P25清零,鎖存
        	
          P0 = pucSeg_Code[ucSeg_Pos]; 		// 段碼(段選,從段碼數組中選擇需要的字符)
          P2 = P2 & 0x1F | 0xE0;			// P27~P25清零,再定位Y7C
          P2 &= 0x1F;						// P27~P25清零
        }
        
        

        "tim.c"

        #include "tim.h"
        
        void Cls_Peripheral(void)   //關閉外設。
        {
          P0 = 0xFF;
          P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
          P2 &= 0x1F;						// P27~P25清零
          P0 = 0;
          P2 = P2 & 0x1F | 0xA0;			// P27~P25清零,再定位Y5C
          P2 &= 0x1F;						// P27~P25清零
        }
        
        void Led_Disp(unsigned char ucLed)  //LED燈點亮
        { // IO模式(J13-2和J13-3相連)
          P0 = ~ucLed;
          P2 = P2 & 0x1F | 0x80;			// P27~P25清零,再定位Y4C
          P2 &= 0x1F;						// P27~P25清零
        //XBYTE[0x8000] = ~ucLed;			// MM模式(J13-2和J13-1相連)
        }
        
        
        //定時器還沒學,先跳過,可用一個延時函數取代。
        void Timer1Init(void)				// 1毫秒@12.000MHz
        {
          AUXR &= 0xBF;						// 定時器時鐘12T模式
          TMOD &= 0x0F;						// 設置定時器模式
          TL1 = 0x18;						// 設置定時初值
          TH1 = 0xFC;						// 設置定時初值
          TF1 = 0;		 					// 清除TF1標志
          TR1 = 1;			  				// 定時器1開始計時
          ET1 = 1;		  					// 允許定時器1中斷
          EA = 1;		  					// 允許系統中斷
        }
        
        

        main.c

        // 運行程序時,將J13調整為io模式(1-2腳短接)
        #include "tim.h"
        #include "seg.h"
        #include "stdio.h"
        
        unsigned char ucSec, ucLed;
        unsigned char pucSeg_Buf[9],   //字符型段碼數組
         pucSeg_Code[8],               //字符型段碼數組
         ucSeg_Pos;                    //位選數\段選數
        unsigned long ulms;
        // 注意:sprintf()會在字符串后面添加”\0”,所以pucSeg_Buf[]的長度應為9。
        // 如果字符串中包含小數點,pucSeg_Buf[]的長度應為10。
        void main(void)
        {
          Cls_Peripheral();          //關閉外設
          Timer1Init();              //延時函數
        
          while(1)
          {
            sprintf(pucSeg_Buf, "    %04u", (unsigned int)ucSec);   // %u    十進制無符號整數 
            Seg_Tran(pucSeg_Buf, pucSeg_Code);
          }
        }
        
        void Time_1(void) interrupt 3
        {
          ulms++;
          if(!(ulms % 1000))
          {
            ucSec++;
        
            ucLed ^= 1;
            Led_Disp(ucLed);
          }
        	
          Seg_Disp(pucSeg_Code, ucSeg_Pos);	
          if(++ucSeg_Pos == 8) ucSeg_Pos = 0;
        }
        
        

        注釋代碼參考博客:
        @love、reading——C 字符串函數 sprintf()、snprintf() 詳解
        @myyllove——C/C++ %s %d %u 基本概念與用法

        cs
      英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 C# 顯示、隱藏窗口對應的任務欄 PyCharm插件開發實踐之PyGetterAndSetter詳解 基于IntelliJ IDEA/Android Studio插件開發指南(推薦) 解決啟用 Spring-Cloud-OpenFeign 配置可刷新項目無法啟動的問題 深入淺析Go中三個點(...)用法 VeriSign要求注冊商對Com域名資料進行審查 聊聊golang怎么調用php7 新鮮出爐的Go面試題(百度和米哈游) php8的注解你了解多少? 網站SEO優化選擇關鍵詞的5大注意事項 seo引流技巧:思維與實操層面上的內容+渠道方是推廣優化的主導 使用spring框架實現數據庫事務處理方式 SpringBoot默認使用HikariDataSource數據源方式 spring boot中配置hikari連接池屬性方式 Feign 使用HttpClient和OkHttp方式 Spring @Async無法實現異步的解決方案 站內鏈接對蜘蛛收錄的負面影響以及對策 免費網站推廣訣竅 多干體力活兒 php中如果刪除cookie php怎么生成100個不同的隨機數
      成本人片无码中文字幕免费

      1. <span id="4x4v6"></span>

        1. <button id="4x4v6"><acronym id="4x4v6"></acronym></button>

          <tbody id="4x4v6"></tbody>

          <dd id="4x4v6"><pre id="4x4v6"></pre></dd>