新聞中心

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

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

        作者: 時間:2016-11-24 來源:網絡 收藏

        void adjust_moveleft(uchar x,uchar *dat) //第i個字符逐列左移
        {
        uchar j,k;
        for(j=0;j<8;j++)
        {
        k=*dat;
        k<<=x;
        temp[j]=k;
        dat++;
        }
        }
        void adjust_moveright(uchar x,uchar *dat) //第i個字符顯示出x列后存儲在temp數組中
        {
        uchar j,k;
        for(j=0;j<8;j++)
        {
        k=*dat;
        k>>=x;
        temp[j]=k;
        dat++;
        }
        }
        void disp_moveleft(uchar *dat)
        {
        uchar i,t;
        for(i=8;i>0;i--) //逐列顯示出字符
        {
        adjust_moveright(i,dat);
        t=time;
        disp_dat(t);
        }
        for(i=0;i<=8;i++) //字符顯示完全后,逐列左移直到全部移出
        {
        adjust_moveleft(i,dat);
        t=time;
        disp_dat(t);
        }
        }
        void adjust_jingtai(uchar *dat)
        {
        uchar i;
        for(i=0;i<8;i++)
        {
        temp[i]=*dat;
        dat++;
        }
        }
        void disp_moveup(uchar *dat)
        {
        uchar i,j,t;
        for(i=0;i<6;i++)
        {
        for(j=0;j<8;j++)
        {
        dat++;
        adjust_jingtai(dat);
        t=time;
        disp_dat(t);
        }
        disp_dat(30);
        }
        }
        void main()
        {
        while(1)
        {
        uchar j;
        for(j=0;j<8;j++)
        temp[j]=smile[2][j];
        disp_dat(30);
        if(key1==0)
        {
        bee=0;
        delayms(1);
        bee=1;
        delayms(1);
        if(key1==0) //向左滾動
        {
        uchar i;
        for(i=1;i<6;i++)
        {
        disp_moveleft(&sz[i][0]);
        }
        }
        while(key1==0);
        }
        if(key2==0)
        {
        bee=0;
        delayms(1);
        bee=1;
        delayms(1);
        if(key2==0) //向上滾動
        {
        disp_moveup(&sz[0][0]);
        }
        while(key2==0);
        }
        if(key3==0)
        {
        delayms(1);
        if(key3==0) //減速
        {
        time=time+1;
        }
        while(key3==0);
        bee=0;
        delayms(1);
        bee=1;
        }
        if(key4==0)
        {
        delayms(1);
        if(key4==0) //加速
        {
        if(time!=1)
        time=time-1;
        }
        while(key4==0);
        bee=0;
        delayms(1);
        bee=1;
        }
        }
        }

        四、誤差分析及改進

        該實例是控制點陣顯示的程序,不涉及時間,也就沒有時間的誤差。但是主程序中用的是掃描法檢測是否有鍵盤控制輸入,而且掃描過程中還插入了顯示動態笑臉界面的程序段,掃描程序顯得稍有冗長,所以短暫的按鍵可能沒有被程序掃描到。

        為了解決這個問題,可以讓掃描程序變得簡短清晰些,所以,將動態笑臉改為了靜態的笑臉。對鍵盤的操作時間(即按鍵的時間)要適當長些,以便被程序捕捉。為了便于控制時間的長短,在程序中利用了蜂鳴器的功能,一旦按鍵操作被程序掃描到,蜂鳴器蜂鳴,以提示操作者鍵盤操作有效。

        程序不足之處是:
        1.鍵盤的操作不夠靈敏。
        2.只能在一次滾動結束后,即再次出現一個靜態笑臉時才能夠操作鍵盤。

        如果改為中斷法響應鍵盤,或許會更靈敏些。這需要四個中斷服務程序處理按鍵事件。并且把實現不同方向滾動的程序段放在終端服務程序之外,可以解決第二個不足之處,即可以在滾動過程中,響應不同的按鍵。




        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 微博| 当涂县| 桦南县| 平度市| 永康市| 武强县| 济源市| 香格里拉县| 乐昌市| 延边| 苏尼特右旗| 鹤壁市| 工布江达县| 秦安县| 咸阳市| 台江县| 泽库县| 乐至县| 华池县| 眉山市| 威远县| 英德市| 新蔡县| 克什克腾旗| 定边县| 睢宁县| 日土县| 仙桃市| 长白| 开封县| 吉木乃县| 鹰潭市| 乐山市| 页游| 临海市| 栾川县| 新兴县| 凯里市| 瓮安县| 红河县| 那曲县|