1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| #define LOW 0
#define HIGH 1
#define ADC_RESOLUTION 16777216.0
#define INPUT 1
#define OUTPUT 0
// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
//HX711 Connections
sbit HX711_SCLK at RD0_bit;
sbit HX711_DOUT at RC0_bit;
sbit HX711_SCLK_Direction at TRISD0_bit;
sbit HX711_DOUT_Direction at TRISC0_bit;
const code char txt1[] = "\r\n";
const code char txt2[] = " Weighing Scale";
unsigned char my_flags_a = 0;
unsigned char common_cathode_seven_segment_mask[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
char seven_segment_digit = 0;
char output_string[23], k = 0;
unsigned char enable_timer1_interrupt_flag = 0;
unsigned char mode_flag = 0;
unsigned char digits[6] = {0,0,0,0,0,0};
unsigned long int raw_adc_value = 0, previous_raw_adc_value = 0xFFFFFFFF;
double weight = 0.0;
unsigned char q = 0, t = 0, mask = 0x80;
char *CopyConst2Ram(char * dest, const code char *src) {
char *d;
d = dest;
for(;*dest++ = *src++;);
return d;
}
unsigned long Read_HX711() {
unsigned long count = 0;
unsigned char i; //, highest = 0, higher = 0, hi = 0, lo = 0;
HX711_DOUT_Direction = OUTPUT;
HX711_SCLK_Direction = OUTPUT;
HX711_DOUT = 1;
HX711_SCLK = 0;
HX711_DOUT_Direction = INPUT;
while(HX711_DOUT);
for(i = 0; i < 24; i++) { // gain 128
HX711_SCLK = 1;
count <<= 1;
HX711_SCLK = 0;
if(HX711_DOUT)count++;
}
HX711_SCLK = 1;
count ^= 0x800000;
HX711_SCLK = 0;
return(count);
}
void main(void) {
asm clrwdt
CMCON = 0x07;
ADCON0 = 0x40;
ADCON1 = 0x8F;
TRISA = 0x00;
TRISB = 0x00;
TRISC = 0x80;
TRISD = 0x00;
TRISE = 0x00;
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;
Delay_ms(200);
LCD_Init();
LCD_Cmd(_LCD_CURSOR_OFF);
LCD_Cmd(_LCD_CLEAR);
LCD_Out(1,1,CopyConst2Ram(output_string, txt2));
while (1) {
asm clrwdt
raw_adc_value = Read_HX711();
Delay_ms(2);
if(previous_raw_adc_value != raw_adc_value) {
weight = ((double)raw_adc_value * 1000.0 / ADC_RESOLUTION);
FloatToStr_FixLen(weight, output_string, 7);
strcat(output_string, " Kg");
LCD_Out(2,1,output_string);
previous_raw_adc_value = raw_adc_value;
}
}
} |