?? vfd.c
字號:
/*
好利來音響部設計
未經同意不得散布于網絡
2005年2月15日
*/
/*
本項目專門為宣傳本站的51 PIC AVR 多功能學習開發板而奉獻,僅供參考,請勿做商業用途,歡迎轉載但要保留本站信息
志博電子專注于8位單片機開發板設計和教學
讓人耳目一心的經濟又豪華型開發板
性價比最高
僅售378!
歡迎訪問我們的網站 www.elecmcu.com
*/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define cm1 co1.co1
#define cm2 co2.co2
#define cm3 co3.co3
#define cm4 co4.co4
#include <reg52.h>
#include "mylib.h"
#define cmdd 0
#define datt 1
//#define vfd_32
#define vfd_63
#define vfd_dvd 1
#define vfd_radio 0
sbit dat=P1^7;
sbit clk=P1^6;
sbit stb=P1^5;
sbit power_led=P1^0;
sbit fun_vfd=P1^4;
extern uchar remkey;
extern uchar ab;
extern void wrvfd(uchar addr,uchar dat);
#ifdef vfd_32
uchar code dis[10]={0xf7,0xa4,0xeb,0xed,0xbc,0xdd,0xdf,0xe4,0xff,0xfd};
#endif
#ifdef vfd_63
uchar code dis[10]={0xee,0x48,0xd6,0xda,0x78,0xba,0xbe,0xc8,0xfe,0xfa};
#endif
union
{
uchar dat;
struct
{
uchar dms: 3; //選擇顯示屏硬件的柵和段的位數
uchar dnc: 3; //數據空位
uchar ad1: 2; //此命令的地址值固定為0X00
}co1;
}co1;
union
{
uchar dat;
struct
{
uchar fru: 2; //功能選擇:00:WRITE DATA TO DISRAM 01:WRITE DATA TO LED 02:READ DATA FROM KEY 03:READ DATA FROM SW
uchar mad: 1; //0遞增 1指定地址
uchar mst: 1; //0正常 1測試模式
uchar dnc: 2; //數據空位
uchar ad2: 2; //此命令的地址值固定為0X01
}co2;
}co2;
union
{
uchar dat;
struct
{
uchar add: 5; //16312內部DISRAM地址選擇
uchar dnc: 1; //數據空位
uchar ad3: 2; //此命令的地址值固定為0X03
}co3;
}co3;
union
{
uchar dat;
struct
{
uchar pwm: 3; //輸出點亮時間選擇(可以調節亮度)
uchar dis: 1; //0顯示關閉
uchar dnc: 2; //數據空位
uchar ad4: 2; //此命令的地址值固定為0X02
}co4;
}co4;
void wrd(uchar disno,bit lei) //寫一個字節的命令或者數據(由LEI控制是寫數據還是寫命令)
{
uchar a;
if(lei)
goto s;
stb=1;
stb=1;
stb=0;
s: for(a=0;a<8;a++)
{
clk=1;
clk=1;
clk=0;
clk=0;
if(disno&0x01)
dat=1;
else
dat=0;
disno=disno>>1;
clk=1;
clk=1;
clk=1;
clk=1;
}
}
void inivfd(void)
{
cm1.dms=0x02;//設置為6區 16段
cm1.ad1=0x00;
cm2.mad=0x01;//地址模式為指定地址
cm2.mst=0x00;//取消測試
cm2.ad2=0x01;
cm3.ad3=0x03;
cm4.pwm=0x07;//亮度為最亮
cm4.dis=0x01;//打開顯示
cm4.ad4=0x02;
}
/////////////////////////////************以下為主程序*************************//////////////////////
void wrvfd(uchar addr,uchar dat) //向VFD指定地址寫數據
{
inivfd();
wrd(co1.dat,cmdd);
stb=1;
cm2.fru=0x00;
wrd(co2.dat,cmdd);
stb=1;
cm3.add=addr;
wrd(co3.dat,cmdd);
wrd(dat,datt);
stb=1;
wrd(co4.dat,cmdd);
stb=1;
}
/*void wrled(uchar leddata) //控制16312的四個輸出口數據存放在LEDDATA的低四位
{
inivfd();
cm2.fru=0x01;
wrd(co2.dat,cmdd);
wrd(leddata,datt);
stb=1;
}
ulong rdkey() //讀鍵盤
{ulong key=0;
uchar i;
inivfd();
cm2.fru=0x02;
wrd(co2.dat,cmdd);
for(i=0;i<24;i++)
{
clk=1;
clk=1;
clk=0;
clk=0;
clk=0;
clk=1;
dat=1;
if(dat==1)
key=(key<<1)+1;
else
key=(key<<1);
}
switch(key)
{
case 0x00800000:remkey=0xc7;break;
case 0x00400000:remkey=0x47;break;
}
return(key);
}
*/
/*#ifdef vfd_32
vfddigit(ulong ch)
{
static uchar rot0=0x01;
static uchar rot1=0x01;
static uint cou=0x00;
uchar h[6];
h[5]=(ab/10);
h[4]=(ab%10);
h[3]=((ch%10000)/1000);
h[2]=((ch%1000)/100);
h[1]=((ch%100)/10);
h[0]=(ch%10); //將16進制轉換成10進制顯示
wrvfd(0x00,dis[h[0]]&((dis[h[1]]&0x01)?0xff:0x7f));
wrvfd(0x01,dis[h[1]]>>1);
wrvfd(0x02,dis[h[2]]&((dis[h[3]]&0x01)?0xff:0x7f));
if(h[3])
wrvfd(0x03,dis[h[3]]);
else
wrvfd(0x03,0x00); //根據供應商提供的VFD資料來寫正確顯示的算法,否則顯示錯亂!
wrvfd(0x04,dis[h[4]]&((dis[h[5]]&0x01)?0xff:0x7f));
wrvfd(0x05,dis[h[5]]);
wrvfd(0x08,rot0<<1);
wrvfd(0x09,rot1<<1);
if(cou<8)
{
rot0=(rot0<<1);
cou++;
}
else
{
rot1=(rot1<<1);
cou++;
if(rot1==0x00)
{
cou=0x00;
rot0=0x01;
rot1=0x01;
}
}
}
#endif
*/
#ifdef vfd_63
vfddigit(uint ch)
{
static uint rot1=0x0800;
uchar h[6];
h[5]=(ab/10);
h[4]=(ab%10);
h[3]=((ch%10000)/1000);
h[2]=((ch%1000)/100);
h[1]=((ch%100)/10);
h[0]=(ch%10); //將16進制轉換成10進制顯示
wrvfd(0x00,(dis[h[1]]>>1)|0x80);
wrvfd(0x01,dis[h[0]]);
wrvfd(0x03,dis[h[2]]);
if(h[3])
wrvfd(0x02,dis[h[3]]>>1);
else
wrvfd(0x02,0x00); //根據供應商提供的VFD資料來寫正確顯示的算法,否則顯示錯亂!
wrvfd(0x06,dis[h[5]]>>1);
wrvfd(0x07,dis[h[4]]);
if(band==fm)
wrvfd(0x05,0xb4);
else
wrvfd(0x05,0xfc);
if(rot1)
{
wrvfd(10,~(rot1&0x00ff));
wrvfd(11,~(((rot1>>8)&0xff)|0xf0));
rot1=rot1>>1;
if(rot1==0x00)
rot1=0x0800;
}
}
void vfd_volume(uchar fun)
{
uchar one=0x00;
uchar ten=0x00;
uchar c=0;
fun_vfd=vfd_radio; //VFD控制給收音
if(fun==vol_vfd)
{
one=volume%10;
ten=volume/10;
}
else if(fun==trb_vfd)//高音顯示
{
if(trb_vol<7)
{
one=(14-(trb_vol+trb_vol))%10;
ten=(14-(trb_vol+trb_vol))/10;
}
else if(trb_vol>7)
{
one=((trb_vol-7)*2)%10;
ten=((trb_vol-7)*2)/10;
}
}
else if(fun==bas_vfd)//低音顯示
{
if(bas_vol<7)
{
one=(14-(bas_vol+bas_vol))%10;
ten=(14-(bas_vol+bas_vol))/10;
}
else if(bas_vol>7)
{
one=((bas_vol-7)*2)%10;
ten=((bas_vol-7)*2)/10;
}
}
for(c=2;c<9;c++)//清無關位置
{
if(fun==vol_vfd)
if((c==2)||(c==4)||(c==5))
goto hh;
wrvfd(c,0x00);
hh:
;
}
wrvfd(0x00,0x00);
if(fun==vol_vfd)
{
wrvfd(0x02,0x13);
wrvfd(0x05,0x1f);
wrvfd(0x04,0x24);
}
if(fun==trb_vfd)
{
wrvfd(0x06,0xc0);
wrvfd(0x07,0x01);//顯示字符“T”
}
if(fun==bas_vfd)
{
wrvfd(0x06,0x1f);//顯示字符“B”
}
if((fun==bas_vfd))
{
if((bas_vol<7))
wrvfd(0x00,0x08);//顯示負號
}
if((fun==trb_vfd))
{
if((trb_vol<7))
wrvfd(0x00,0x08);//顯示負號
}
wrvfd(0x09,dis[one]);
wrvfd(0x01,dis[ten]);
TH1=0X00;
TL1=0X00;
TR1=1;
delay_num=20;
}
void eq_vfd(uchar eq) //在VFD上顯示均衡數據
{
if(band==dvd)
fun_vfd=vfd_radio;
vfd_clean();
wrvfd(0x07,0xf8);
wrvfd(0x06,0x5b);
wrvfd(0x04,0x08);
wrvfd(0x05,dis[eq+1]);
delay_num=20;
TR1=1;
}
void taiwei() //顯示目前的臺號
{ uchar b[6];
b[5]=(ab/10);
b[4]=(ab%10);
wrvfd(0x06,dis[b[5]]>>1);
wrvfd(0x07,dis[b[4]]);
}
#endif
void vfd_clean() //清全屏
{
uchar a;
for(a=0;a<16;a++)
wrvfd(a,0x00);
}
void vfd_test() //在測試VFD點位時候使用。
{
static uchar add;
static uint date;
while(remkey)
{
if(remkey==0x9f)
{add=0;date=0x01;vfd_clean();}
if(remkey==0x1f)
{add=2;date=0x01;vfd_clean();}
if(remkey==0x6f)
{add=4;date=0x01;vfd_clean();}
if(remkey==0xaf)
{add=6;date=0x01;vfd_clean();}
if(remkey==0x2f)
{add=8;date=0x01;vfd_clean();}
if(remkey==0xfd)
{add=0x0a;date=0x01;vfd_clean();}
if(remkey==0x7d)
{ add=12;date=0x01;vfd_clean();}
if(remkey==0x75)
{
date=(date<<1);
if(date==0)
date=0x01;
}
if(remkey==0x35)
{
date=(date>>1);
if(date==0)
date=0x01;
}
if(remkey)
{
// fun_power=power_radio;//電源為收音
fun_vfd=vfd_radio; //VFD控制給收音
wrvfd(add,(date&0x00ff));
wrvfd(add+1,(date>>8));
remkey=0x00;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -