pt16312vfd.lst
来自「一个车载音响控制程序,包括高保真立体收部分,VFD驱动显示,4路音频电子切换, 」· LST 代码 · 共 167 行
LST
167 行
C51 COMPILER V6.12 PT16312VFD 11/23/2005 14:06:51 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE PT16312VFD
OBJECT MODULE PLACED IN .\PT16312VFD.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\..\PT16312VFD\PT16312VFD.C DEBUG OBJECTEXTEND PRINT(.\PT16312VFD.lst)
- OBJECT(.\PT16312VFD.obj)
stmt level source
1 #define uchar unsigned char
2 #define uint unsigned int
3 #define ulong unsigned long
4 #define cm1 co1.co1
5 #define cm2 co2.co2
6 #define cm3 co3.co3
7 #define cm4 co4.co4
8 #include <reg52.h>
9 #include <mylib.h>
10 #define cmdd 0
11 #define datt 1
12 sbit dat=P1^0;
13 sbit clk=P1^1;
14 sbit stb=P1^2;
15 uchar code dx58[3] _at_ 0x3b;
16 union
17 {
18 uchar dat;
19 struct
20 {
21 uchar dms: 3; //选择显示屏硬件的栅和段的位数
22 uchar dnc: 3; //数据空位
23 uchar ad1: 2; //此命令的地址值固定为0X00
24 }co1;
25 }co1;
26 union
27 {
28 uchar dat;
29 struct
30 {
31 uchar fru: 2; //功能选择:00:WRITE DATA TO DISRAM 01:WRITE DATA TO LED 02:READ DATA FROM KEY 03:READ
- DATA FROM SW
32 uchar mad: 1; //0递增 1指定地址
33 uchar mst: 1; //0正常 1测试模式
34 uchar dnc: 2; //数据空位
35 uchar ad2: 2; //此命令的地址值固定为0X01
36 }co2;
37 }co2;
38 union
39 {
40 uchar dat;
41 struct
42 {
43 uchar add: 5; //16312内部DISRAM地址选择
44 uchar dnc: 1; //数据空位
45 uchar ad3: 2; //此命令的地址值固定为0X03
46 }co3;
47 }co3;
48 union
49 {
50 uchar dat;
51 struct
52 {
53 uchar pwm: 3; //输出点亮时间选择(可以调节亮度)
C51 COMPILER V6.12 PT16312VFD 11/23/2005 14:06:51 PAGE 2
54 uchar dis: 1; //0显示关闭
55 uchar dnc: 2; //数据空位
56 uchar ad4: 2; //此命令的地址值固定为0X02
57 }co4;
58 }co4;
59
60 void wrd(uchar disno,bit lei) //写一个字节的命令或者数据(由LEI控制是写数据还是写命令)
61 {
62 1 uchar a;
63 1 if(lei)
64 1 goto s;
65 1 stb=1;
66 1 stb=1;
67 1 stb=0;
68 1 s: for(a=0;a<8;a++)
69 1 {
70 2 clk=1;
71 2 clk=1;
72 2 clk=0;
73 2 clk=0;
74 2 if(disno&0x01)
75 2 dat=1;
76 2 else
77 2 dat=0;
78 2 disno=disno>>1;
79 2 clk=1;
80 2 clk=1;
81 2 clk=1;
82 2 clk=1;
83 2 }
84 1 }
85 void inivfd(void)
86 {
87 1 cm1.dms=0x01;//设置为5区 16段
88 1 cm1.ad1=0x00;
89 1 cm2.mad=0x01;//地址模式为指定地址
90 1 cm2.mst=0x00;//取消测试
91 1 cm2.ad2=0x01;
92 1 cm3.ad3=0x03;
93 1 cm4.pwm=0x07;//亮度为最亮
94 1 cm4.dis=0x01;//打开显示
95 1 cm4.ad4=0x02;
96 1 }
97 /////////////////////////////************以下为主程序*************************//////////////////////
98 void wrvfd(uchar addr,uchar dat) //向VFD指定地址写数据
99 {
100 1 inivfd();
101 1 wrd(co1.dat,cmdd);
102 1 stb=1;
103 1 cm2.fru=0x00;
104 1 wrd(co2.dat,cmdd);
105 1 stb=1;
106 1 cm3.add=addr;
107 1 wrd(co3.dat,cmdd);
108 1 wrd(dat,datt);
109 1 stb=1;
110 1 wrd(co4.dat,cmdd);
111 1 stb=1;
112 1 }
113 void wrled(uchar leddata) //控制16312的四个输出口数据存放在LEDDATA的低四位
114 {
115 1 inivfd();
C51 COMPILER V6.12 PT16312VFD 11/23/2005 14:06:51 PAGE 3
116 1 cm2.fru=0x01;
117 1 wrd(co2.dat,cmdd);
118 1 wrd(leddata,datt);
119 1 stb=1;
120 1 }
121 ulong rdkey() //读键盘
122 { ulong key=0;
123 1 uchar i;
124 1 inivfd();
125 1 cm2.fru=0x02;
126 1 wrd(co2.dat,cmdd);
127 1 for(i=0;i<24;i++)
128 1 {
129 2 clk=1;
130 2 clk=1;
131 2 clk=0;
132 2 clk=0;
133 2 clk=0;
134 2 clk=1;
135 2 dat=1;
136 2 if(dat==1)
137 2 key=(key<<1)+1;
138 2 else
139 2 key=(key<<1);
140 2 }
141 1 return(key);
142 1 }
143
144 main()// 测试程序
145 {
146 1 uchar i;
147 1 ulong k;
148 1 for(i=0;i<16;i++)
149 1 wrvfd(i,0xff); //点亮VFD荧光屏上所有的数据段
150 1 wrled(0x0f); //使16312上的输出口置高电平
151 1 while(1)
152 1 k=rdkey(); //读键盘实验,实际应用中应参照数据手册取值(如按下某一个按键应读读几次,其中只有一次是正确
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?