Инициализация SPI в Proteus на микроконтроллере avr - Atmega AVR микроконтроллер

Узнай цену своей работы

Формулировка задачи:

Особо не ругайтесь, впервые пробую подключить. Мне нужно знать что я делаю не так, вот скрины кода и подключения

Решение задачи: «Инициализация SPI в Proteus на микроконтроллере avr»

textual
Листинг программы
//#include <htc.h>
//#include "delay.h"
#include <LPC210x.h>
//#include "always.h"
 
#define GETBIT(var,bit) (((var)>>(bit))&1)                         /* read bit from var */
#define SETBIT(var,bit) ((var)|=(1L<<(bit)))                /* set bit from var to 1 */
#define CLRBIT(var,bit) ((var)&=(~(1L<<(bit))))                /* clear bit from var (set it to 0) */
 
#define uint unsigned int
#define byte unsigned char
//#define delay_ms() DelayMs()
 
/////////////////////////////////////////////////////////////////////////////////
// Description : This firmware for Nokia 7110 (SED1565 controller) 96*65 TEST  //
// Hardware : PIC16F875 , LCD NOKIA7110                                        //
// Firmware : Rev 0.1                                                          //
// Date : 6/14/2009                                                           //
// by : Hello world                                                            //
// Compiler : PICC-Lite 9.6L1 / TIDE                                                                  //
/////////////////////////////////////////////////////////////////////////////////
 
//#include <16F877.h>
//#fuses HS,NOPUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
//#use   delay(clock=20000000,RESTART_WDT)
//#byte  lcdport = 6  // (PORTB address value 6 for PIC16F628 device)
 
 
// hardware configuration
//                              PIC SIDE         LCD SIDE
/*#bit  nok_sda  = lcdport.0  // RB0 pin-19        pin-13 Serial data
#bit  nok_sclk = lcdport.1  // RB1 pin-20        pin-05 Serial clock
#bit  nok_dc   = lcdport.2  // RB2 pin-21        pin-04 Data or Command mode
#bit  nok_cs   = lcdport.3  // RB3 pin-22        pin-02 LCD Chip select
#bit  nok_res  = lcdport.4  // RB4 pin-23        pin-14 LCD Reset
 
#zero_ram
*/
// hardware configuration
// change this section if your pin connection is different
 
#define lcd_res         0                        //lcd_res connected to p0.0, pin13
#define lcd_sda         1                        //lcd_sda connected to p0.1, pin14
#define lcd_led                2                        //led backlight connected to p0.2, pin18
#define lcd_sclk         3                        //lcd_sclk connected to p0.3, pin21
#define lcd_dc                 4                        //lcd_dc connected to p0.4, pin22
#define lcd_cs                 5                        //lcd_cs connected to p0.5, pin23
 
// end hardware configuration
 
// display attributes
#define NORMAL                0x00        // normal black on green
#define UNDERLINE        0x80        
#define STRIKE                0x10
#define OVERLINE        0x01
#define REVERSE                0xff        //green on black
 
 
#define negative_lcd    lcd_write_command(lcd_reverse)
#define normal_lcd      lcd_write_command(lcd_normal)
 
/**********************************************************
               LCD Commands
**********************************************************/
#define pow_ctrl                                        0x20        // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
#define v5_ratio                                        0x22        //(17) V5 resistor ratio, from 0b00100000 to 0b00100111. need to add some ratio
#define start_line                                0x40        // start line - set the display line start address.
#define elec_vol                                        0x81        // (18) electronic volume mode
#define adc_normal                                 0xA0        // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
#define adc_reverse                                0xA1
#define lcd_bias_1_over_9        0xA2        // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
#define lcd_bias_1_over_7        0xA3
#define lcd_all_off                                0xA4        //turn all pixels off
#define lcd_all_on                                0xA5        //lcd all points on - turn on all pixels. 0xA4: normal display.
#define lcd_normal                                 0xA6         // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
#define lcd_reverse                                0xA7
#define lcd_off                                                0xAE        //
#define lcd_on                                                0xAF        // lcd on - display on. 0xAE: display off.
#define comm_normal                         0xC0        // (15) common output normal (0xC8 reverse)
#define comm_reverse                         0xC8
#define lcd_nop                                                0xE3        // nop (command for no-operation, 0b11100011.
 
#define lcd_1st_col                                0x12        //first  displayable column. datasheet didn't mention this. WEIRD!
 
/**********************************************************
               Global Variable
**********************************************************/
char page;
char x,y;
//char char_row;
//char charpos;
//char chardata;
 
 
/**********************************************************
               Function Prototype
**********************************************************/
void lcd_write_dorc(char byteforlcd);
void lcd_write_command(char byteforlcd_command);
void lcd_write_data(char byteforlcd_data);
void lcd_gotoxy(char lcd_row, char lcd_col);        //go to lcd_row / 0-8; and lcd_col / 0-95
//void lcd_pixel(char x, char y);        // not used.
void lcd_chr(char charsel, char attribute);
void lcd_str(const char *str, char attribute);
void lcd_reset(void);
void lcd_cls(void);
void lcd_init(void);
void mcu_init(void);
void DelayUs(int);
void DelayMs(int);
 
 
/********************************************************
              ASCII table for 5x7 dots font
********************************************************/
 
const char Char_Table [] = {
                  0x00,0x00,0x00,0x00,0x00,  // 20 space
                  0x00,0x00,0x5f,0x00,0x00,  // 21 !
                  0x00,0x07,0x00,0x07,0x00,  // 22 "
                  0x14,0x7f,0x14,0x7f,0x14,  // 23 #
                  0x24,0x2a,0x7f,0x2a,0x12,  // 24 $
                  0x23,0x13,0x08,0x64,0x62,  // 25 %
                  0x36,0x49,0x55,0x22,0x50,  // 26 &
                  0x00,0x05,0x03,0x00,0x00,  // 27 '
                  0x00,0x1c,0x22,0x41,0x00,  // 28 (
                  0x00,0x41,0x22,0x1c,0x00,  // 29 )
                  0x14,0x08,0x3e,0x08,0x14,  // 2a *
                  0x08,0x08,0x3e,0x08,0x08,  // 2b +
                  0x00,0x50,0x30,0x00,0x00,  // 2c ,
                  0x08,0x08,0x08,0x08,0x08,  // 2d -
                  0x00,0x60,0x60,0x00,0x00,  // 2e .
                  0x20,0x10,0x08,0x04,0x02,  // 2f /
                  0x3e,0x51,0x49,0x45,0x3e,  // 30 0
                  0x00,0x42,0x7f,0x40,0x00,  // 31 1
                  0x42,0x61,0x51,0x49,0x46,  // 32 2
                  0x21,0x41,0x45,0x4b,0x31,  // 33 3
                  0x18,0x14,0x12,0x7f,0x10,  // 34 4
                  0x27,0x45,0x45,0x45,0x39,  // 35 5
                  0x3c,0x4a,0x49,0x49,0x30,  // 36 6
                  0x01,0x71,0x09,0x05,0x03,  // 37 7
                  0x36,0x49,0x49,0x49,0x36,  // 38 8
                  0x06,0x49,0x49,0x29,0x1e,  // 39 9
                  0x00,0x36,0x36,0x00,0x00,  // 3a :
                  0x00,0x56,0x36,0x00,0x00,  // 3b ;
                  0x08,0x14,0x22,0x41,0x00,  // 3c <
                  0x14,0x14,0x14,0x14,0x14,  // 3d =
                  0x00,0x41,0x22,0x14,0x08,  // 3e >
                  0x02,0x01,0x51,0x09,0x06,  // 3f ?
                  0x32,0x49,0x79,0x41,0x3e,  // 40 @
                  0x7e,0x11,0x11,0x11,0x7e,  // 41 A
                  0x7f,0x49,0x49,0x49,0x36,  // 42 B
                  0x3e,0x41,0x41,0x41,0x22,  // 43 C
                  0x7f,0x41,0x41,0x22,0x1c,  // 44 D
                  0x7f,0x49,0x49,0x49,0x41,  // 45 E
                  0x7f,0x09,0x09,0x09,0x01,  // 46 F
                  0x3e,0x41,0x49,0x49,0x7a,  // 47 G
                  0x7f,0x08,0x08,0x08,0x7f,  // 48 H
                  0x00,0x41,0x7f,0x41,0x00,  // 49 I
                  0x20,0x40,0x41,0x3f,0x01,  // 4a J
                  0x7f,0x08,0x14,0x22,0x41,  // 4b K
                  0x7f,0x40,0x40,0x40,0x40,  // 4c L
                  0x7f,0x02,0x0c,0x02,0x7f,  // 4d M
                  0x7f,0x04,0x08,0x10,0x7f,  // 4e N
                  0x3e,0x41,0x41,0x41,0x3e,  // 4f O
                  0x7f,0x09,0x09,0x09,0x06,  // 50 P
                  0x3e,0x41,0x51,0x21,0x5e,  // 51 Q
                  0x7f,0x09,0x19,0x29,0x46,  // 52 R
                  0x46,0x49,0x49,0x49,0x31,  // 53 S
                  0x01,0x01,0x7f,0x01,0x01,  // 54 T
                  0x3f,0x40,0x40,0x40,0x3f,  // 55 U
                  0x1f,0x20,0x40,0x20,0x1f,  // 56 V
                  0x3f,0x40,0x38,0x40,0x3f,  // 57 W
                  0x63,0x14,0x08,0x14,0x63,  // 58 X
                  0x07,0x08,0x70,0x08,0x07,  // 59 Y
                  0x61,0x51,0x49,0x45,0x43,  // 5a Z
                  0x00,0x7f,0x41,0x41,0x00,  // 5b [
                  0x02,0x04,0x08,0x10,0x20,  // 5c 55
                  0x00,0x41,0x41,0x7f,0x00,  // 5d ]
                  0x04,0x02,0x01,0x02,0x04,  // 5e ^
                  0x40,0x40,0x40,0x40,0x40,  // 5f _
                  0x00,0x01,0x02,0x04,0x00,  // 60 `
                  0x20,0x54,0x54,0x54,0x78,  // 61 a
                  0x7f,0x48,0x44,0x44,0x38,  // 62 b
                  0x38,0x44,0x44,0x44,0x20,  // 63 c
                  0x38,0x44,0x44,0x48,0x7f,  // 64 d
                  0x38,0x54,0x54,0x54,0x18,  // 65 e
                  0x08,0x7e,0x09,0x01,0x02,  // 66 f
                  0x0c,0x52,0x52,0x52,0x3e,  // 67 g
                  0x7f,0x08,0x04,0x04,0x78,  // 68 h
                  0x00,0x44,0x7d,0x40,0x00,  // 69 i
                  0x20,0x40,0x44,0x3d,0x00,  // 6a j
                  0x7f,0x10,0x28,0x44,0x00,  // 6b k
                  0x00,0x41,0x7f,0x40,0x00,  // 6c l
                  0x7c,0x04,0x18,0x04,0x78,  // 6d m
                  0x7c,0x08,0x04,0x04,0x78,  // 6e n
                  0x38,0x44,0x44,0x44,0x38,  // 6f o
                  0x7c,0x14,0x14,0x14,0x08,  // 70 p
                  0x08,0x14,0x14,0x18,0x7c,  // 71 q
                  0x7c,0x08,0x04,0x04,0x08,  // 72 r
                  0x48,0x54,0x54,0x54,0x20,  // 73 s
                  0x04,0x3f,0x44,0x40,0x20,  // 74 t
                  0x3c,0x40,0x40,0x20,0x7c,  // 75 u
                  0x1c,0x20,0x40,0x20,0x1c,  // 76 v
                  0x3c,0x40,0x30,0x40,0x3c,  // 77 w
                  0x44,0x28,0x10,0x28,0x44,  // 78 x
                  0x0c,0x50,0x50,0x50,0x3c,  // 79 y
                  0x44,0x64,0x54,0x4c,0x44,  // 7a z
                  0x00,0x08,0x36,0x41,0x00,  // 7b {
                  0x00,0x00,0x7f,0x00,0x00,  // 7c |
                  0x00,0x41,0x36,0x08,0x00,  // 7d }
                  0x10,0x08,0x08,0x10,0x08,  // 7e ~
                  0x78,0x46,0x41,0x46,0x78}; // 7f ¦
 
                  //7e,43,40,43,7e //Ü
                  //7e,43,42,43,7e //Ö
                  //1e,21,21,71,21 //Ç
                  //3c,42,53,53,72 //Ð
 
