历史上的今天
今天是:2025年01月07日(星期二)
2018年01月07日 | PT16312VFD驱动C程序
2018-01-07 来源:eefocus
PT16312驱动C程序
#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
#include
#define cmdd 0
#define datt 1
sbit dat=P1^3;
sbit clk=P1^2;
sbit stb=P1^1;
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=0x01;//设置为5区 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);
}
return(key);
}
main()// 测试程序
{
uchar i;
ulong k;
for(i=0;i<16;i++)
wrvfd(i,0xff); //点亮VFD荧光屏上所有的数据段
wrled(0x0f); //使16312上的输出口置高电平
while(1)
k=rdkey(); //读键盘实验,实际应用中应参照数据手册取值(如按下某一个按键应读读几次,其中只有一次是正确的其他几次做为消抖处理)
}
史海拾趣
|
你好,1MHz属于中波频段内。你要干扰的信号源的场强和调制方式我不知道。我只能给你提供个10W左右的1MHz的高频振荡器,我曾经用这个做过调幅发射机。你如果做干扰器的话还需要锯齿拨波发生器做信号源。… 查看全部问答> |
|
BOOL IncomingBarPWndProc (HWND hwnd, UINT uimessage, WPARAM wParam, LPARAM lParam) { BOOL bResult = FALSE; LPCTSTR ...… 查看全部问答> |
|
不知道为什么我刚买的清华紫光的U盘插到电脑上就自动运行并且打开了U盘 但是在我同学电脑上不出现这个问题,而其他人的U盘在我的电脑也不出现问题! 请问这个问题是怎么造成的?? 怎解决呢?? 谢谢!!~… 查看全部问答> |
|
谈谈430中ADC10四种通道采样的问题,希望能对大家有所帮助 起始对于ADC10四种通道采样的问题,如何操作ADC10,我想大家应该都知道,不知道的就去看手册吧。对于大多数人来说,就像我自己,最大的困难就是如何取值,ADC10中自带一个DTC可以不借助CPU而自动传值,但是传到RAM里的值如何读出来输入到引脚上,这 ...… 查看全部问答> |




