痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 6976|回復: 20

VFD驅動IC PT6312驅動程式

[複製鏈接]
發表於 2011-11-4 20:07:46 | 顯示全部樓層 |閱讀模式
本帖最後由 antlu 於 2011-11-4 08:12 PM 編輯

提供大家參考,或許可以簡化 VFD時鐘的製作,我只是把 命令寫入 和資料寫入PO出來,因為這是今天的成果,先跟大家分享...作品八字還沒有一撇呢!!

照片PO反了 請從最後一張往回看

VFD驅動31 [800x600].JPG

VFD驅動30 [800x600].JPG

VFD驅動29 [800x600].JPG

VFD驅動28 [800x600].JPG

VFD驅動27 [800x600].JPG

VFD驅動26 [800x600].JPG

VFD驅動25 [800x600].JPG

VFD驅動24 [800x600].JPG

VFD驅動23 [800x600].JPG

VFD驅動22 [800x600].JPG

VFD驅動21 [800x600].JPG

VFD驅動20 [800x600].JPG

VFD驅動19 [800x600].JPG

VFD驅動18 [800x600].JPG

VFD驅動17 [800x600].JPG

VFD驅動16 [800x600].JPG

VFD驅動15 [800x600].JPG

VFD驅動14 [800x600].JPG

VFD驅動13 [800x600].JPG

VFD驅動11 [800x600].JPG



VFD驅動08 [800x600].JPG

VFD驅動03 [800x600].JPG

VFD驅動02 [800x600].JPG



/*VFD專用IC練習 20111104 顯示問題澄清 全部送0x0f 看是時序問題過快還是字位置 開始的位置從00 開始  另外確認連續位址增加的模式 */
#include<reg52.h>
//--------------------pt6312-----------------------
sbit STB=P3^3; // pt6312 strobe
sbit DIN=P3^4; // pt6312 data       
sbit CLK=P3^5; // pt6312 clock       
unsigned char TempData[12]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0,0xff,0,0,0};//第一步全都沒變
unsigned char adr;
unsigned char cmd1;
unsigned char cmd2;
unsigned char cmd3;
unsigned char cmd4;
bit Dat_flag;//data flag 不需要 stb變為hi
//STB動作
#define STB_CLR        STB=0//电平置低
#define STB_SET        STB=1//电平置高

//DIN 動作
#define DIN_CLR        DIN=0//电平置低
#define DIN_SET        DIN=1//电平置高
//#define IO_R        SDA  //电平读取

// CLK信号
#define CLK_CLR          CLK=0//时钟信号
#define CLK_SET          CLK=1//电平置高


void PT6312_Write(unsigned char qdata)// 適用於命令
{
unsigned char k;
STB_CLR; //初始
for(k=0;k<8;k++)
  {
    CLK_CLR;       
   if(qdata & 0x01)
     {
       DIN_SET;
     }
   else
      {
        DIN_CLR;
       }
    CLK_SET;
   qdata>>=1;
  }

  if (Dat_flag)
  {
   CLK_CLR;
   }
   else
   {
    STB_SET;
        }
         CLK_SET;//5 pulse time delay
          CLK_SET;//5 pulse time delay
           CLK_SET;//5 pulse time delay
            CLK_SET;//5 pulse time delay
                 CLK_SET;//5 pulse time delay
}
/*-------------------------------------------


//----------------------------------------------*/

void PT6312_Init(void)
{
CLK_SET; //初始設為 HI
STB_SET; //初始設為 HI
PT6312_Write (cmd1);//CMD1 設定寫入
}


void main(void)//
{
   unsigned char i;
PT6312_Init();
cmd1=0x02 ;//6 dig 16 segment
cmd2=0x40 ;
Dat_flag=1;//
cmd3=0xc0 ;//start addr 00h
cmd4=0x8a ;//
while(1) //關掉會全亮度power off無效
{
   Dat_flag=0;//
  PT6312_Write (cmd2);//CMD2 每字需變更位址 48 test mode work but only one word [no work 4c..44]
   Dat_flag=1;//
  PT6312_Write (cmd3);//CMD3 start address0x01 改變起始位址家1 [no work c1..c3]
//  Dat_flag=1;//
  for (i=0;i<12;i++)
{

  adr=TempData;
  PT6312_Write (adr);
  }
//-------
  STB_SET;
         CLK_SET;//5 pulse time delay
          CLK_SET;//5 pulse time delay
           CLK_SET;//5 pulse time delay
            CLK_SET;//5 pulse time delay
                 CLK_SET;//5 pulse time delay
//--------
   Dat_flag=0;//
PT6312_Write (cmd1);//CMD1 6dig 16segment [no work02..01]
PT6312_Write (cmd4);//CMD4 6/16 pulse width dim control  8a..83 work
}
}
//指令 2 資料設定參數
//指令 3 位址內資料寫入
//指令 4 顯示輸出以及亮度調整
VFD驅動12 [800x600].JPG
發表於 2011-11-5 00:42:31 | 顯示全部樓層
這個問題牽涉到軟硬體對應問題,最好的方法是將VFD拆下來測量,將腳位功能定義清楚,再將線路圖畫出來,這樣才知道哪個字節對應到顯示記憶體哪個位元......這很花時間,也就是要確認下面這張表是如何對應硬體的:
6312.jpg
 樓主| 發表於 2011-11-5 08:23:26 | 顯示全部樓層
ysc 發表於 2011-11-5 12:42 AM static/image/common/back.gif
這個問題牽涉到軟硬體對應問題,最好的方法是將VFD拆下來測量,將腳位功能定義清楚,再將線路圖畫出來,這 ...

YSC大:
   我目前是反過來寫入資料到相關位址以得到結果.只是,我的習慣是用傳統的掃描技巧,而這IC是設計用於絕對位址BIT對應顯示,這不知道有沒有好的軟體技巧?比如說 第一個字的a段在00H的BIT0 第二字的a段在00H的BIT7 第三字的a段在01H的BIT6...
發表於 2011-11-5 12:33:26 | 顯示全部樓層
我還沒去研究這個IC的功能,不過看你的敘述,也許你可以用查表法做.
可能要用陣列,再到陣列內抓資料,另外要設顯示用的buffer,把要用的顯示字段資料抓到後,先做OR功能,再送出.

只是不知這樣的方式,對這個IC是否可以用...:sam12
 樓主| 發表於 2011-11-5 12:40:29 | 顯示全部樓層
scottwang 發表於 2011-11-5 12:33 PM static/image/common/back.gif
我還沒去研究這個IC的功能,不過看你的敘述,也許你可以用查表法做.
可能要用陣列,再到陣列內抓資料,另外要設 ...

SCOTTWANG大:
   感謝!! 最近在找尋這樣的寫法,比較擔心的事..怕記憶體不足..
發表於 2011-11-5 12:47:29 | 顯示全部樓層
本帖最後由 ysc 於 2011-11-5 12:49 PM 編輯
antlu 發表於 2011-11-5 08:23 AM static/image/common/back.gif
YSC大:
   我目前是反過來寫入資料到相關位址以得到結果.只是,我的習慣是用傳統的掃描技巧,而這IC是設計 ...


要用軟體反向測試出硬體對應也是可以的,但也很花時間......這Display Ram共有22Byte,每次只寫入其中1個Byte的1個Bit,然後看是哪個字節(或圖示)亮起來,逐一測試逐一記錄。

但前提要知到硬體是定義在幾個Segment幾個Digit?普誠這系列IC都有彈性規劃字元數與字節數,這部份要依照硬體來初始化,往下的測試才有意義,所以結論是適度查電路是有必要的。
發表於 2011-11-5 13:03:08 | 顯示全部樓層
antlu 發表於 2011-11-5 12:40 PM static/image/common/back.gif
SCOTTWANG大:
   感謝!! 最近在找尋這樣的寫法,比較擔心的事..怕記憶體不足..

YSC說Display Ram共有22Byte,若是MCU內的ram若能擠出這個空間,用記憶體對應法,或許可行,再不然換大一些ram的MCU.

若不行的話,找個小一點的串列式的ram來用,8pin應該所佔體積也不大,只是感覺用串列式,使用上較麻煩,但誰叫它有體積優勢呢.
 樓主| 發表於 2011-11-5 17:30:21 | 顯示全部樓層
ysc 發表於 2011-11-5 12:47 PM static/image/common/back.gif
要用軟體反向測試出硬體對應也是可以的,但也很花時間......這Display Ram共有22Byte,每次只寫入其中1個 ...

ysc大;
   我的是 6*16 目前幾乎都已經查出來了,實際上顯示的(數字)9個 9*8=72個BIT位置 也就是有9個字的位址. 每一個字需要有10個變化 所以應該有90個BYTE,上次用搖搖棒軟體時後發現 內建TABLE 不佔RAM記憶體 空間,看樣子好像只有這整方法才可以做得到... LEGION大說的沒錯,要改寫 驅動程式 是一件麻煩的事(但也具有挑戰性!!)
 樓主| 發表於 2011-11-5 17:32:22 | 顯示全部樓層
scottwang 發表於 2011-11-5 01:03 PM static/image/common/back.gif
YSC說Display Ram共有22Byte,若是MCU內的ram若能擠出這個空間,用記憶體對應法,或許可行,再不然換大一些ra ...

SCOTTWANG大:
   您說到我的痛處了!! 24C02 串列RAM 還沒有學!! 到現在 RAM A/D RS232 這三塊還沒摸呢!!
發表於 2011-11-5 17:53:11 | 顯示全部樓層
antlu 發表於 2011-11-5 05:32 PM static/image/common/back.gif
SCOTTWANG大:
   您說到我的痛處了!! 24C02 串列RAM 還沒有學!! 到現在 RAM A/D RS232 這三塊還沒摸呢!! ...

用6264或62256較簡單,用電池供電做記憶也是可以維持很久.
發表於 2011-11-5 19:56:57 | 顯示全部樓層
antlu 發表於 2011-11-5 05:30 PM static/image/common/back.gif
ysc大;
   我的是 6*16 目前幾乎都已經查出來了,實際上顯示的(數字)9個 9*8=72個BIT位置 也就是有9個字的 ...

[每一個字需要有10個變化 所以應該有90個BYTE]----這段不懂?
 樓主| 發表於 2011-11-5 23:54:50 | 顯示全部樓層
ysc 發表於 2011-11-5 07:56 PM static/image/common/back.gif
[每一個字需要有10個變化 所以應該有90個BYTE]----這段不懂?

因為 茶表方式 每個數字 都要0~9 於是就需要 90個位置
 樓主| 發表於 2011-11-5 23:56:07 | 顯示全部樓層
scottwang 發表於 2011-11-5 05:53 PM static/image/common/back.gif
用6264或62256較簡單,用電池供電做記憶也是可以維持很久.

又一個新IC 6264...頭會炸掉..
發表於 2011-11-6 00:26:33 | 顯示全部樓層
本帖最後由 scottwang 於 2011-11-6 12:28 AM 編輯

6264(8KB),62256(32KB)是8bits並聯傳輸的SRAM,所以只要硬體接好,軟體使用很簡單,但它是以外部記憶體方式讀取的,就是指定位址,再存入或讀取資料.

6264不一定買得到,62256應該還可以.

8051與62256的界面.
http://www.8052.com/images/sbc/schematics/sbc13_memory.gif
http://www.8052.com/sbc/schematics/

62256 datasheet:
http://www.datasheetcatalog.org/datasheets/166/247283_DS.pdf
發表於 2011-11-6 00:41:43 | 顯示全部樓層
本帖最後由 ysc 於 2011-11-6 12:44 AM 編輯
antlu 發表於 2011-11-5 11:54 PM static/image/common/back.gif
因為 茶表方式 每個數字 都要0~9 於是就需要 90個位置


那也就這片VFD每個數字的同1個SEGMENT不是接在一起?如果真的是這樣那程式寫起來很累耶!還要判斷是在哪位數去查不同的解碼表?VFD廠會這樣字找麻煩嗎?會不會是有美麗的誤會?
發表於 2011-11-6 00:44:17 | 顯示全部樓層
antlu 發表於 2011-11-5 11:56 PM static/image/common/back.gif
又一個新IC 6264...頭會炸掉..

傳統SRAM不必考慮了啦,與S52連接就要佔掉很多腳位,還要加個74LS373,I/O腳不夠用又要擴充....
發表於 2011-11-6 01:22:02 | 顯示全部樓層
antlu 發表於 2011-11-5 05:32 PM static/image/common/back.gif
SCOTTWANG大:
   您說到我的痛處了!! 24C02 串列RAM 還沒有學!! 到現在 RAM A/D RS232 這三塊還沒摸呢!! ...

24C02 = Serial EEPROM.
  
Serial SRAM 8K~32K
23A640 8 KB (64 Kb) 1.7-1.95V 16 -40 to +85oC SOIC, PDIP, TSSOP
23K640 8 KB (64 Kb) 2.7-3.6V 20 -40 to +85oC SOIC, PDIP, TSSOP
23A256 32 KB (256 Kb) 1.7-1.95V 16 -40 to +85oC SOIC, PDIP, TSSOP
23K256 32 KB (256 Kb) 2.7-3.6V 20 -40 to +85oC SOIC, PDIP, TSSOP

http://ww1.microchip.com/downloads/en/DeviceDoc/22127a.pdf

23A640 8KB,23K640 8KB,datasheet
http://www.es.co.th/Schemetic/PDF/23A640-23K640.PDF
 樓主| 發表於 2011-11-7 23:22:01 | 顯示全部樓層
scottwang 發表於 2011-11-6 01:22 AM static/image/common/back.gif
24C02 = Serial EEPROM.
  
Serial SRAM 8K~32K

scottwang大:
   不用外加記憶體了,已經可以顯示了,只是這個VFD顯示器,很麻煩!! 許多段都接在一起 第8 & 第7 字的a,f段接在一起,第5 & 第6字 的c,e段接在一起 真是.....
發表於 2011-11-8 01:05:31 | 顯示全部樓層
antlu 發表於 2011-11-7 11:22 PM static/image/common/back.gif
scottwang大:
   不用外加記憶體了,已經可以顯示了,只是這個VFD顯示器,很麻煩!! 許多段都接在一起 第8 &  ...

阿乾兄:
先恭喜你了.
那最後是否有用記憶體對應的方式呢,還是只在有需要時,把資料丟進PT6312的相關位址內而已?
 樓主| 發表於 2011-11-8 01:37:32 | 顯示全部樓層
scottwang 發表於 2011-11-8 01:05 AM static/image/common/back.gif
阿乾兄:
先恭喜你了.
那最後是否有用記憶體對應的方式呢,還是只在有需要時,把資料丟進PT6312的相關位址內 ...

unsigned char code DspBNKU[8][10]={
{0x3b,0x12,0x35,0x36,0x1e,0x2e,0x2f,0x32,0x3f,0x3e},//dig1
{0x3b,0x12,0x35,0x36,0x1e,0x2e,0x2f,0x32,0x3f,0x3e},//dig2
{0x0e,0x04,0x0d,0x0d,0x07,0x0b,0x0b,0x0c,0x0f,0x0f},//dig3
{0x0e,0x04,0x0d,0x0d,0x07,0x0b,0x0b,0x0c,0x0f,0x0f},//dig4
{0x03,0x01,0x03,0x03,0x01,0x02,0x02,0x03,0x03,0x03},//dig5
{0x03,0x01,0x03,0x03,0x01,0x02,0x02,0x03,0x03,0x03},//dig6
{0xdc,0x48,0xac,0xb4,0x70,0x74,0x7c,0x90,0xfc,0xf4},//dig7
{0xdc,0x48,0xac,0xb4,0x70,0x74,0x7c,0x90,0xfc,0xf4}//dig8
};//要改成8字10變化(0~9)
unsigned char code DspBNKD[8][10]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//dig1-2-19560602 n0.1byt
{0xc0,0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x80,0x80},//dig2-0-19560602 no.0byt
{0xc0,0x80,0x40,0x50,0x00,0x50,0xc0,0x80,0xc0,0xc0},//dig3-6-19560602 n0.4byt
{0xc0,0x80,0x40,0x50,0x00,0x50,0xc0,0x80,0xc0,0xc0},//dig4-0-19560602 no.3byt
{0x70,0x40,0x30,0x50,0xc0,0xd0,0xf0,0x40,0xf0,0xd0},//dig5-6-19560602 no.6byt
{0x70,0x40,0x30,0x50,0xc0,0xd0,0xf0,0x40,0xf0,0xd0},//dig6-5-19560602 no.5byt
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//dig7-9-19560602 no.8byt
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}//dig8-1- 19560602 no.7byt
};

void Display_Data_Operation(void)// write data to display buffer需要上下兩部分;
  {
   
    disbuf[7]=time_buf1[2]/10; //月
    disbuf[6]=time_buf1[2]%10;
    disbuf[5]=time_buf1[3]/10;//日
    disbuf[4]=time_buf1[3]%10;
    disbuf[3]=time_buf1[4]/10;//时
     disbuf[2]=time_buf1[4]%10;
     disbuf[1]=time_buf1[5]/10; //分
     disbuf[0]=time_buf1[5]%10;
   

      Disaddr[1]=DspBNKU[0][disbuf[0]];//dig0-
        Disaddr[0]=DspBNKD[1][disbuf[1]];//dig0D
           Disaddr[0]|=DspBNKU[1][disbuf[1]];//dig1-
            //Disaddr[0]=DspBNKU[1][disbuf[1]];//
                 Disaddr[3]=DspBNKU[2][disbuf[2]];//dig2-
                  Disaddr[2]=DspBNKD[2][disbuf[2]];//dig2D
                   Disaddr[2]|=DspBNKU[3][disbuf[3]];//dig3-
                    Disaddr[1]|=DspBNKD[3][disbuf[3]];//dig3D
                         Disaddr[5]=DspBNKU[4][disbuf[4]];//dig4-
                         Disaddr[4]=DspBNKD[4][disbuf[4]];//dig4D
                           Disaddr[4]|=DspBNKU[5][disbuf[5]];//dig5-
                            Disaddr[3]|=DspBNKD[5][disbuf[5]];//dig5D
                                 Disaddr[6]=DspBNKU[6][disbuf[6]];//dig6 byte5--
                                 // Disaddr[5]=DspBNKU[5][disbuf[5]];
                                   Disaddr[5]|=DspBNKU[7][disbuf[7]];//dig7 byte6-
                                  ....


void main (void)
{
unsigned char num;                  

Init_Timer0();
Ds1302_Init();
PT6312_Init();
cmd1=0x01;// 指令1  5 dig 16 segment
cmd2=0x40 ;//指令 2 資料設定參數,續增位址
Dat_flag=1;//增加資料時不會把STB變回HI 脈沖
cmd3=0xc0 ;//指令 3 位址內資料寫入start addr 00h
cmd4=0x89 ;//指令 4 顯示輸出以及亮度調整
//Ds1302_Write_Time();//不能加否則每次斷電時間就須重設
while (1)         //主循环
  {
num=KeyPro();
switch(num)
       {
            case 7:time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;   
              Ds1302_Write_Time();break; //正常时间 小时 加1
                case 14:time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4]=23;  
                  Ds1302_Write_Time();break; //正常时间 小时减1
                case 4:time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;     
                  Ds1302_Write_Time();break;//分加1
                case 1:time_buf1[5]--;if(time_buf1[5]==255)time_buf1[5]=59;
                  Ds1302_Write_Time();break; //分减1
                default:break;
           }
if(ReadTimeFlag==1)//每隔200ms時間要讀出 & 顯示
{
  q++;
  Disaddr[7]=q;
  Disaddr[8]=q;
  ReadTimeFlag=0;
  Ds1302_Read_Time();
  Display_Data_Operation();//---Display(VFD)
//数据的转换,因我们采用数码管0~9的显示,将数据分开
}
Disupdate();

   }
}
 樓主| 發表於 2011-11-8 01:39:12 | 顯示全部樓層
目前使用實驗版 時間日期無法輸入,但一次寫入ok!!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-6 12:17 AM , Processed in 0.171159 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.