/********************************************************
              lcd clear LCD function
********************************************************/
void lcd_cls(void) {
   for (page=0; page<9; page++)              // 9 page, fill display RAM with 0s.
      {
         lcd_write_command(0xB0 | page);   // page address ie:0xB0,0xB1,...,0xB7
         lcd_write_command(0x11);          // 0x11, most  4 bit column address command 0001 0011
         lcd_write_command(0x01);          // 0x02, least 4 bit column address command 0000 0011
         for (x=96; x>0; x--)              // 96 column
            lcd_write_data(0x00);
      }
}
 
/**********************************************************
               Reset LCD Function
**********************************************************/
void lcd_reset(void) {
   IOSET = 1<<lcd_cs;                        //select the lcd
   DelayMs(10);
   IOCLR = 1<<lcd_res;                //lcd_res low to reset the display. the lcd going into default state.
   DelayMs(10);                                                //give the lcd time to reset.
   IOSET = 1<<lcd_res;                //pulling the lcd out of reset.
   DelayMs(100);
}
 
/**********************************************************
               Initial LCD Function
**********************************************************/
void lcd_init(void) {
   lcd_reset();
   // the following initialization sequence per datasheet. All needs to be done in 5ms. (X) where X is the command on pg 8-56 of datasheet
 
   lcd_write_command(lcd_normal); // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
   lcd_write_command(lcd_bias_1_over_7); // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
   lcd_write_command(adc_reverse); // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
   lcd_write_command(comm_normal); // (15) common output normal (0xC8 reverse)
   lcd_write_command(v5_ratio+2); // (17) V5 resistor ratio, from 0b00100000 to 0b00100111
   lcd_write_command(elec_vol); // (18) electronic volume mode
   lcd_write_command(pow_ctrl+0x0E); // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
   //this concludes the mandatory initialization, as specified on pg 8-56 of the datasheet
   
   lcd_write_command(0x2F); // power control set value, from 0b00101000 to 0b00101111. see pg 8-52 of datasheet.
   lcd_write_command(lcd_nop); // nop (command for no-operation, 0b11100011.
   lcd_write_command(0x40); // start line - set the display line start address.
   lcd_write_command(lcd_on); // lcd on - display on. 0xAE: display off.
//   lcd_write_command(lcd_all_on); // lcd all points on - turn on all pixels. 0xA4: normal display.
   DelayMs(50);
//   lcd_write_command(lcd_off); // lcd off - turn display off.
 
//   lcd_cls();
 
//   lcd_write_command(lcd_on); // lcd on
//   lcd_write_command(lcd_all_off); // lcd normal display mode
 
 
}
 
