⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rprintf_8c-source.html

📁 国外牛人公开的AVR代码
💻 HTML
📖 第 1 页 / 共 4 页
字号:
00191     <span class="keywordtype">char</span> *p, buf[32];00192     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> x;00193     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> count;00194 00195     <span class="comment">// prepare negative number</span>00196     <span class="keywordflow">if</span>( isSigned &amp;&amp; (n &lt; 0) )00197     {00198         x = -n;00199     }00200     <span class="keywordflow">else</span>00201     {00202         x = n;00203     }00204 00205     <span class="comment">// setup little string buffer</span>00206     count = (numDigits-1)-(isSigned?1:0);00207     p = buf + <span class="keyword">sizeof</span> (buf);00208     *--p = <span class="charliteral">'\0'</span>;00209     00210     <span class="comment">// force calculation of first digit</span>00211     <span class="comment">// (to prevent zero from not printing at all!!!)</span>00212     *--p = pgm_read_byte(HexChars + (x%base)); x /= base;00213     <span class="comment">// calculate remaining digits</span>00214     <span class="keywordflow">while</span>(count--)00215     {00216         <span class="keywordflow">if</span>(x != 0)00217         {00218             <span class="comment">// calculate next digit</span>00219             *--p = pgm_read_byte(HexChars + (x%base)); x /= base;00220         }00221         <span class="keywordflow">else</span>00222         {00223             <span class="comment">// no more digits left, pad out to desired length</span>00224             *--p = padchar;00225         }00226     }00227 00228     <span class="comment">// apply signed notation if requested</span>00229     <span class="keywordflow">if</span>( isSigned )00230     {00231         <span class="keywordflow">if</span>(n &lt; 0)00232         {00233             *--p = <span class="charliteral">'-'</span>;00234         }00235         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(n &gt; 0)00236         {00237             *--p = <span class="charliteral">'+'</span>;00238         }00239         <span class="keywordflow">else</span>00240         {00241             *--p = <span class="charliteral">' '</span>;00242         }00243     }00244 00245     <span class="comment">// print the string right-justified</span>00246     count = numDigits;00247     <span class="keywordflow">while</span>(count--)00248     {00249         <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(*p++);00250     }00251 }00252 00253 <span class="preprocessor">#ifdef RPRINTF_FLOAT</span>00254 <span class="preprocessor"></span><span class="comment">// *** rprintfFloat ***</span>00255 <span class="comment">// floating-point print</span>00256 <span class="keywordtype">void</span> rprintfFloat(<span class="keywordtype">char</span> numDigits, <span class="keywordtype">double</span> x)00257 {00258     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> firstplace = FALSE;00259     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> negative;00260     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i, digit;00261     <span class="keywordtype">double</span> place = 1.0;00262     00263     <span class="comment">// save sign</span>00264     negative = (x&lt;0);00265     <span class="comment">// convert to absolute value</span>00266     x = (x&gt;0)?(x):(-x);00267     00268     <span class="comment">// find starting digit place</span>00269     <span class="keywordflow">for</span>(i=0; i&lt;15; i++)00270     {00271         <span class="keywordflow">if</span>((x/place) &lt; 10.0)00272             <span class="keywordflow">break</span>;00273         <span class="keywordflow">else</span>00274             place *= 10.0;00275     }00276     <span class="comment">// print polarity character</span>00277     <span class="keywordflow">if</span>(negative)00278         <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00279     <span class="keywordflow">else</span>00280         <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'+'</span>);00281 00282     <span class="comment">// print digits</span>00283     <span class="keywordflow">for</span>(i=0; i&lt;numDigits; i++)00284     {00285         digit = (x/place);00286 00287         <span class="keywordflow">if</span>(digit | firstplace | (place == 1.0))00288         {00289             firstplace = TRUE;00290             <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(digit+0x30);00291         }00292         <span class="keywordflow">else</span>00293             <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00294         00295         <span class="keywordflow">if</span>(place == 1.0)00296         {00297             <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'.'</span>);00298         }00299         00300         x -= (digit*place);00301         place /= 10.0;00302     }00303 }00304 <span class="preprocessor">#endif</span>00305 <span class="preprocessor"></span>00306 <span class="preprocessor">#ifdef RPRINTF_SIMPLE</span>00307 <span class="preprocessor"></span><span class="comment">// *** rprintf1RamRom ***</span>00308 <span class="comment">// called by rprintf() - does a simple printf (supports %d, %x, %c)</span>00309 <span class="comment">// Supports:</span>00310 <span class="comment">// %d - decimal</span>00311 <span class="comment">// %x - hex</span>00312 <span class="comment">// %c - character</span><a name="l00313"></a><a class="code" href="group__rprintf.html#ga11">00313</a> <span class="keywordtype">int</span> <a class="code" href="group__rprintf.html#ga11">rprintf1RamRom</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> stringInRom, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...)00314 {00315     <span class="comment">// simple printf routine</span>00316     <span class="comment">// define a global HexChars or use line below</span>00317     <span class="comment">//static char HexChars[16] = "0123456789ABCDEF";</span>00318     <span class="keywordtype">char</span> format_flag;00319     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> u_val, div_val, base;00320     va_list ap;00321 00322     va_start(ap, format);00323     <span class="keywordflow">for</span> (;;)00324     {00325         <span class="keywordflow">while</span> ((format_flag = READMEMBYTE(stringInRom,format++) ) != <span class="charliteral">'%'</span>)00326         {   <span class="comment">// Until '%' or '\0'</span>00327             <span class="keywordflow">if</span> (!format_flag)00328             {00329                 va_end(ap);00330                 <span class="keywordflow">return</span>(0);00331             }00332             <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(format_flag);00333         }00334 00335         <span class="keywordflow">switch</span> (format_flag = READMEMBYTE(stringInRom,format++) )00336         {00337             <span class="keywordflow">case</span> <span class="charliteral">'c'</span>: format_flag = va_arg(ap,<span class="keywordtype">int</span>);00338             <span class="keywordflow">default</span>:  <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(format_flag); <span class="keywordflow">continue</span>;00339             <span class="keywordflow">case</span> <span class="charliteral">'d'</span>: base = 10; div_val = 10000; <span class="keywordflow">goto</span> CONVERSION_LOOP;00340             <span class="keywordflow">case</span> <span class="charliteral">'x'</span>: base = 16; div_val = 0x10;00341 00342             CONVERSION_LOOP:00343             u_val = va_arg(ap,<span class="keywordtype">int</span>);00344             <span class="keywordflow">if</span> (format_flag == <span class="charliteral">'d'</span>)00345             {00346                 <span class="keywordflow">if</span> (((<span class="keywordtype">int</span>)u_val) &lt; 0)00347                 {00348                     u_val = - u_val;00349                     <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00350                 }00351                 <span class="keywordflow">while</span> (div_val &gt; 1 &amp;&amp; div_val &gt; u_val) div_val /= 10;00352             }00353             <span class="keywordflow">do</span>00354             {00355                 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(pgm_read_byte(HexChars+(u_val/div_val)));00356                 u_val %= div_val;00357                 div_val /= base;00358             } <span class="keywordflow">while</span> (div_val);00359         }00360     }00361     va_end(ap);00362 }00363 <span class="preprocessor">#endif</span>00364 <span class="preprocessor"></span>00365 00366 <span class="preprocessor">#ifdef RPRINTF_COMPLEX</span>00367 <span class="preprocessor"></span><span class="comment">// *** rprintf2RamRom ***</span>00368 <span class="comment">// called by rprintf() - does a more powerful printf (supports %d, %u, %o, %x, %c, %s)</span>00369 <span class="comment">// Supports:</span>00370 <span class="comment">// %d - decimal</span>00371 <span class="comment">// %u - unsigned decimal</span>00372 <span class="comment">// %o - octal</span>00373 <span class="comment">// %x - hex</span>00374 <span class="comment">// %c - character</span>00375 <span class="comment">// %s - strings</span>00376 <span class="comment">// and the width,precision,padding modifiers</span>00377 <span class="comment">// **this printf does not support floating point numbers</span>00378 <span class="keywordtype">int</span> rprintf2RamRom(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> stringInRom, <span class="keyword">const</span> <span class="keywordtype">char</span> *sfmt, ...)00379 {00380     <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *f, *bp;00381     <span class="keyword">register</span> <span class="keywordtype">long</span> l;00382     <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> u;00383     <span class="keyword">register</span> <span class="keywordtype">int</span> i;00384     <span class="keyword">register</span> <span class="keywordtype">int</span> fmt;00385     <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> pad = <span class="charliteral">' '</span>;00386     <span class="keywordtype">int</span> flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0;00387     <span class="keywordtype">int</span> sign = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -