OpenCores
URL https://opencores.org/ocsvn/cpu_lecture/cpu_lecture/trunk

Subversion Repositories cpu_lecture

[/] [cpu_lecture/] [trunk/] [app/] [hello.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jsauermann
#include "stdint.h"
2
#include "avr/io.h"
3
#include "avr/pgmspace.h"
4
 
5
#undef F_CPU
6
#define F_CPU 25000000UL
7
#include "util/delay.h"
8
 
9
 
10
     //----------------------------------------------------------------------//
11
    //                                                                      //
12
   //   print char cc on UART.                                             //
13
  //    return number of chars printed (i.e. 1).                          //
14
 //                                                                      //
15
//----------------------------------------------------------------------//
16
uint8_t
17
uart_putc(uint8_t cc)
18
{
19
    while ((UCSRA & (1 << UDRE)) == 0)      ;
20
    UDR = cc;
21
    return 1;
22
}
23
 
24
     //----------------------------------------------------------------------//
25
    //                                                                      //
26
   //   print char cc on 7 segment display.                                //
27
  //    return number of chars printed (i.e. 1).                          //
28
 //                                                                      //
29
//----------------------------------------------------------------------//
30
// The segments of the display are encoded like this:
31
//
32
//
33
//      segment     PORT B
34
//      name        Bit number
35
//      ----A----   ----0----
36
//      |       |   |       |
37
//      F       B   5       1
38
//      |       |   |       |
39
//      ----G----   ----6----
40
//      |       |   |       |
41
//      E       C   4       2
42
//      |       |   |       |
43
//      ----D----   ----3----
44
//
45
//-----------------------------------------------------------------------------
46
 
47
#define SEG7(G, F, E, D, C, B, A)   (~(G<<6|F<<5|E<<4|D<<3|C<<2|B<<1|A))
48
 
49
uint8_t
50
seg7_putc(uint8_t cc)
51
{
52
uint16_t t;
53
 
54
    switch(cc)
55
    {                   //   G F E D C B A
56
    case ' ':   PORTB = SEG7(0,0,0,0,0,0,0);        break;
57
    case 'E':   PORTB = SEG7(1,1,1,1,0,0,1);        break;
58
    case 'H':   PORTB = SEG7(1,1,1,0,1,1,0);        break;
59
    case 'L':   PORTB = SEG7(0,1,1,1,0,0,0);        break;
60
    case 'O':   PORTB = SEG7(0,1,1,1,1,1,1);        break;
61
    default:    PORTB = SEG7(1,0,0,1,0,0,1);        break;
62
    }
63
 
64
    // wait 800 + 200 ms. This can be quite boring in simulations,
65
    // so we wait only if DIP switch 6 is closed.
66
    //
67
    if (!(PINB & 0x20))     for (t = 0; t < 800; ++t)   _delay_ms(1);
68
    PORTB = SEG7(0,0,0,0,0,0,0);
69
    if (!(PINB & 0x20))     for (t = 0; t < 200; ++t)   _delay_ms(1);
70
 
71
    return 1;
72
}
73
 
74
     //----------------------------------------------------------------------//
75
    //                                                                      //
76
   //   print string s on UART.                                            //
77
  //    return number of chars printed.                                   //
78
 //                                                                      //
79
//----------------------------------------------------------------------//
80
uint16_t
81
uart_puts(const char * s)
82
{
83
const char * from = s;
84
uint8_t cc;
85
    while ((cc = pgm_read_byte(s++)))   uart_putc(cc);
86
    return s - from - 1;
87
}
88
 
89
     //----------------------------------------------------------------------//
90
    //                                                                      //
91
   //   print string s on 7 segment display.                               //
92
  //    return number of chars printed.                                   //
93
 //                                                                      //
94
//----------------------------------------------------------------------//
95
uint16_t
96
seg7_puts(const char * s)
97
{
98
const char * from = s;
99
uint8_t cc;
100
    while ((cc = pgm_read_byte(s++)))   seg7_putc(cc);
101
    return s - from - 1;
102
}
103
 
104
//-----------------------------------------------------------------------------
105
int
106
main(int argc, char * argv[])
107
{
108
    for (;;)
109
    {
110
        if (PINB & 0x40)    // DIP switch 7 open.
111
            {
112
                // print 'Hello world' on UART.
113
                uart_puts(PSTR("Hello, World!\r\n"));
114
            }
115
        else                // DIP switch 7 closed.
116
            {
117
                // print 'HELLO' on 7-segment display
118
                seg7_puts(PSTR("HELLO "));
119
            }
120
    }
121
}
122
//-----------------------------------------------------------------------------

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.