新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機實習報告——點陣的動態顯示

        單片機實習報告——點陣的動態顯示

        作者: 時間:2016-11-24 來源:網絡 收藏
        一、功能介紹

        程序實現字幕不同方向,不同速度滾動顯示的效果,字幕滾動方向和速度可以通過鍵盤操作改變。
        當出現靜態笑臉圖案時,可以操作鍵盤,鍵盤按下時,會聽到蜂鳴提示音。此時按下第一個或第二個鍵,分別顯示向左和向上的“小”“石”“山”“莊”和一個笑臉的滾動字幕的顯示,當再次出現靜態的現笑臉時,按下第三個或第四個鍵,分別降低和提高字幕滾動的速度。然后,可以再次按下第一個或第二個鍵,來檢測改變速度后字幕滾動的效果。

        二、硬件原理即實現
        有關部分的電路圖如下:



        有關部分電路說明:
        點陣顯示部分:CPU的P0.0~P0.7口接8*8LED點陣的COM1~COM8端,控制點陣行的顯示;P2.0~P2.7口通過74HC573接8*8LED點陣的RED1~RED8,存放點陣每行顯示的數據。從程序中獲取數據后控制點陣的顯示。COM端為0,表示該行可能亮起;RED端為1,表示某行該列亮。
        按鍵實現部分:CPU的P3.2~P3.5口分別接KEY1~KEY4,用于接收從鍵盤輸入的控制信息。KEY等于0,表示該按鍵按下;否則,沒有按下。
        蜂鳴器部分:CPU的P3.7接蜂鳴器的BEE口,用于控制蜂鳴器。低電平蜂鳴器蜂鳴,高電平安靜。

        一、軟件原理及實現

        1.整體思路
        主程序用while循環執行顯示和幾個分支語句,實現用鍵盤對滾動方向和滾動速度的控制。
        滾動效果原理類似動畫片的原理,逐屏顯示錯位一行或一列的字幕,從而達到橫向或縱向滾動的效果。橫向滾動的實現只需將RED端的數據向右和向左移位,并將每次移位后的數據存儲于中間變量中,用于顯示輸出。縱向滾動的實現需要循環控制輸出數據的起始位置,每次循環輸出的起始位置向后移一個元素,從而實現逐行向上滾動的效果。
        用一個全局變量來控制滾動速度,該全局變量可以通過鍵盤的操作增加或減小,從而實現鍵盤控制速度。
        程序特點:主程序分別調用子程序,子程序再調用子程序,最多達到了調用三層子程序。這樣的子程序嵌套調用可以提高程序代碼的重用率,同時使主程序看起來簡練、清晰。例如,程序中實現向左滾動的部分調用了函數disp_moveleft函數,該函數又分別調用了adjust_moveright和adjust_moveleft函數,用于分別實現逐列顯示出完整的字符和字符顯示完全后,逐列左移直到全部移出。

        具體的程序部分功能參見程序源代碼中的注釋。

        2.程序大體流程圖如下:




        3.程序原代碼如下:
        #include
        #include
        uchar code sz[][8]={
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //null
        0x08,0x08,0x08,0x 2a,0x49,0xa8,0x18,0x08, //小
        0xff,0x10,0x10,0x3e,0x52,0x92,0x12,0x1e, //石
        0x08,0x08,0x08,0x08,0x49,0x49,0x49,0x7f, //山
        0x08,0x3f,0x20,0x24,0x2e,0x24,0x44,0x9f, //莊
        0x00,0x42,0xA5,0x00,0x00,0xff,0x42,0x3C, //smile
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //null
        };
        uchar code smile[][8]={
        0x00,0x00,0xa5,0x42,0x00,0x00,0x24,0x18,
        0x00,0x00,0xe7,0x00,0x00,0x3c,0x42,0x3c,
        0x00,0x42,0xA5,0x00,0x00,0xff,0x42,0x3C
        };
        uchar temp[8]={0}; //用于臨時存放某一時刻屏幕上顯示的字符或字符某部分的圖案
        uchar time=5; //用于控制速度
        void delayms(uchar x) //延時一段時間(具體由參數而定)
        {
        uchar i;
        uint16 j;
        for(i=x;i>0;i--)
        for(j=5000;j>0;j--);
        }
        void delay()
        {
        uchar i;
        for(i=150;i>0;i--);
        }
        void disp_dat(uchar x) //顯示一屏
        {
        uchar i,j,k,l;
        for(j=x;j>0;j--)
        {
        for(k=3;k>0;k--)
        {
        l=0xfe;
        for(i=0;i<8;i++)
        {
        P2=0;
        P0=l;
        P2=temp[i];
        delay();
        l<<=1;
        l++;
        }
        }
        }
        }

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 项城市| 石棉县| 铁岭县| 义马市| 诸暨市| 衡水市| 衡阳市| 马关县| 依安县| 莱阳市| 德兴市| 丹阳市| 龙岩市| 濉溪县| 吉林市| 忻州市| 新竹县| 神木县| 开封县| 华安县| 吕梁市| 兴海县| 梓潼县| 鄂尔多斯市| 梁平县| 汾阳市| 建始县| 依安县| 双流县| 教育| 遂昌县| 大新县| 新营市| 睢宁县| 孟津县| 泌阳县| 平乐县| 巴塘县| 班戈县| 芦山县| 林州市|