官术网_书友最值得收藏!

3.10 8只數(shù)碼管滾動顯示數(shù)字串

本例電路與此前案例電路相同,但運行時不是一次顯示8位不同數(shù)字,而是僅顯示3位不同數(shù)碼,且實現(xiàn)了3位數(shù)字的滾動顯示效果。

程序設計調試與實訓:

程序將所有待顯示的數(shù)碼10,10,10,10,10,10,10,10,2,9,8存放于Num數(shù)組中,其中10表示黑屏,顯示時取碼過程如下:

當取前8個數(shù)顯示時為全黑;

取第2個數(shù)開始的8個數(shù)時,最后一個是2;

取第3個數(shù)開始的8個數(shù)時,最后兩個是2,9;

取第4個數(shù)開始的8個數(shù)時,最后三個是2,9,8;

取第5個數(shù)開始的8個數(shù)時,會發(fā)現(xiàn)剩下的只有7個。

為解決這個問題,本例將數(shù)組Num看做環(huán)形隊列,從任何一個元素開始取8個元素時,如果后面不足8個數(shù),程序會自動從前面開始繼續(xù)取得其余元素。代碼中(k + j ) % 11即實現(xiàn)了這個功能,它表示從第k個開始取第j個元素,k+j超過最后位置時會自動從第0個元素開始繼續(xù)取值。

主程序中使用了雙重for循環(huán),內層循環(huán)用于8位數(shù)碼管的掃描顯示,包括黑屏部分,外層還添加了for循環(huán),這是為了使每次8位數(shù)碼的掃描顯示重復若干遍,形成一組數(shù)字串的保持顯示效果。

最后一行代碼遞增取值起點k,因為取值起點在雙重循環(huán)后遞增,也就是在同一組數(shù)字刷新顯示若干遍,形成一小段延時后遞增,從而產(chǎn)生滾動顯示效果。

讀者可修改代碼,嘗試改變滾動方向和滾動顯示的數(shù)字個數(shù)。

源程序代碼:

        //-----------------------------------------------------------------
        //  名稱: 8只數(shù)碼管滾動顯示數(shù)字串
        //-----------------------------------------------------------------
        //  說明: 數(shù)碼管向左滾動顯示3個字符構成的數(shù)字串。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #include <intrins.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //數(shù)字0~9的數(shù)碼管段碼,最后一個為黑屏的段碼
        uchar code DSY_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0xFF};
        //程序將下面的數(shù)組看做環(huán)形隊列,顯示從某個數(shù)開始的8個數(shù)(10表示黑屏)
        uchar Num[] = {10,10,10,10,10,10,10,10,2,9,8};
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar i;
          while(x--) for(i = 0; i < 120; i++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar i,j,k,m;
          P0 = 0xFF;
          P2 = 0x00;
          m = 0x80;
          k = 0;
          while(1)
          {
            //刷新若干次,保持一段時間的穩(wěn)定顯示
            for (i = 0;i < 15;i++)
            {
                for(j = 0; j < 8; j++)
                {
                m = _crol_(m,1);
                P2 = m;
                //采用環(huán)形取法,從第k個開始取第j個
                P0 = DSY_CODE[ Num[ (k + j) % 11 ] ];
                DelayMS(2);
                }
            }
            //環(huán)形隊列首指針k遞增,Num的下標范圍為0~10,因此對11取余
            k = ( k + 1) % 11;
          }
        }
主站蜘蛛池模板: 秭归县| 陈巴尔虎旗| 隆昌县| 玛纳斯县| 乐安县| 盐源县| 马公市| 富锦市| 慈溪市| 新安县| 顺昌县| 亳州市| 喀喇沁旗| 洪湖市| 泾阳县| 竹溪县| 鲁山县| 台安县| 凤城市| 南木林县| 博乐市| 景洪市| 巴青县| 汝南县| 宜昌市| 建瓯市| 恭城| 兴城市| 临沧市| 胶州市| 洞口县| 阿巴嘎旗| 炎陵县| 且末县| 云和县| 江安县| 温州市| 四会市| 连山| 肃北| 常熟市|