<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                【113.1 動態掃描的數碼管。】 ![](https://img.kancloud.cn/d1/98/d19803e327fa494dce4ab72902e02129_285x371.png) 上圖113.1.1 數碼管 上一節,看到打開顯示的數碼管右起第1個(com4)和第3個(com2)在任意時刻顯示的數字是一樣的,為什么?因為四個數碼管的8個段碼a,b,c,d,e,f,g,h所連接的單片機IO口是共用的,如果把四個數碼管全部打開(com1,com2,com3,com4全部輸出低電平),會發現四個數碼管在任意時刻顯示的四個數字也是一樣的!實際應用中,要四個數碼管能各自獨立顯示不同的數字,就需要用到“分時動態掃描”的方式。所謂分時,就是在任意時刻只能顯示其中一個數碼管(某個com輸出低電平),其它三個數碼管關閉(其它三個com輸出高電平),每個數碼管顯示停留的時間固定一致并且非常短暫,四個數碼管依次循環的切換顯示,只要切換畫面的速度足夠快,人的視覺就分辨不出來,感覺八個數碼管是同時亮的(實際不是同時亮),跟動畫片“1秒鐘動態切換顯示多少幅畫面”的原理一樣。現在編寫一個程序例子,四個數碼管要顯示四個不同的數字“1234”,程序代碼如下: \#include "REG52.H" /\* 注釋一: \* SCAN\_TIME是每個數碼管停留顯示的短暫時間。這里稱為“掃描時間”。這個時間既不能太長也不能 \* 太短,要調試到恰到好處。太長,則影響其它數碼管的顯示,會讓人覺得畫面不連貫不是同時亮; \* 太短,又會影響顯示的亮度。具體的時間應該根據實際項目不斷調試修正而得到最佳顯示的數值。 \*/ \#define SCAN\_TIME 1 void T0\_time(); void SystemInitial(void) ; void Delay(unsigned long u32DelayTime) ; void PeripheralInitial(void) ; void DisplayScan(void); //數碼管的動態掃描函數,放在定時中斷里。 sbit P1\_0=P1^0; //右起第1位數碼管的公共端com4 sbit P1\_1=P1^1; //右起第2位數碼管的公共端com3 sbit P1\_2=P1^2; //右起第3位數碼管的公共端com2 sbit P1\_3=P1^3; //右起第4位數碼管的公共端com1 //根據原理圖得出的共陰數碼管編碼轉換表,類似于一個字庫表 code unsigned char Cu8DigTable\[\]= { 0x3f, //0 序號0 0x06, //1 序號1 0x5b, //2 序號2 0x4f, //3 序號3 0x66, //4 序號4 0x6d, //5 序號5 0x7d, //6 序號6 0x07, //7 序號7 0x7f, //8 序號8 0x6f, //9 序號9 0x00, //不顯示 序號10 }; volatile unsigned char vGu8ScanTimerFlag=0; //動態掃描的定時器 volatile unsigned int vGu16ScanTimerCnt=0; /\* 注釋二: \* vGu8Display\_Righ\_4,vGu8Display\_Righ\_3,vGu8Display\_Righ\_2,vGu8Display\_Righ\_1,這四個 \* 全局變量用來傳遞每位數碼管需要顯示的數字,作為對上面應用層調用的接口變量。 \*/ volatile unsigned char vGu8Display\_Righ\_4=1; //右起第4位數碼管顯示的變量。這里顯示“1” volatile unsigned char vGu8Display\_Righ\_3=2; //右起第3位數碼管顯示的變量。這里顯示“2” volatile unsigned char vGu8Display\_Righ\_2=3; //右起第2位數碼管顯示的變量。這里顯示“3” volatile unsigned char vGu8Display\_Righ\_1=4; //右起第1位數碼管顯示的變量。這里顯示“4” void main() { SystemInitial(); Delay(10000); PeripheralInitial(); while(1) { } } /\* 注釋三: \* DisplayScan數碼管的動態掃描函數,之所以放在定時中斷里,是因為動態掃描數碼管對時間均勻度 \* 要求很高,如果放在main主函數中,期間稍微出現一些延時滯后或者超前執行的情況,都會導致 \* 數碼管出現“閃爍”或者“忽暗忽亮”的顯示效果。 \*/ void DisplayScan(void) { static unsigned char Su8GetCode; //從編碼轉換表中提取出來的編碼。 static unsigned char Su8ScanStep=1; //掃描步驟 if(0==vGu16ScanTimerCnt) //定時的時間到,切換顯示下一個數碼管,依次動態快速循環切換顯示 { /\* 注釋四: \* 在即將切換顯示到下一個新的數碼管之前,應該先關閉顯示所有的數碼管,避免因關閉不徹底而導致 \* 數碼管某些段位出現“漏光”,也就是數碼管因程序處理不善而出現常見的“鬼影”顯示情況。 \*/ P0=0x00; //輸出顯示先清零,先關閉顯示所有的數碼管 //先關閉所有的com口,先關閉顯示所有的數碼管 P1\_0=1; //右起第1位數碼管的公共端com4,“總開關”關閉,輸出低電平1 P1\_1=1; //右起第2位數碼管的公共端com3,“總開關”關閉,輸出高電平1 P1\_2=1; //右起第3位數碼管的公共端com2,“總開關”關閉,輸出低電平1 P1\_3=1; //右起第4位數碼管的公共端com1,“總開關”關閉,輸出高電平1 switch(Su8ScanStep) { case 1: //顯示右起第1個數碼管 Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_1\]; //從編碼轉換表中提取出來的編碼。 P0=Su8GetCode; //段碼端輸出需要顯示的編碼 P1\_0=0; //右起第1位數碼管的公共端com4,“總開關”打開,輸出低電平0 P1\_1=1; //右起第2位數碼管的公共端com3,“總開關”關閉,輸出高電平1 P1\_2=1; //右起第3位數碼管的公共端com2,“總開關”關閉,輸出高電平1 P1\_3=1; //右起第4位數碼管的公共端com1,“總開關”關閉,輸出高電平1 break; case 2: //顯示右起第2個數碼管 Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_2\]; //從編碼轉換表中提取出來的編碼。 P0=Su8GetCode; //段碼端輸出需要顯示的編碼 P1\_0=1; //右起第1位數碼管的公共端com4,“總開關”關閉,輸出高電平1 P1\_1=0; //右起第2位數碼管的公共端com3,“總開關”打開,輸出低電平0 P1\_2=1; //右起第3位數碼管的公共端com2,“總開關”關閉,輸出高電平1 P1\_3=1; //右起第4位數碼管的公共端com1,“總開關”關閉,輸出高電平1 break; case 3: //顯示右起第3個數碼管 Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_3\]; //從編碼轉換表中提取出來的編碼。 P0=Su8GetCode; //段碼端輸出需要顯示的編碼 P1\_0=1; //右起第1位數碼管的公共端com4,“總開關”關閉,輸出高電平1 P1\_1=1; //右起第2位數碼管的公共端com3,“總開關”關閉,輸出高電平1 P1\_2=0; //右起第3位數碼管的公共端com2,“總開關”打開,輸出低電平0 P1\_3=1; //右起第4位數碼管的公共端com1,“總開關”關閉,輸出高電平1 break; case 4: //顯示右起第4個數碼管 Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_4\]; //從編碼轉換表中提取出來的編碼。 P0=Su8GetCode; //段碼端輸出需要顯示的編碼 P1\_0=1; //右起第1位數碼管的公共端com4,“總開關”關閉,輸出高電平1 P1\_1=1; //右起第2位數碼管的公共端com3,“總開關”關閉,輸出高電平1 P1\_2=1; //右起第3位數碼管的公共端com2,“總開關”關閉,輸出高電平1 P1\_3=0; //右起第4位數碼管的公共端com1,“總開關”打開,輸出低電平0 break; } Su8ScanStep++; if(Su8ScanStep>4) //如果掃描步驟大于4,繼續從第1步開始掃描 { Su8ScanStep=1; } vGu8ScanTimerFlag=0; vGu16ScanTimerCnt=SCAN\_TIME; vGu8ScanTimerFlag=1; //啟動新一輪的定時器 } } void T0\_time() interrupt 1 { DisplayScan(); //數碼管的動態掃描函數 if(1==vGu8ScanTimerFlag&&vGu16ScanTimerCnt>0) //數碼管顯示切換時間的定時器 { vGu16ScanTimerCnt--; } TH0=0xfc; TL0=0x66; } void SystemInitial(void) { //初始化上電瞬間數碼管的狀態,關閉顯示所有的數碼管 P0=0x00; P1\_0=1; //右起第1位數碼管的公共端com4,“總開關”關閉,輸出低電平1 P1\_1=1; //右起第2位數碼管的公共端com3,“總開關”關閉,輸出高電平1 P1\_2=1; //右起第3位數碼管的公共端com2,“總開關”關閉,輸出低電平1 P1\_3=1; //右起第4位數碼管的公共端com1,“總開關”關閉,輸出高電平1 TMOD=0x01; TH0=0xfc; TL0=0x66; EA=1; ET0=1; TR0=1; } void Delay(unsigned long u32DelayTime) { for(;u32DelayTime>0;u32DelayTime--); } void PeripheralInitial(void) { }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看