/**********************************************************
               sent 8 bit data to LCD by series
**********************************************************/
void lcd_write_dorc(char byteforlcd) { // same lcdai 3310
 
  char caa;
   for (caa=8;caa>0;caa--)
   {
      IOCLR=1<<lcd_sclk;        //data sent on the rising edge of sclk line
//      DelayUs(2);
      if ((byteforlcd&0x80)==0)        // tramission starts from D7, D6, .., D1, D0. if D7 is 0, send 0. 
         {IOCLR=1<<lcd_sda;}
      else
         {IOSET=1<<lcd_sda;}
         
      IOSET=1<<lcd_sclk;        //clock out the data
      byteforlcd=byteforlcd<<1;        //shift left the next bit.
   }
 
}
 
/**********************************************************
              Sent Command to LCD Function
**********************************************************/
void lcd_write_command(char byteforlcd_command) {
   IOCLR=1<<lcd_dc;   // dc=0 signals lcd command mode. A0 in the datasheet. dc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_command);        //send the command.
   IOSET=1<<lcd_cs;   // chip disabled
}
 
/**********************************************************
               Sent Data to LCD Function
**********************************************************/
void lcd_write_data(char byteforlcd_data) {
   IOSET=1<<lcd_dc;   // display data mode. A0 in the datasheet. dorc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_data);        //send the data.
   IOSET=1<<lcd_cs;   // chip disabled
}
 
/**********************************************************
               goto xy position on LCD Function
**********************************************************/
void lcd_gotoxy(char lcd_row, char lcd_col) {        //lcy_row: 0 - 8 (8th column has only 1 line / D0, lcd_col: 0 - 15.
   char col_addr;
   lcd_write_command(0xB0 + lcd_row);               // page address set. pg 8-48 in the datasheet.
   col_addr = lcd_1st_col+(lcd_col*6);                                        // each font has five columns + 1 blank column. xaddr: 0 - 95 on nokia 7110. no offset.
         //lcd_1st_col=0x12: the first column of display starts here. Weird! the datasheet didn't mention it.
   lcd_write_command(0x10 | (col_addr>>4));        // column address 4 most bit set
   lcd_write_command(0x0f & col_addr);             // column address 4 least bit set
}
 
/**********************************************************
           Convert bitmap to charractor Function
**********************************************************/
void lcd_chr(char charsel, char attribute) {
        char char_row, char_data;
        int char_pos;
 
   if (charsel < 0x20) return;
   if (charsel > 0x7f) return;        //check for illegal characters
 
   for (char_row = 0; char_row < 5; char_row++) // 5 bytes
      {
         char_pos=charsel-0x20;
         char_data=Char_Table[char_pos*5+char_row];
//         lcd_write_data(~char_data);            // send font data to lcd, white char on black background
                                         if(attribute == REVERSE)
                                                 lcd_write_data(~char_data);            // send font data to lcd
                                        else
                                                lcd_write_data(char_data | attribute);
 
      }
//   lcd_write_data(~0x00); // blank side pixels for each font, white char on black background
                 if (attribute == REVERSE)
                         lcd_write_data(~0x00);
                else
                        lcd_write_data(0x00 | attribute); // blank side pixels for each font
}
 
/**********************************************************
           Write a string at current screen position
**********************************************************/
void lcd_str(const char *str, char attribute) {
 
  while (*str) 
                lcd_chr(*str++, attribute); 
        
}
 
/**********************************************************
  delay routines
***********************************************************/
 
void DelayUs(int us) {
        for (; us>0; us--);
}
 
void DelayMs(int ms) {
        for (; ms>0; ms--)
                DelayUs(1000);
}
 
void mcu_init(void) {
// need to initialize the mcu here.
        PINSEL0=0x00;
        IODIR=0xff;                //pin p0.0..p0.7 used for gpio.
        
}
 
/*****************************************************************
                  Main Progarm
*****************************************************************/
 
int main(void)
{
 
   mcu_init();
   lcd_init();
        while (1) {
//                lcd_chr('c');
//                lcd_chr('b');
 
                lcd_gotoxy(0,0);
           lcd_str("0-Hello, World!", NORMAL);
                lcd_gotoxy(1,0);
                lcd_str("1-01234567890", NORMAL);
                lcd_gotoxy(2,0);
                lcd_str("2-hello, world!", OVERLINE);
                lcd_gotoxy(3,0);
                lcd_str("3-ABCDEFGHIJKLMN", UNDERLINE);
                lcd_gotoxy(4,0);
                lcd_str("4-abcdefghijklmn", STRIKE);
                lcd_gotoxy(5,0);
                lcd_str("5-OPQRSTUVWXYZ", OVERLINE | STRIKE);
                lcd_gotoxy(6,0);
                lcd_str("6-opqrstuvwxyz", UNDERLINE | STRIKE);
                lcd_gotoxy(7,0);
                lcd_str("7-  BYE BYE", STRIKE | OVERLINE | UNDERLINE | REVERSE);
 
//                lcd_gotoxy(8,0);
//                lcd_str("0-HELLO, WORLD!", NORMAL);
 
 
//                lcd_cls();
        }
}
 
/*void main(void) {
        while (1){
                //TODO Auto-generated main function
        }
}
*/

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы