📄 108.lst
字号:
1: /*软件名称:智能涡轮流量计 *
2: * *
3: *作者:李维平&陈超 *
4: *时间:星期二 2005年4月26日 *
5: * 晶振:640KHZ *
6: * 微处理器:PIC16F877或者PIC16F877A *
7: * 采用澳大利亚HI-TECH公司的PICC编译器 * * 功能简介: *
8: *可显示瞬时流量和累计流量 *
9: *累计量定时存储于EEPROM *
10: *瞬时量和累计量都可实现精度自动调整(小数点动态移动显示) *
11: *仪表系数K可以在线置入EEPROM当中,设置同时计量工作仍继续 *
12: *当第一点K值为0时,可以作为频率计使用 *
13: *仪表系数的点数可通过修改宏定义中的set 值来改变,范围3~6点 *
14: *按键操作采用中断方式 *
15: *仪表系数K默认小数部分为零 *
16: * *
17: * */
18: #include <pic.h>
19: #include <pic1687x.h>
20: //#include <pic168xa.h>
21: #include <math.h>
22: #include <stdio.h>
23:
24: #define uchar unsigned char
25: #define uint unsigned int
26: #define ushort unsigned short
27: #define ulong unsigned long
28: #define sleep() asm("sleep")
29: #define nop() asm("nop")
30: #define clrwdt() asm("clrwdt")
31: #define CS RB1
32: #define WR RB2
33: #define DATA RB3
34: #define KEY_SR RB4 //RB4
35: #define KEY_ADD RB6
36: #define KEY_F RB5 //RB6
37:
38: #define set1 3 //set1为仪表系数点数3~6点
39: #define set2 1 //set2为0,无满度流量,set2为1,有满度流量
40:
41: void delay(uchar x,uchar y);
42: void delay1(void);
43: void delay2(void);
44: void Lcd_Write_Com(uchar com);
45: void Lcd_Write_Data_Contin_u(uchar addr,uchar j);
46: void Lcd_Write_Data_Contin_n(uchar addr,uchar j);
47: void Lcd_Write_Data_Q_or_P(uchar j);
48: void Lcd_Black();
49: void Lcd_Init(void);
50: void Timer_Init(void);
51: void Eeprom_Initia(void);
52: void interrupt ISR(void);
53: void Read_Fre_K(void);
54: void Caculate_pre();
55: void Caculate();
56: void Caculate_Q3();
57: void Dis_Buf(void);
58: void Lcd_Dispay(void);
59: void Cumulation_to_EEPROM();
60: void Read_Sum_flux();
61: void Parameter_Set();
62: void ccp2_out(void);
63: void Sum_Q_Clear();
64:
65:
66: bank3 uchar i,eeadr,addr,da,time_f_sr=0,time_sr=0,no_f=0,ti;
67: bit flag_tmr0=0,flag_tmr1=0,key_f=0,key_sr=0,key_add=0,key_f_add=0,key_f_sr=0,key_sr_add=0,flag_set=0,flag_out=0,flag_turn,flag_mid;
68: uchar *p1,x[3],y[3],save_time,save_adr,pass_time,ct=0,disp_buf[15],disp;
69: bank2 uchar n1,m1,n2,m2,n3,m3,n4,m4,gdl,jc,jm;
70: bank3 uint x1,x2,F1,F2,F3,F4,F5,F6,Q2d,ff;
71: bank2 float K1,K2,K3,K4,K5,K6,b0,b1,b2,b3,b4;
72: bank1 ulong Q3nd,Q3ud,Q3INT,Qfull;
73: bank1 float Q2,Q3DEC,*p2,fr,K,qqq,Q1,frqian,Qliu,Q3;
74: bank1 uint mm @ 0xA0;
75: bank3 uint gao @ 0x1A0;
76: bank3 uchar cp @ 0x1A2;
77:
78:
79: const char table_up_for_lcd [25][2]={// the digit from "0" to "9" for upper number 1~6
80: {0xe0,0xb0},{0x60,0x00},{0xC0,0x70},{0xe0,0x50},//0~9不带点
81: {0x60,0xc0},{0xa0,0xd0},{0xa0,0xf0},{0xe0,0x00},
82: {0xe0,0xf0},{0xe0,0xd0},
83: {0xf0,0xb0},{0x70,0x00},{0xd0,0x70},{0xf0,0x50}, //0~9带点
84: {0x70,0xc0},{0xb0,0xd0},{0xb0,0xf0},{0xf0,0x00},
85: {0xf0,0xf0},{0xf0,0xd0},
86: {0x00,0x00},{0x10,0x00}}; //BLACK,末尾显Q1可不要 03.10调换后两位位置
87:
88: const char table_nether_for_lcd[21][2]={ //used nether number 7~14 // segment for character 0~9
89: {0xd0,0x70},{0x00,0x60},{0xe0,0x30},{0xa0,0x70}, //0~3不带点
90: {0x30,0x60},{0xb0,0x50},{0xF0,0x50},{0x00,0x70}, //4~7
91: {0xf0,0x70},{0xb0,0x70},
92: {0xd0,0xf0},{0x00,0xe0},{0xe0,0xb0},{0xa0,0xf0}, //0~3带点
93: {0x30,0xe0},{0xb0,0xd0},{0xF0,0xd0},{0x00,0xf0}, //4~7
94: {0xf0,0xf0},{0xb0,0xf0},
95: {0x00,0x00} }; //8,9,.,black
96:
97: const char Ladr[16]={ //液晶字符地址
98: 0x15,0x13,0x11,0x0f,
99: 0x1e,0x1c,0x00,0x02,0x04,0x06,0x08,0x0a,0x19,0x17};
100:
101: //#pragma interrupt_level 1
102: void delay(uchar x,uchar y) //delay time :14+(3*(Y-1)+7)*(X-1)
103: {
104: uchar z;
105: do{
106: z=y;
107: do{;}while(--z);
108: }while(--x);
109: }
110:
111: void delay1() //delay function
112: {
113: nop();
114: }
115:
116: void delay2() //delay function
117: {
118: uchar x;
119: x=250;
120: while(--x){;};
121: }
122:
123: void Lcd_Write_Com(uchar com) //write command to lcd
124: {
125: uchar j;
126: CS=1; // pre-initialize
127: delay1();
128: nop();
129: CS=0; // pre-initialize
130: delay1();
131:
132: DATA=1;
133: delay1();
134: WR=0;
135: delay1();
136: WR=1;
137: delay1(); //d=1 command mode 100
138:
139: DATA=0;
140: delay1();
141: WR=0;
142: delay1();
143: WR=1;
144: delay1(); //d=0
145:
146: DATA=0;
147: delay1();
148: WR=0;
149: delay1();
150: WR=1;
151: delay1(); //d=0
152:
153: for(j=0;j<8;j++) //write 8+1 bit command
154: {
155: if(com&0x80)
156: DATA=1;
157: else
158: DATA=0;
159: delay1();
160: WR=0;
161: delay1();
162: WR=1;
163: delay1();
164: com<<=1;
165: }
166: DATA=0;
167: delay1();
168: WR=0;
169: delay1();
170: WR=1;
171: delay1(); //the last bit of the command 0
172: }
173:
174: //#pragma interrupt_level 1
175: void Lcd_Write_Data_Contin_u(uchar addr,uchar j) //液晶显示器上排显示
176: {
177: uchar k,m,da;
178: CS=1; // pre-initialize
179: delay1();
180: CS=0; // pre-initialize
181: delay1();
182:
183: DATA=1;
184: delay1();
185: WR=0;
186: delay1();
187: WR=1;
188: delay1(); //d=1 data mode 101
189:
190: DATA=0;
191: delay1();
192: WR=0;
193: delay1();
194: WR=1;
195: delay1(); //d=0
196:
197: DATA=1;
198: delay1();
199: WR=0;
200: delay1();
201: WR=1;
202: delay1(); //d=1
203: addr<<=2; //surpose that ADDR=8bit
204: for (k=0;k<6;k++)
205: {
206: if (addr&0x80)
207: DATA=1;
208: else
209: DATA=0;
210: WR=0;
211: delay1();
212: WR=1;
213: delay1();
214: addr<<=1;
215: }
216: for(k=0;k<2;k++) //send number
217: {
218: da= table_up_for_lcd [j][k]; //j is determined by other things
219: for(m=0;m<4;m++)
220: {
221: if(da&0x80) //send DATA first ,WR clock second for safety
222: DATA=1;
223: else
224: DATA=0;
225: WR=0;
226: delay1();
227: WR=1;
228: delay1();
229: da<<=1;
230: }
231: }
232: }
233:
234:
235:
236: //#pragma interrupt_level 1
237: void Lcd_Write_Data_Contin_n(uchar addr,uchar j) //液晶显示器下排显示
238: {
239: uchar k,m,da;
240: CS=1; // pre-initialize
241: delay1();
242: CS=0; // pre-initialize
243: delay1();
244:
245: DATA=1;
246: delay1();
247: WR=0;
248: delay1();
249: WR=1;
250: delay1(); //d=1 data mode 101
251:
252: DATA=0;
253: delay1();
254: WR=0;
255: delay1();
256: WR=1;
257: delay1(); //d=0
258:
259: DATA=1;
260: delay1();
261: WR=0;
262: delay1();
263: WR=1;
264: delay1(); //d=1
265: // addr=0x19; //the digit 5's address
266: // Lcd_Write_Data_Addr();
267: addr<<=2; //surpose that ADDR=8bit
268: for (k=0;k<6;k++)
269: {
270: if (addr&0x80)
271: DATA=1;
272: else
273: DATA=0;
274: WR=0;
275: delay1();
276: WR=1;
277: delay1();
278: addr<<=1;
279: }
280:
281: for(k=0;k<2;k++) //send number
282: {
283: da= table_nether_for_lcd [j][k]; //j is determined by other things
284: for(m=0;m<4;m++)
285: {
286: if(da&0x80) //send DATA first ,WR clock second for safety
287: DATA=1;
288: else
289: DATA=0;
290: WR=0;
291: delay1();
292: WR=1;
293: delay1();
294: da<<=1;
295: }
296: }
297: }
298:
299: //#pragma interrupt_level 1
300:
301: void Lcd_Write_Data_Q_or_P(uchar j) //K1为0时显示P,其余情况显示Q
302: {
303: uchar k,m,da,addr;
304: CS=1; // pre-initialize
305: delay1();
306: CS=0; // pre-initialize
307: delay1();
308:
309: DATA=1;
310: delay1();
311: WR=0;
312: delay1();
313: WR=1;
314: delay1(); //d=1 data mode 101
315:
316: DATA=0;
317: delay1();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -