hsk-libs-dev  270
High Speed Karlsruhe XC878 library collection
hsk_icm7228.h
Go to the documentation of this file.
1 /** \file
2  * HSK ICM7228 8-Digit LED Display Decoder Driver generator
3  *
4  * This file is a code generating facility, that offers preprocessor macros
5  * that produce code for the Intersil ICM7228 display decoder.
6  *
7  * Generating code in this fashion avoids the hard coding of I/O registers
8  * and bits and even allows the use of multiple ICM7228 ICs.
9  *
10  * @see Intersil ICM7228 Data Sheet: <a href="../contrib/ICM7228.pdf">ICM7228.pdf</a>
11  * @author kami
12  */
13 
14 #ifndef _HSK_ICM7228_H_
15 #define _HSK_ICM7228_H_
16 
17 #include <string.h> /* memset() */
18 
19 /**
20  * Generate an ICM7228 driver instance.
21  *
22  * This creates functions to use a connect ICM7228 IC.
23  * - void <prefix>_init(void)
24  * - Initialize the buffer and I/O register bits
25  * - void <prefix>_refresh(void)
26  * - Commit buffered data to the 7 segment displays
27  * - void <prefix>_writeString(char * str, ubyte pos, ubyte len)
28  * - Wrapper around hsk_icm7228_writeString()
29  * - void <prefix>_writeDec(uword value, char power, ubyte pos, ubyte len)
30  * - Wrapper around hsk_icm7228_writeDec()
31  * - void <prefix>_writeHex(uword value, char power, ubyte pos, ubyte len)
32  * - Wrapper around hsk_icm7228_writeHex()
33  *
34  * @param prefix
35  * A prefix for the names of generated functions
36  * @param regData
37  * The register that is connected to the data input
38  * @param regMode
39  * The register that is connected to the mode pin
40  * @param bitMode
41  * The bit of the regMode register that is connected to the mode pin
42  * @param regWrite
43  * The register that is connected to the write pin
44  * @param bitWrite
45  * The bit of the regWrite register that is connected to the write pin
46  */
47 #define ICM7228_FACTORY(prefix, regData, regMode, bitMode, regWrite, bitWrite) \
48  \
49  /**
50  * Buffer for display driver at I/O port regData.
51  *
52  * @see ICM7228_FACTORY
53  */\
54  ubyte xdata prefix##_buffer[8]; \
55  \
56  /**
57  * Set up buffer and ports for display driver at I/O port regData.
58  *
59  * @see ICM7228_FACTORY
60  */\
61  void prefix##_init(void) { \
62  memset(prefix##_buffer, 0, sizeof(prefix##_buffer)); \
63  \
64  regMode##_DIR |= 1 << bitMode; \
65  regWrite##_DIR |= 1 << bitWrite; \
66  regData##_DIR = 0xff; \
67  } \
68  \
69  /**
70  * Reflesh displays at I/O port regData with the buffered data.
71  *
72  * @see ICM7228_FACTORY
73  */\
74  void prefix##_refresh(void) { \
75  ubyte i; \
76  \
77  /* Select write to control register. */ \
78  regMode##_DATA |= 1 << bitMode; \
79  \
80  /* Write to control register. */ \
81  regData##_DATA = 0xB0; /* Control Word */ \
82  regWrite##_DATA &= ~(1 << bitWrite); \
83  regWrite##_DATA |= 1 << bitWrite; \
84  \
85  /* Select write to display ram. */ \
86  regMode##_DATA &= ~(1 << bitMode); \
87  \
88  for (i = 0; i < 8; i++) { \
89  regData##_DATA = prefix##_buffer[i]; \
90  regWrite##_DATA &= ~(1 << bitWrite); \
91  regWrite##_DATA |= 1 << bitWrite; \
92  } \
93  } \
94  \
95  /**
96  * Write an ASCII encoded string into \ref prefix##_buffer.
97  *
98  * @param str
99  * The buffer to read the ASCII string from
100  * @param pos
101  * The position in the buffer to write the encoded string to
102  * @param len
103  * The target length of the encoded string
104  * @see ICM7228_FACTORY
105  * @see hsk_icm7228_writeString
106  */\
107  inline void prefix##_writeString(char const * const str, \
108  ubyte const pos, ubyte const len) { \
109  hsk_icm7228_writeString(prefix##_buffer, str, pos, len); \
110  } \
111  \
112  /**
113  * Write a decimal number into \ref prefix##_buffer.
114  *
115  * @param value
116  * The number to encode
117  * @param power
118  * The 10 base power of the number to encode
119  * @param pos
120  * The target position in the buffer
121  * @param len
122  * The number of digits available to encode the number
123  * @see ICM7228_FACTORY
124  * @see hsk_icm7228_writeDec
125  */\
126  inline void prefix##_writeDec(uword const value, char const power, \
127  ubyte const pos, ubyte const len) {\
128  hsk_icm7228_writeDec(prefix##_buffer, value, power, pos, len); \
129  } \
130  \
131  /**
132  * Write a hexadecimal number into \ref prefix##_buffer.
133  *
134  * @param value
135  * The number to encode
136  * @param power
137  * The 16 base power of the number to encode
138  * @param pos
139  * The target position in the buffer
140  * @param len
141  * The number of digits available to encode the number
142  * @see ICM7228_FACTORY
143  * @see hsk_icm7228_writeHex
144  */\
145  inline void prefix##_writeHex(uword const value, char const power, \
146  ubyte const pos, ubyte const len) {\
147  hsk_icm7228_writeHex(prefix##_buffer, value, power, pos, len); \
148  } \
149  \
150  /**
151  * Illuminate a number of segments in \ref prefix##_buffer.
152  * @param segments
153  * The number of segments to illuminate
154  * @param pos
155  * The target position in the buffer
156  * @param len
157  * The number of digits available to encode the number
158  * @see ICM7228_FACTORY
159  * @see hsk_icm7228_illuminate
160  */\
161  inline void prefix##_illuminate(ubyte const segments, ubyte const pos, \
162  ubyte const len) {\
163  hsk_icm7228_illuminate(prefix##_buffer, segments, pos, len); \
164  } \
165 
166 /**
167  * Convert an ASCII string to 7 segment encoding and store it in an xdata
168  * buffer.
169  *
170  * This function is usually invoked through the <prefix>_writeString()
171  * function created by ICM7228_FACTORY.
172  *
173  * The function will write into the buffer until it has been filled with len
174  * characters or it encounters a 0 character reading from str.
175  * If the character '.' is encountered it is merged with the previous
176  * character, unless that character is a '.' itself. Thus a single dot does
177  * not use additional buffer space. The 7 character string "foo ..." would
178  * result in 6 encoded bytes. Thus the proper len value for that string would
179  * be 6.
180  *
181  * @param buffer
182  * The target buffer for the encoded string
183  * @param str
184  * The buffer to read the ASCII string from
185  * @param pos
186  * The position in the buffer to write the encoded string to
187  * @param len
188  * The target length of the encoded string
189  */
190 void hsk_icm7228_writeString(ubyte xdata * const buffer, \
191  char const * str, ubyte pos, ubyte len);
192 
193 /**
194  * Write a 7 segment encoded, right aligned decimal number into an xdata
195  * buffer.
196  *
197  * The power parameter controlls the placing of the '.' by 10 to the power.
198  * E.g. value = 12, power = -1 and len = 3 would result in the encoding of
199  * " 1.2". If power = 0, no dot is drawn. If the power is positive (typically
200  * 1), the resulting string would be filled with '0' characters.
201  * I.e. the previous example with power = 1 would result in an encoding of
202  * "012".
203  *
204  * @param buffer
205  * The target buffer for the encoded string
206  * @param value
207  * The number to encode
208  * @param power
209  * The 10 base power of the number to encode
210  * @param pos
211  * The target position in the buffer
212  * @param len
213  * The number of digits available to encode the number
214  */
215 void hsk_icm7228_writeDec(ubyte xdata * const buffer, uword value,
216  char power, ubyte const pos, ubyte len);
217 
218 /**
219  * Write a 7 segment encoded, right aligned hexadecimal number into an xdata
220  * buffer.
221  *
222  * The power parameter controlls the placing of the '.' by 16 to the power.
223  * E.g. value = 0x1A, power = -1 and len = 3 would result in the encoding of
224  * " 1.A". If power = 0, no dot is drawn. If the power is positive (typically
225  * 1), the resulting string would be filled with '0' characters.
226  * I.e. the previous example with power = 1 would result in an encoding of
227  * "01A".
228  *
229  * @param buffer
230  * The target buffer for the encoded string
231  * @param value
232  * The number to encode
233  * @param power
234  * The 16 base power of the number to encode
235  * @param pos
236  * The target position in the buffer
237  * @param len
238  * The number of digits available to encode the number
239  */
240 void hsk_icm7228_writeHex(ubyte xdata * const buffer, uword value,
241  char power, ubyte const pos, ubyte len);
242 
243 /**
244  * Illumante the given number of segments.
245  *
246  * @param buffer
247  * The target buffer for the encoded string
248  * @param segments
249  * The number of segments to illuminate
250  * @param pos
251  * The target position in the buffer
252  * @param len
253  * The number of digits available to encode the number
254  */
255 void hsk_icm7228_illuminate(ubyte xdata * const buffer,
256  ubyte segments, ubyte pos, ubyte len);
257 
258 #endif /* _HSK_ICM7228_H_ */
259 
uword buffer[8]
A ring buffer of PWC values.
Definition: hsk_pwc.c:56
void hsk_icm7228_writeString(ubyte *const buffer, char const *str, ubyte pos, ubyte len)
Convert an ASCII string to 7 segment encoding and store it in an xdata buffer.
Definition: hsk_icm7228.c:60
void hsk_icm7228_writeDec(ubyte *const buffer, uword value, char power, ubyte const pos, ubyte len)
Write a 7 segment encoded, right aligned decimal number into an xdata buffer.
Definition: hsk_icm7228.c:74
ubyte pos
The current ring position.
Definition: hsk_pwc.c:71
void hsk_icm7228_illuminate(ubyte *const buffer, ubyte segments, ubyte pos, ubyte len)
Illumante the given number of segments.
Definition: hsk_icm7228.c:100
void hsk_icm7228_writeHex(ubyte *const buffer, uword value, char power, ubyte const pos, ubyte len)
Write a 7 segment encoded, right aligned hexadecimal number into an xdata buffer. ...
Definition: hsk_icm7228.c:87