|
手頭上幾片 vfd 顯示器發現都是 普誠的pt6312 為了測出 vfd各腳位來,若用 實驗版修改資料再來跑會很費工,乾脆就用c寫一下(我只會c) 配合 DVD的電源就會比較方便...
為了方便其他版子測試,增加一接外接腳可以方便提供電源和控制信號
全開
全關
各GRID 的各SEGMENT 獨立點亮,會發覺有些SEGMENT是合併在一起
中断部分並沒有使用到,日後想到再用上(這就是歷史的包袱)...
/*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();
}
}
}
}
|
-
評分
-
3
查看全部評分
-
|