痞酷網_PIGOO

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

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

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

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

謝謝!
查看: 3653|回復: 0

普誠vfd驅動ic pt6312 簡易測試工具

[複製鏈接]
發表於 2011-11-11 18:58:11 | 顯示全部樓層 |閱讀模式
手頭上幾片 vfd 顯示器發現都是 普誠的pt6312 為了測出 vfd各腳位來,若用 實驗版修改資料再來跑會很費工,乾脆就用c寫一下(我只會c) 配合 DVD的電源就會比較方便...

為了方便其他版子測試,增加一接外接腳可以方便提供電源和控制信號

DSC00904 [800x600].JPG

全開
DSC00903 [800x600].JPG

DSC00905 [800x600].JPG

DSC00899 [800x600].JPG

全關
DSC00902 [800x600].JPG

DSC00906 [800x600].JPG

DSC00900 [800x600].JPG

各GRID 的各SEGMENT 獨立點亮,會發覺有些SEGMENT是合併在一起
DSC00901 [800x600].JPG

中断部分並沒有使用到,日後想到再用上(這就是歷史的包袱)...

/*VFD專用IC練習 20111104 顯示問題澄清 全部送0x0f 看是時序問題過快還是字位置 開始的位置從00 開始  待測鍵盤掃描部分 */
#include<reg52.h>
//--------------------pt6312-----------------------
unsigned char TempData[12]= {0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,};//第一步全都沒變
unsigned char Disaddr[12];
unsigned char adr;
unsigned char KeyscanBank,bt;
unsigned char cmd1;
unsigned char cmd2;
unsigned char cmd3;
unsigned char cmd4;
bit Dat_flag;//data flag 不需要 stb變為hi
bit Inc_flag;// 重複輸入
bit ReadFlag;
//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//电平置高
#define KeyPort P0////P1.0~P1.7 按鍵掃描用
//--------------------pt6312-----------------------
sbit STB=P3^3; // pt6312 strobe
sbit DIN=P3^4; // pt6312 data       
sbit CLK=P3^5; // pt6312 clock       
//sbit CONF=P2^0;//control display on off
unsigned char TempData[12];
unsigned char adr;
unsigned char cmd1;
unsigned char cmd2;
unsigned char cmd3;
unsigned char cmd4;
bit Dat_flag;//data flag 不需要 stb變為hi
//bit ONF_flag;// display on off control
//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//电平置高

/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
//TH0=0x00;              //给定初值
//TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
// static unsigned char countdis;
static unsigned char count;// int
TH0=(65536-2000)/256;                  //重新赋值 2ms
TL0=(65536-2000)%256;      //


count++;
if(count==150)        //大致300ms READ Ds1302
   {
    count=0;
    ReadFlag=1; //读标志位置1
        }
}

//--------------------------------------------------------------------------------------------
unsigned char KeyScan(void)  //LEGION 掃描法
{
char  ROW,buf;        //計數與暫存.
char push_key;        //實際傳回按鍵數值.                                 
KeyPort =0xf0;
  for (KeyPort =0xfe,buf= KeyPort,ROW=0; ROW < 4 ; ROW++)
   {
     if( (KeyPort & 0xf0) != 0xf0 )
       {
             push_key= KeyPort; //將已按下的按鍵值存入傳回值中,
             while ( push_key == KeyPort) //一直等待,等到按下按鍵放手為止.
          {
          DelayMs(1);
          }
          return(push_key);  //因已放開按鍵,所以P2已被變更,所以傳回按鍵值.
         }
   else
         {
          buf <<=1;
      buf +=1;
      KeyPort =buf;
         }
  }
  return(0xff);     //返回值
}

unsigned char KeyPro(void)
{
switch(KeyScan())
{
  case 0x7d:return 0;break;//0 bit0
  case 0xee:return 1;break;//1  bit1
  case 0xed:return 2;break;//2  bit2
  case 0xeb:return 3;break;//3  bit3
  case 0xde:return 4;break;//4  bit4
  case 0xdd:return 5;break;//5  bit5
  case 0xdb:return 6;break;//6  bit6
  case 0xbe:return 7;break;//7  bit7
  case 0xbd:return 8;break;//8  w1
  case 0xbb:return 9;break;//9  w2
  case 0xb7:return 10;break;//a  w3
  case 0x77:return 11;break;//b  w4
  case 0xe7:return 12;break;//c  w5
  case 0xd7:return 13;break;//d  w6
  case 0x7e:return 14;break;//e  w1
  case 0x7b:return 15;break;//f  w2
  default:return 0xff;break;
}
}


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 Disupdate(void)//資料寫入群到指定位址
{
   unsigned char i;
   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 address0x00 起始位址
  for (i=0;i<12;i++)
{
  adr= TempData;//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
  cmd4=0x8a;
PT6312_Write (cmd4);//CMD4 6/16 pulse width dim control  8a..83 work
}



void NumPro(void)// 入按下7表示 第七bit設為 1
{
unsigned char cnt,i;
cnt= KeyscanBank;
bt=1;
for(i=0;i<cnt;i++)
{
bt<<=1;
}
}


void main(void)//
{
unsigned char k ;
Init_Timer0();
//Ds1302_Init();
PT6312_Init();
cmd1=0x02;// 指令1  6 dig 16 segment
cmd2=0x40 ;//指令 2 資料設定參數,續增位址
Dat_flag=1;//增加資料時不會把STB變回HI 脈沖
cmd3=0xc0 ;//指令 3 位址內資料寫入start addr 00h
cmd4=0x89 ;//指令 4 顯示輸出以及亮度調整

while(1) //輸入順序 先輸入bit數(0~7) 再輸入 字位(0~5 8.9.a.b.c.d) 最後輸入F 更新住址內容,若輸入E 就是清除全部內容
{
KeyscanBank=KeyPro();// 檢查是否0xff  
if (KeyscanBank!=0xff)
  {
   if (KeyscanBank<8)//欲顯示的bit位元
    {
      NumPro();   //bt=bit shift cnt
    }
     
   if (KeyscanBank>7 && KeyscanBank<14)
    {
      TempData[((KeyscanBank)-8)*2 ]=bt;
      if(Inc_flag)
      {
       TempData[((KeyscanBank)-8)*2 ]=0;
       TempData[((KeyscanBank)-8)*2+1 ]=bt;
      }
      Inc_flag=!Inc_flag;
     }
   if (KeyscanBank==14)            //清除全部為零
     {
      for(k=0;k<12;k++)
      {
           if(Inc_flag)
           {
       TempData[k]=0xff;
           }
           else
           {
        TempData[k]=0x00;
                }
      
      }
          Inc_flag=!Inc_flag;
          }
   if (KeyscanBank==15)            //update write
    {
      Disupdate();
          }
   
  }
}
}

DSC00898 [800x600].JPG

評分

3

查看全部評分

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

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

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

GMT+8, 2024-11-17 10:29 PM , Processed in 0.264432 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.