SOGO論壇
  登入   註冊   找回密碼
查看: 1253|回覆: 3
列印 上一主題 下一主題

[問題求助] proteus 仿7段顯器 字型不完整 [複製連結]

Rank: 2

狀態︰ 離線
跳轉到指定樓層
1
發表於 2014-5-30 14:44:34 |只看該作者 |倒序瀏覽
http://wenku.baidu.com/view/f721bb6925c52cc58bd6be59.html
我是用這個教學去小修改
數字編是是沒有錯
但是在動態掃描時就出現字型不完整和閃爍的問題



七段顯示器接330R


#include<reg51.h>//文件包含
#define uchar unsigned char
sbit led1=P2^1;//第一只的控制線
sbit led2=P2^0;//第二只的控制線
sbit led3=P2^2;//第三只的控制線
sbit led4=P2^3;//第三只的控制線
sbit K0=P1^0;

#define dig1 led1=0;led2=1;led3=1;led4=1;//只點亮第一只
#define dig2 led1=1;led2=0;led3=1;led4=1;//只點亮第二只
#define dig3 led1=1;led2=1;led3=0;led4=1;//只點亮第三只
#define dig4 led1=1;led2=1;led3=1;led4=0;//只點亮第三只

#define show P0//P0 7段顯示

uchar number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//數碼0~9

uchar one;//個位
uchar ten;//十位
uchar mutipel;//倍數
uchar count;//點數

void delay_ms(unsigned int time)//延1毫秒程序,n是形式參數
{
        unsigned int i,j;
        for(i=time;i>0;i--)//i不??1,一直到i>0?件不成立?止
        for(j=112;j>0;j--)//j不??1,一直到j>0?件不成立?止
        {;}
}

void T0_init(void)
{
        TMOD=0x01;//??工作方式1
        TL0=0x66;//每6ms中?一次
        TH0=0xea;
        TF0=0;//中??志位清零
        ET0=1;//允?定?器0中?
        EA=1;//允??中?
        TR0=1;//??定?器
}

void main(void)
        {
        uchar i,j,k,l;
        T0_init();//定?器0初始化
        i=0;//控制個位數碼
        j=0;//控制十位數碼
        k=0;//控制  倍數
        l=0;//控制  點數
        one=number[0];//上??三位都?示?000
        ten=number[0];
        mutipel=number[0];
        count=number[0];
                while(1)
                {
                if(K0==0)//判?是否有按?被按下
                        {
                        delay_ms(50);//延?消抖
                        if(K0==0)//确?有按?被按下
                        {
                                while(K0==0);//等待按?松?
                                i++;//個位?增
                                one=number;//?示個位
                                if(i==10)//假如個位?10立即向十位?1
                                {
                                        i=0;//個位再?0?始?增
                                        j++;//十位?增
                                        one=number;//?示個位
                                        ten=number[j];//?示十位
                                        if(j==10)//假如十位?10立即向百位?1
                                        {
                                                j=0;//十位再?0?始?增
                                                ten=number[j];//?示十位
                                                k++;//百位?增
                                                mutipel=number[k];//?示百位
                                                if(k==10)//????999?立即??000?新?始?增
                                                {
                                                        i=0;//三位都?示?000
                                                        j=0;
                                                        k=0;
                                                        l=0;
                                                        one=number[0];
                                                        ten=number[0];
                                                        mutipel=number[0];
                                                        count=number[0];
                                                }
                                        }
                        }
                }
        }
}
}

void time_display(void) interrupt 1
{
        static uchar show_bit=1;
        TL0=0x66;//定?器?初始
        TH0=0xea;
        switch(show_bit)
                {
                case 1:
                {
                dig1 //只點亮第一只
                show=mutipel; //百位
                show_bit=2;//下次?中?程序點亮十位
                break;
                }
                case 2:
                {
                dig2 //只點亮第二只
                show=ten; //十位
                show_bit=3;//下次?中?程序點亮百位
                break;
                }
                case 3:
                {
                dig3//只點亮第三只
                show=one; //個位
                show_bit=4;//下次?中?程序點亮個位
                break;
                }
                case 4:
                {
                dig4//只點亮第4只
                show=count; //個位
                show_bit=1;//下次?中?程序點亮個位
                break;
                }
}
}
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

Rank: 5Rank: 5

狀態︰ 離線
2
發表於 2014-6-4 05:49:18 |只看該作者
本帖最後由 begti20 於 2014-6-4 06:10 編輯

                                while(K0==0);//等待按?松?
                                i++;//個位?增
                                one=number;//?示個位
                                if(i==10)//假如個位?10立即向十位?1



number是一個Array 修正成  
one = number[ i ] 就不會出現亂碼
同樣的方式修正後面


        switch(show_bit)
                {
                case 1:
                {
                dig1 //只點亮第一只
                show=mutipel; //百位
                show_bit=2;//下次?中?程序點亮十位
                break;
                }
                case 2:
                {
                dig2 //只點亮第二只
                show=ten; //十位
                show_bit=3;//下次?中?程序點亮百位
                break;
                }
                case 3:
                {
                dig3//只點亮第三只
                show=one; //個位
                show_bit=4;//下次?中?程序點亮個位
                break;
                }
                case 4:
                {
                dig4//只點亮第4只
                show=count; //個位
                show_bit=1;//下次?中?程序點亮個位
                break;
                }

sbit led1=P2^1;//第一只的控制線
sbit led2=P2^0;//第二只的控制線
sbit led3=P2^2;//第三只的控制線
sbit led4=P2^3;//第三只的控制線
sbit K0=P1^0;


為何led1,led2 不按順序?

show_bit=1 顯示 mutipel;//倍數 (mutipel ??)
show_bit=2 顯示 ten
show_bit=3 顯示 one
show_bit=4 顯示 count;//沒有改變(用到)

次序總是怪怪的

顯示的次序是  dig4 dig3 dig2 dig1 --> count one mutiple ten
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 2 感謝您熱心幫助會員解決問題,論壇需要您的.

總評分: 威望 + 2   查看全部評分

Rank: 4

數位軟體勳章

狀態︰ 離線
3
發表於 2014-7-1 08:02:16 |只看該作者
" 模擬軟體 " 有時在模擬 『中斷』會有問題?
因為畢竟 " 模擬  " 是 『假的』,不是真的硬體 CPU
建議買書來參考!可以花費更多的時間慢慢研究 LED display 動態掃瞄顯示,如此才能深刻體會 dynamic scan
mS 的重要性,過長 LED 閃爍,太快 LED 亮度不夠 ( 縮小限流電阻阻值,以期提高流過 LED 電流,增大 LED 亮度 )
這些就是實作的經驗累積!

目前,我不會使用 LED display 動態掃瞄顯示,因為硬體電路繁瑣,軟體細節一大堆!
現在改用 ATMEL AVR ATmega16A 搭配 C compiler CodeVisionAVR ( 因為有現成 LCD module API 可用 )
硬體接線僅需 1 nibble 4 bit data 即可顯示 2 行 20 個字的訊息 ( 數字,英文大小寫,符號 )
20 x 2 LCD module pin 4 RS,pin 5 R/W,pin 6 E, pin 11 DB4,pin 12 DB5,pin 13 DB6,pin 14 DB7
LCD & MCU 間只接 7 條線,太簡單了!又有 API 可以使用,省去編寫底層的程式,又大大提高了產品的附加價值!

Rank: 5Rank: 5

狀態︰ 離線
4
發表於 2014-7-3 05:30:04 |只看該作者
本帖最後由 begti20 於 2014-7-3 05:32 編輯


LCD是完整的模組,比日字掃描顯示簡單又好用
ATMEL AVR ATmega16A功能也比8051強
現在風行的arduino有很多功能,可以跳脫電子背景知識,就能達到微電腦控制的目標
面對這些改變,學習方向及內容都需要調整
但在練功坊裡有用的基本功還是需要的,取捨如何,有其的思考空間

個人認為:
紙杯,玻璃杯,磁杯那一種比較好?
它是不同屬性的器具,你我可依自我所需選擇,沒有好壞和對錯?
請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-4-26 10:44

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部