📄 vfd.lst
字号:
C51 COMPILER V7.10 VFD 03/27/2005 22:39:54 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE VFD
OBJECT MODULE PLACED IN vfd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE vfd.c BROWSE DEBUG OBJECTEXTEND
line 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^3;
13 sbit clk=P1^2;
14 sbit stb=P1^1;
15 extern uchar remkey;
16 uchar code dis[10]={0xf7,0xa4,0xeb,0xed,0xbc,0xdd,0xdf,0xe4,0xff,0xfd};
17 union
18 {
19 uchar dat;
20 struct
21 {
22 uchar dms: 3; //选择显示屏硬件的栅和段的位数
23 uchar dnc: 3; //数据空位
24 uchar ad1: 2; //此命令的地址值固定为0X00
25 }co1;
26 }co1;
27 union
28 {
29 uchar dat;
30 struct
31 {
32 uchar fru: 2; //功能选择:00:WRITE DATA TO DISRAM 01:WRITE DATA TO LED 02:READ DATA FROM KEY 03:READ
- DATA FROM SW
33 uchar mad: 1; //0递增 1指定地址
34 uchar mst: 1; //0正常 1测试模式
35 uchar dnc: 2; //数据空位
36 uchar ad2: 2; //此命令的地址值固定为0X01
37 }co2;
38 }co2;
39 union
40 {
41 uchar dat;
42 struct
43 {
44 uchar add: 5; //16312内部DISRAM地址选择
45 uchar dnc: 1; //数据空位
46 uchar ad3: 2; //此命令的地址值固定为0X03
47 }co3;
48 }co3;
49 union
50 {
51 uchar dat;
52 struct
53 {
54 uchar pwm: 3; //输出点亮时间选择(可以调节亮度)
C51 COMPILER V7.10 VFD 03/27/2005 22:39:54 PAGE 2
55 uchar dis: 1; //0显示关闭
56 uchar dnc: 2; //数据空位
57 uchar ad4: 2; //此命令的地址值固定为0X02
58 }co4;
59 }co4;
60
61 void wrd(uchar disno,bit lei) //写一个字节的命令或者数据(由LEI控制是写数据还是写命令)
62 {
63 1 uchar a;
64 1 if(lei)
65 1 goto s;
66 1 stb=1;
67 1 stb=1;
68 1 stb=0;
69 1 s: for(a=0;a<8;a++)
70 1 {
71 2 clk=1;
72 2 clk=1;
73 2 clk=0;
74 2 clk=0;
75 2 if(disno&0x01)
76 2 dat=1;
77 2 else
78 2 dat=0;
79 2 disno=disno>>1;
80 2 clk=1;
81 2 clk=1;
82 2 clk=1;
83 2 clk=1;
84 2 }
85 1 }
86 void inivfd(void)
87 {
88 1 cm1.dms=0x01;//设置为5区 16段
89 1 cm1.ad1=0x00;
90 1 cm2.mad=0x01;//地址模式为指定地址
91 1 cm2.mst=0x00;//取消测试
92 1 cm2.ad2=0x01;
93 1 cm3.ad3=0x03;
94 1 cm4.pwm=0x07;//亮度为最亮
95 1 cm4.dis=0x01;//打开显示
96 1 cm4.ad4=0x02;
97 1 }
98 /////////////////////////////************以下为主程序*************************//////////////////////
99 void wrvfd(uchar addr,uchar dat) //向VFD指定地址写数据
100 {
101 1 inivfd();
102 1 wrd(co1.dat,cmdd);
103 1 stb=1;
104 1 cm2.fru=0x00;
105 1 wrd(co2.dat,cmdd);
106 1 stb=1;
107 1 cm3.add=addr;
108 1 wrd(co3.dat,cmdd);
109 1 wrd(dat,datt);
110 1 stb=1;
111 1 wrd(co4.dat,cmdd);
112 1 stb=1;
113 1 }
114 void wrled(uchar leddata) //控制16312的四个输出口数据存放在LEDDATA的低四位
115 {
116 1 inivfd();
C51 COMPILER V7.10 VFD 03/27/2005 22:39:54 PAGE 3
117 1 cm2.fru=0x01;
118 1 wrd(co2.dat,cmdd);
119 1 wrd(leddata,datt);
120 1 stb=1;
121 1 }
122 ulong rdkey() //读键盘
123 {ulong key=0;
124 1 uchar i;
125 1 inivfd();
126 1 cm2.fru=0x02;
127 1 wrd(co2.dat,cmdd);
128 1 for(i=0;i<24;i++)
129 1 {
130 2 clk=1;
131 2 clk=1;
132 2 clk=0;
133 2 clk=0;
134 2 clk=0;
135 2 clk=1;
136 2 dat=1;
137 2 if(dat==1)
138 2 key=(key<<1)+1;
139 2 else
140 2 key=(key<<1);
141 2 }
142 1 switch(key)
143 1 {
144 2 case 0x00800000:remkey=0xc7;break;
145 2 case 0x00200000:remkey=0x47;break;
146 2 }
147 1 return(key);
148 1 }
149
150 vfddigit(ulong ch)
151 {
152 1 uchar h[5];
153 1 h[4]=(ch/10000);
154 1 h[3]=((ch%10000)/1000);
155 1 h[2]=((ch%1000)/100);
156 1 h[1]=((ch%100)/10);
157 1 h[0]=(ch%10); //将16进制转换成10进制显示
158 1
159 1 wrvfd(0x00,dis[h[0]]&((dis[h[1]]&0x01)?0xff:0x7f));
160 1 wrvfd(0x01,dis[h[1]]>>1);
161 1 wrvfd(0x02,dis[h[2]]&((dis[h[3]]&0x01)?0xff:0x7f));
162 1 if(h[3])
163 1 wrvfd(0x03,dis[h[3]]);
164 1 else
165 1 wrvfd(0x03,0x00); //根据供应商提供的VFD资料来写正确显示的算法,否则显示错乱!
166 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 578 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 13
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -