我的VFD测试程序
#include <pic.h>
#define STB RA0
#define SCK RA1
#define SDA RA2
#define nop asm("NOP")
char key_value1;
char key_value2;
char key_value3;
char temp1;
char temp2;
char temp3;
char dis_data;
char usec;
char dis_add;
char dis_value;
const char display_value[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6};//字符编码
void dmsec(int msec);
void dusec(char usec);
void dis_byte(char dis_data);
void dis_ini();
void display(char add,char xs_value);
void key_scan();
read_key();
main()
{
char i;
dis_ini();
temp1=7;//观查变量方便随便赋的值
temp2=8;//观查变量方便随便赋的值
temp3=9;//观查变量方便随便赋的值
key_value1=1;//观查变量方便随便赋的值
key_value2=2;//观查变量方便随便赋的值
key_value3=3;//观查变量方便随便赋的值
while(1)
{
dis_add=0xc1;
dis_value=display_value[1];
display(dis_add,dis_value);
dis_add=0xc0;
dis_value=display_value[5];
display(dis_add,dis_value);
dis_add=0xc5;
dis_value=display_value[5];
display(dis_add,dis_value);
dis_add=0xc4;
dis_value=display_value[8];
display(dis_add,dis_value);
dis_add=0xc7;
dis_value=display_value[0];
display(dis_add,dis_value);
dis_add=0xc6;
dis_value=display_value[9];
display(dis_add,dis_value);
key_scan();
if(key_value1!=0)//有按键按下则退出循环
break;
if(key_value2!=0)
break;
if(key_value3!=0)
break;
}
temp1=key_value1;
temp2=key_value2;
temp3=key_value3;
dusec(255);
while(1)
{
nop;
}
}
//=====================================
void dusec(char usec)
{
for(usec;usec> 0;usec--)
{
nop;
}
nop;
}
//=====================================
void dmsec(int msec)
{
char TempCyc;
for(msec;msec> 0;msec--)
{
for(TempCyc=125; TempCyc> 0; TempCyc--);
{
nop;
}
}
nop;
}
//=====================================
void dis_ini()
{
char loop_temp;
ADCON1=0xff; //设置A口为IO口
PORTA=0;dusec(10);
TRISA=0;dusec(10); //初始化IO口
STB=1;
dmsec(1000);
STB=0;
dis_data=0b00000001; //设定显示方式:
dis_byte(dis_data);
STB=1;dusec(1);
STB=0;
dis_data=0b01000100; //设定数据:1、正常操作 2、数据写入后的增量地址
dis_byte(dis_data); //3、写数据至显示存储器
STB=1;dusec(1);
STB=0;
dis_data=0b1100000; //设定地址:地址=00000
dis_byte(dis_data);
dis_add=0xbf;
for(loop_temp=12;loop_temp> 0;loop_temp--)
{
dis_add++;
dis_data=0b00000000; //显示值为0,清空
display(dis_add,dis_data);
}
STB=1;dusec(1);
STB=0;
dis_data=0b10001111; //设定显示控制:1、显示通 2、脉冲为14/16
dis_byte(dis_data);
STB=1;dusec(1);
}
//=====================================
void display(char dis_add,char dis_value)
{
TRISA=0;nop;
STB=0;
dis_data=0b01000100; //设定数据:1、正常操作 2、数据写入后的固定地址
dis_byte(dis_data); //3、写数据至显示存储器
STB=1;nop;
STB=0;
dis_data=dis_add; //设定地址
dis_byte(dis_data);
dis_data=dis_value;
dis_byte(dis_data);
STB=1;nop;
}
//=====================================
void dis_byte(char dis_data)
{
char i;
TRISA=0;nop;
for(i=8;i> 0;i--)
{
SCK=0;nop;
if(dis_data&0x01)
SDA=1;
else
SDA=0;
nop;
SCK=1;nop;
dis_data> > =1;
}
nop;
}
//=====================================
void key_scan()
{
TRISA=0;nop;
STB=0;nop;
dis_data=0b01000010;
dis_byte(dis_data);
key_value1=read_key();
key_value2=read_key();
key_value3=read_key();
//STB=1;nop;//有这一句显示亮度会变暗(不知为什么?)
}
//=====================================
read_key()
{
char i;
TRISA=0x04;nop;
dis_data=0;
for(i=8;i> 0;i--)
{
SCK=1;dmsec(5);
dis_data < <=1;
if(SDA)
{
dis_data|=0x01;
}
SCK=0;dmsec(5);
}
return(dis_data);
}