SOGO論壇

標題: proteus 仿7段顯器 字型不完整 [列印本頁]

作者: grass0423    時間: 2014-5-30 14:44:34     標題: proteus 仿7段顯器 字型不完整

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;
                }
}
}


附件: [電阻圖] 螢幕快照 2014-05-30 下午2.45.10.jpg (2014-5-30 14:40:20, 39.08 KB) / 下載次數 1
https://oursogo.com/forum.php?mod=attachment&aid=ODIwOTM5NXw5MGM2MjBjZnwxNzE0OTAzNzQxfDB8MA%3D%3D

附件: [仿真結果] 螢幕快照 2014-05-30 下午2.44.51.jpg (2014-5-30 14:40:22, 118.27 KB) / 下載次數 3
https://oursogo.com/forum.php?mod=attachment&aid=ODIwOTM5Nnw3ZGM5M2RiY3wxNzE0OTAzNzQxfDB8MA%3D%3D

附件: [完整電路] 螢幕快照 2014-05-30 下午2.44.05.jpg (2014-5-30 14:40:23, 100.06 KB) / 下載次數 4
https://oursogo.com/forum.php?mod=attachment&aid=ODIwOTM5N3w2ZDJmNzY4MXwxNzE0OTAzNzQxfDB8MA%3D%3D
作者: begti20    時間: 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

作者: if8051    時間: 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 可以使用,省去編寫底層的程式,又大大提高了產品的附加價值!
作者: begti20    時間: 2014-7-3 05:30:04

本帖最後由 begti20 於 2014-7-3 05:32 編輯


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

個人認為:
紙杯,玻璃杯,磁杯那一種比較好?
它是不同屬性的器具,你我可依自我所需選擇,沒有好壞和對錯?





歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM