123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /*
- *
- * Ïîäïðîãðàìêè, êîòîðûå ÿ óñïåë íàâàÿòü íà C
- *
- */
- //============================================================================
- // ïðîãðàììíûé SPI. Âûâîäèò áàéò íà÷èíàÿ ñî ñòàðøåãî áèòà
- // âûõîäíûå ïèíû -- SCK, MOSI, ïîðò -- SPI_PORT. ñòðîá -- èç 0 â 1
- void spi_SendByte (uint8_t DataByte) {
- uint8_t i; // ñ÷åò÷èê áèò
- for (i=8; i>0; i--) {
- SPI_PORT &= (~(1<<PIN_SCK)); // âûäàëè ñòðîá
- if (bit_is_set(DataByte,7)) { // åñëè áèò 7 == 1
- SPI_PORT |= (1<<PIN_MOSI); // MOSI = 1
- } else { // åñëè áèò 7 == 0
- SPI_PORT &= (~(1<<PIN_MOSI)); // MOSI = 0
- }
- SPI_PORT |= (1<<PIN_SCK); // çàù¸ëêíóëè ñòðîá
- DataByte <<= 1; // ñäâèã âëåâî íà 1 áèò
- }
- }
- //============================================================================
- // bcd2ascii
- // ïðèäóìàë ñàì, åù¸ íå ïðîâåðÿë
- typdef struct {uint8_t msb, uint8_t lsb} x2_ascii;
- x2_ascii BCD_to_ASCII(unit8_t bcd) {
- x2_ascii ascii;
- ascii.msb = bcd;
- ascii.lsb = bcd;
- ascii.msb >>= 4;
- ascii.msb |= 0x0F;
- ascii.lsb |= 0x0F;
- ascii.msb += 0x30;
- ascii.lsb += 0x30;
- return ascii;
- }
- // êàê-òî òàê...
- //============================================================================
- /*
- http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=66337
- Post subject: RE: 16bit Binary to BCD conversion
- The cheap way, leveraging on the C libraries ascii conversion routines.
- Code:
- */
- char (*a)[10]; // Óêàçàòåëü íà ìàññèâ èç äåñÿòè ñèìâîëîâ
- // returns number of digits converted
- // result array must be large enough to hold
- // the number of digits converted.
- int itobcd(unsigned int val, char *result)
- {
- char BCD_text[6]; // max 5 digits in a 16 bit uint
- int i;
- itoa(val, BCD_text, 10);
- i=0;
- while(BCD_text[i])
- {
- result[i] = BCD_text[i]-'0';
- i++;
- }
- return i;
- }
- //============================================================================
- // http://www.strudel.org.uk/itoa/
- // char* version 0.1
- char* itoa(int val, int base){
- static char buf[32] = {0};
- int i = 30;
- for(; val && i ; --i, val /= base){
- buf[i] = "0123456789abcdef"[val % base];
- }
- return &buf[i+1];
- }
- // char* version 0.4
- /*
- * C++ version 0.4 char* style "itoa":
- * Written by Lukas Chmela
- * Released under GPLv3.
- */
- char* itoa(int value, char* result, int base) {
- // check that the base if valid
- if (base < 2 || base > 36) { *result = '\0'; return result; }
- char* ptr = result, *ptr1 = result, tmp_char;
- int tmp_value;
- do {
- tmp_value = value;
- value /= base;
- *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
- } while ( value );
- // Apply negative sign
- if (tmp_value < 0) *ptr++ = '-';
- *ptr-- = '\0';
- while(ptr1 < ptr) {
- tmp_char = *ptr;
- *ptr--= *ptr1;
- *ptr1++ = tmp_char;
- }
- return result;
- }
- //============================================================================
- /*
- Ðåàëèçàöèÿ îò Êåðíèãàíà è Ðèò÷è
- Ôóíêöèÿ itoa ïîÿâèëàñü â ïåðâîì èçäàíèè êíèãè Áðàéàíà Êåðíèãàíà è Äåíèñà
- Ðèò÷è ßçûê ïðîãðàììèðîâàíèÿ Ñè, íà ñòðàíèöå 60. Âòîðîå èçäàíèå ßçûê
- ïðîãðàììèðîâàíèÿ Ñè («K&R2») íà ñòð. 64 ñîäåðæàëî íèæåñëåäóþùóþ ðåàëèçàöèþ
- itoa.  êíèãå îòìå÷åíî íåñêîëüêî âîïðîñîâ, ñâÿçàííûõ ñ ýòîé ðåàëèçàöèåé,
- âêëþ÷àÿ òîò ôàêò, ÷òî îíà íå â ñîñòîÿíèè êîððåêòíî îáðàáîòàòü ñàìîå
- ìàëåíüêîå îòðèöàòåëüíîå ÷èñëî -2äëèíà ìàøèííîãî ñëîâà â áèòàõ-1.[1]
- */
- /* itoa: êîíâåðòèðóåì n â ñèìâîëû â s */
- void itoa(int n, char s[])
- {
- int i, sign;
-
- if ((sign = n) < 0) /* çàïèñûâàåì çíàê */
- n = -n; /* äåëàåì n ïîëîæèòåëüíûì ÷èñëîì */
- i = 0;
- do { /* ãåíåðèðóåì öèôðû â îáðàòíîì ïîðÿäêå */
- s[i++] = n % 10 + '0'; /* áåðåì ñëåäóþùóþ öèôðó */
- } while ((n /= 10) > 0); /* óäàëÿåì */
- if (sign < 0)
- s[i++] = '-';
- s[i] = '\0';
- reverse(s);
- }
- /*
- Ôóíêöèÿ reverse ðåàëèçîâàíà äâóìÿ ñòðàíèöàìè ðàíåå:
- */
- #include <string.h>
- /* reverse: ïåðåâîðà÷èâàåì ñòðîêó s íà ìåñòå */
- void reverse(char s[])
- {
- int i, j;
- char c;
- for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
- c = s[i];
- s[i] = s[j];
- s[j] = c;
- }
- }
- //============================================================================
- // çàäåðæêà íà ïðåðûâàíèÿõ
- void delay_ms (word ms) {
- ADCSRA &= (~(1<<ADEN)); // âûêëþ÷èì ÀÖÏ
- do { // äâà áàéòà ýêîíîìèè
- set_sleep_mode(SLEEP_MODE_IDLE);
- sleep_mode();
- } while (ms > 0);
- ADCSRA |= (1<<ADEN); // âêëþ÷èì ÀÖÏ
- }
|