- 积分
- 3558
- 在线时间
- 2991 小时
- 最后登录
- 2025-9-8
- 阅读权限
- 120
- 精华
- 3
 
- UID
- 8411
- 帖子
- 3222
- 精华
- 3
- 经验
- 3558 点
- 金钱
- 1885 ¥
- 注册时间
- 2006-4-5
|
VFD驱动程序(C语言编写)
/*
真空荧光管驱动子程序
2007-09-09 江文正
*/
#include <eZ8.h>
#include <stdio.h>
#include <sio.h> // non-standard I/O
#include "vfd.h"
// STB 下降后的第一字节是指令,往后的是数据,
#define vfd_mode 0x03; // 7 位数 15 段
#define addr_write 0xC0; // 写00进入显示地址
#define data_write 0x40; // 写显示数据,地址自动加1
#define dsp_on 0x8F; // 点亮显示,14/16 亮度
#define dsp_off 0x80; // 熄灭显示
#define key_read 0x42; // 读按键
// 引脚定义
#define data_addr PBADDR // Port B address
#define data_ctl PBCTL // Port B control
#define data_in PBIN // Port B in
#define data_out PBOUT // Port B out
#define data_0 0xFE // PB0
#define data_1 0x01 // PB0
#define stb_out PBOUT // Port B out
#define stb_0 0xFD // PB1
#define stb_1 0x02 // PB1
#define clk_out PCOUT // Port C out
#define clk_0 0x7F // PC7
#define clk_1 0x80 // PC7
#define colon 0x02; //显示左声道反相或者自动音量
#define point 0x01; //显示自动关机
extern char DplFlag; //bit0 = blank, bit1 = ALC on, bit2 = new channel, bit3 = test mode
extern char FuncNr; //功能选择
extern char mute_flag;
extern char pwr_flag;
extern char anti_flag;
extern char agc_flag;
extern char off_flag;
extern unsigned char Volume; //音量
extern unsigned char ChNr; //切换位置
//15段字符表 HGFE,DCBA,7654,3210
const char SegTable[80] ={ 0x64, 0x46, //0 0110,0100,0100,0110
0x01, 0x20, //1 0000,0001,0010,0000
0xA5, 0x45, //2 1010,0101,0100,0101
0x45, 0x45, //3 0100,0101,0100,0101
0xC1, 0x07, //4 1100,0001,0000,0111
0xC5, 0x43, //5 1100,0101,0100,0011
0xE5, 0x43, //6 1110,0101,0100,0011
0x40, 0x44, //7 0100,0000,0100,0100
0xE5, 0x47, //8 1110,0101,0100,0111
0xC5, 0x47, //9 1100,0101,0100,0111
0xE1, 0x47, //A 1110,0001,0100,0111
0x45, 0x65, //B 0100,0101,0110,0101
0x24, 0x42, //C 0010,0100,0100,0010
0x45, 0x64, //D 0100,0101,0110,0100
0xA5, 0x42, //E 1010,0101,0100,0010
0xA1, 0x42, //F 1010,0001,0100,0010
0x64, 0x43, //10 G 0110,0100,0100,0011
0xE1, 0x07, //11 H 1110,0001,0000,0111
0x05, 0x60, //12 I 0000,0101,0110,0000
0x64, 0x44, //13 J 0110,0100,0100,0100
0x09, 0x28, //14 K 0000,1001,0010,1000
0x24, 0x02, //15 L 0010,0100,0000,0010
0x61, 0x66, //16 M 0110,0001,0110,0110
0x69, 0x16, //17 N 0110,1001,0001,0110
0x64, 0x46, //18 O 0110,0100,0100,0110
0xA1, 0x47, //19 P 1010,0001,0100,0111
0x6C, 0x46, //1A Q 0110,1100,0100,0110
0xA9, 0x47, //1B R 1010,1001,0100,0111
// HGFE,DCBA,7654,3210
0xC5, 0x43, //1C S 1100,0101,0100,0011
0x01, 0x60, //1D T 0000,0001,0110,0000
0x64, 0x06, //1E U 0110,0100,0000,0110
0x31, 0x0A, //1F V 0011,0001,0000,1010
0x65, 0x26, //20 W 0110,0101,0010,0110
0x19, 0x18, //21 X 0001,1001,0001,1000
0xC5, 0x07, //22 Y 1100,0101,0000,0111
0x15, 0x48, //23 Z 0001,0101,0100,1000
0x00, 0x00, //24 0000,0000,0000,0000 空白
0x99, 0x19, //25 * 1001,1001,0001,1001 米字
0x81, 0x21, //26 + 1000,0001,0010,0001
0x81, 0x01 //27 - 1000,0001,0000,0001
};
//文字查码表,切换位置文字=8*4=32个,红外线设置显示=7*6=42个
const char TextTable[81] ={ 0x1C,0x0A,0x1D,0x01, //SAT1 0
0x1C,0x0A,0x1D,0x02, //SAT2 4
0x0D,0x0A,0x0C,0x24, //DAC 8
0x0D,0x1F,0x0D,0x24, //DVD 12
0x0C,0x0D,0x24,0x24, //CD 16
0x0A,0x1E,0x21,0x01, //AUX1 20
0x0A,0x1E,0x21,0x02, //AUX2 24
0x1D,0x0E,0x1C,0x1D, //TEST 28
0x1F,0x18,0x15,0x24,0x1E,0x19,0x24, //VOL UP 32
0x1F,0x18,0x15,0x24,0x0D,0x17,0x24, //VOL DN 39
0x0C,0x11,0x24,0x1E,0x19,0x24,0x24, //CH UP 46
0x0C,0x11,0x24,0x0D,0x17,0x24,0x24, //CH DN 53
0x16,0x1E,0x1D,0x0E,0x24,0x24,0x24, //MUTE 60
0x15,0x24,0x0A,0x17,0x1D,0x12,0x24, //L ANTI 67
0x19,0x20,0x1B,0x24,0x18,0x0F,0x0F //PWR OFF 74
};
unsigned char codebuf[7]; // 7 个字
scandpl()
{
char count;
char vfd_buf;
// vfd_buf = dsp_off; //熄灭显示
// stb_out &= stb_0;
// vfd_out(vfd_buf);
// stb_out |= stb_1;
vfd_buf = vfd_mode; //显示模式
stb_out &= stb_0; (&=是什么运算,忘记了)
vfd_out(vfd_buf);
stb_out |= stb_1; (|=是什么运算,也忘了)
vfd_buf = data_write;//设置显示数据,地址自动加1
stb_out &= stb_0;
vfd_out(vfd_buf);
stb_out |= stb_1;
vfd_buf = addr_write;//写00进入显示地址
stb_out &= stb_0;
vfd_out(vfd_buf);
// 显示7位数据
get_code();
for(count=0;count<7;count++) (7位循环显示)
{
vfd_buf = SegTable[codebuf[count]*2];
if(anti_flag & 0x01 && count == 4) vfd_buf |= colon; //显示左声道反相
if(agc_flag & 0x01 && count == 2) vfd_buf |= colon; //显示自动音量
if(off_flag & 0x01 && count == 4) vfd_buf |= point; //显示自动关机
// vfd_out(Volume); // 输出8比特, 测试用
vfd_out(vfd_buf); // 输出前8比特
vfd_buf = SegTable[codebuf[count]*2+1];
// vfd_out(ChNR); // 输出8比特, 测试用
vfd_out(vfd_buf); // 输出后8比特
}
stb_out |= stb_1;
vfd_buf = dsp_on; //点亮显示
stb_out &= stb_0;
vfd_out(vfd_buf);
stb_out |= stb_1;
}
void get_code(void) //(get_code函数)
{
char count;
char temp;
char offset;
if(mute_flag & 0x01 || pwr_flag & 0x01) //if mute_flag=1 or pwr_flag=1
{
offset = 60; //mute
if(pwr_flag & 0x01) offset = 74; //pwr off
for(count=0;count<7;count++) // 7个字
{
codebuf[count] = TextTable[count+offset]; // 文字显示
}
}
else
{
switch(FuncNr)
{
case 0:
codebuf[0] = TextTable[ChNr*4]; // 平时显示切换位置
codebuf[1] = TextTable[ChNr*4+1];
codebuf[2] = TextTable[ChNr*4+2];
codebuf[3] = TextTable[ChNr*4+3];
codebuf[4] = 0X24; //空白
temp = Volume/10;
codebuf[5] = temp; //volume 十位
temp = Volume-temp*10;
codebuf[6] = temp; //volume 个位
break;
default:
for(count=0;count<7;count++) // 7个字
{
codebuf[count] = TextTable[FuncNr*7+count+25]; // 设置红外线码时的文字显示
}
break;
}
}
}
void vfd_out(char vfd_buf) //串移8位数据
{
char count;
char out_bit=1;
data_addr = 0x01; // Data Dir
data_ctl &= data_0; // data as output
data_addr = 0x00; // lock
for(count=0;count<8;count++)
{
wait_uS(1); //延时
if(vfd_buf & out_bit)
{
data_out |= data_1;
}
else
{
data_out &= data_0;
}
wait_uS(1); //延时
clk_out |= clk_1; //clk 置高
wait_uS(1); //延时
clk_out &= clk_0; //clk 置低
out_bit = (out_bit << 1);
}
}
//================================================================
char read_key() //读取8个按键
{
char count;
char vfd_buf;
char key=0;
vfd_buf = key_read; //读按键模式
stb_out &= stb_0;
vfd_out(vfd_buf);
vfd_buf = vfd_in();
stb_out |= stb_1;
switch(vfd_buf)
{
case 2:
key = 3;
break;
case 4:
key = 1;
break;
case 8:
key = 2;
break;
}
return key;
}
char vfd_in() //串移8位数据
{
char count;
char in_bit;
char vfd_buf;
data_addr = 0x01; // Data Dir
data_ctl |= data_1; // data as input
data_addr = 0x00; // lock
vfd_buf=0;
for(count=0;count<8;count++)
{
in_bit=0;
wait_uS(1); //延时
if(data_in & data_1) in_bit=1;
in_bit = in_bit << count;
vfd_buf |= in_bit;
clk_out |= clk_1; //clk 置高
wait_uS(1); //延时
clk_out &= clk_0; //clk 置低
}
return vfd_buf;
}
void wait_uS(unsigned char sec) //延时
{
unsigned char count;
for(count=0;count<sec;count++)
{
}
} |
|