Попробовал подключить дисплей от Nokia 5110 к Launchpad. Что приятно, преподаватели курса позаботились и приготовили примерчик с готовыми библиотеками для работы с этим экраном. Поэтому кроме собственно подключения экрана делать ничего не пришлось. И на экране появилась вот такая рогатая морда.
После этого начинает выводиться текстовая информация.
Пару слов про подключение. Экран работает от 3 или 5 вольт. Как сказано в описании у продавца:
Подсветка подключена тоже через ограничивающее сопротивление, чтобы ток был не более 80мА. Ланчпад, судя по описанию, дает до 300мА. У меня оба сопротивления на 220 Ом, так как меньше не было.
Ниже - тексты программы и библиотек, любезно предоставленные преподавателями.
Это сама программа.
PLL.h - для таймера.
PLL.c
А вот и библиотека для работы с дисплеем, Nokia5110.h
И, самое главное, Nokia5110.c
UPD:
Схема подключения.
После этого начинает выводиться текстовая информация.
Пару слов про подключение. Экран работает от 3 или 5 вольт. Как сказано в описании у продавца:
VCC - power input (3.3 v and 5 v, through experimental verification, there is no problem)Ланчпад как раз даёт 3.3V. Ну я и подключил на VCC 3.3V. В итоге получил тусклое, еле различимое изображение. Сперва подумал, что брак у экрана. А потом сообразил, что я новичок и наверняка туплю. Посмотрел маркировку на экране, там написано 3-5V. Может быть мои 3.3V схема экрана приняла за 5V? Попробовал понизить напряжение и подключил питание через сопротивление и всё заработало нормально. О как.
Подсветка подключена тоже через ограничивающее сопротивление, чтобы ток был не более 80мА. Ланчпад, судя по описанию, дает до 300мА. У меня оба сопротивления на 220 Ом, так как меньше не было.
Ниже - тексты программы и библиотек, любезно предоставленные преподавателями.
Это сама программа.
// Nokia5110TestMain.c // Runs on LM4F120/TM4C123 // Test the functions in Nokia5110.c by printing various // things to the LCD. // Daniel Valvano // September 16, 2013 // Font table, initialization, and other functions based // off of Nokia_5110_Example from Spark Fun: // 7-17-2011 // Spark Fun Electronics 2011 // Nathan Seidle // http://dlnmh9ip6v2uc.cloudfront.net/datasheets/LCD/Monochrome/Nokia_5110_Example.pde /* This example accompanies the book "Embedded Systems: Real Time Interfacing to Arm Cortex M Microcontrollers", ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013 Copyright 2013 by Jonathan W. Valvano, valvano@mail.utexas.edu You may use, edit, run or distribute this file as long as the above copyright notice remains THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. For more information about my classes, my research, and my books, see http://users.ece.utexas.edu/~valvano/ */ // Blue Nokia 5110 // --------------- // Signal (Nokia 5110) LaunchPad pin // Reset (RST, pin 1) connected to PA7 // SSI0Fss (CE, pin 2) connected to PA3 // Data/Command (DC, pin 3) connected to PA6 // SSI0Tx (Din, pin 4) connected to PA5 // SSI0Clk (Clk, pin 5) connected to PA2 // 3.3V (Vcc, pin 6) power // back light (BL, pin 7) not connected // Ground (Gnd, pin 8) ground // Red SparkFun Nokia 5110 (LCD-10168) // ----------------------------------- // Signal (Nokia 5110) LaunchPad pin // 3.3V (VCC, pin 1) power // Ground (GND, pin 2) ground // SSI0Fss (SCE, pin 3) connected to PA3 // Reset (RST, pin 4) connected to PA7 // Data/Command (D/C, pin 5) connected to PA6 // SSI0Tx (DN, pin 6) connected to PA5 // SSI0Clk (SCLK, pin 7) connected to PA2 // back light (LED, pin 8) not connected #include "Nokia5110.h" #include "PLL.h" // function delays 3*ulCount cycles void Delay(unsigned long ulCount){ do{ ulCount--; }while(ulCount); } // image of a longhorn const char Longhorn[] = { 0x08, 0x08, 0x08, 0x08, 0x08, 0x18, 0x18, 0x18, 0x38, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0x70, 0x70, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x07, 0x0F, 0x0E, 0x0C, 0x1C, 0x38, 0x38, 0xB8, 0xF8, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0x78, 0x38, 0x3C, 0x1C, 0x1F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // image of a longhorn loves 319k const char Longhorn2[] = { 0x08, 0x08, 0x08, 0x08, 0x08, 0x18, 0x18, 0x18, 0x38, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xF0, 0x70, 0x70, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0xF0, 0x08, 0x04, 0x24, 0x24, 0xE4, 0x24, 0x24, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0xF1, 0x03, 0x03, 0x03, 0x07, 0x0F, 0x0E, 0x0C, 0x1C, 0x38, 0x38, 0xB8, 0xF8, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0x78, 0x38, 0x3C, 0x1C, 0x1F, 0x0F, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x04, 0x04, 0x07, 0x84, 0x44, 0x40, 0x80, 0x40, 0x40, 0x80, 0x00, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x84, 0x88, 0x84, 0x02, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x82, 0x84, 0x84, 0x84, 0x04, 0x04, 0x84, 0x04, 0x04, 0x84, 0x08, 0x10, 0xE0, 0x00, 0x01, 0x07, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x88, 0x88, 0x8A, 0x85, 0x80, 0x80, 0x89, 0x8F, 0x88, 0x80, 0x80, 0x83, 0x82, 0x82, 0x8F, 0x80, 0x80, 0x8F, 0x82, 0x85, 0x88, 0x80, 0x80, 0x8F, 0x50, 0x20, 0x00, 0x3C, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; int main(void){ unsigned short count = 0; PLL_Init(); // set system clock to 50 MHz Nokia5110_Init(); for(count=0; count<5; count=count+1){ Nokia5110_DrawFullImage(Longhorn); Delay(16666667); // delay ~1 sec at 50 MHz Nokia5110_DrawFullImage(Longhorn2); Delay(16666667); // delay ~1 sec at 50 MHz } count = 0; Nokia5110_Clear(); Nokia5110_OutString("************* LCD Test *************Letter: Num:------- ---- "); Nokia5110_OutChar(127); // print UT sign while(1){ Nokia5110_SetCursor(5, 5); // five leading spaces, bottom row Nokia5110_OutChar((count%26)+'A'); Nokia5110_OutChar(' '); Nokia5110_OutUDec(count); Delay(8333333); // delay ~0.5 sec at 50 MHz count = count + 1; } }
PLL.h - для таймера.
// PLL.h // Runs on LM4F120/TM4C123 // A software function to change the bus frequency using the PLL. // Daniel Valvano // September 10, 2013 /* This example accompanies the book "Embedded Systems: Real Time Interfacing to Arm Cortex M Microcontrollers", ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013 Program 2.10, Figure 2.37 Copyright 2013 by Jonathan W. Valvano, valvano@mail.utexas.edu You may use, edit, run or distribute this file as long as the above copyright notice remains THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. For more information about my classes, my research, and my books, see http://users.ece.utexas.edu/~valvano/ */ // The #define statement SYSDIV2 initializes // the PLL to the desired frequency. #define SYSDIV2 7 // bus frequency is 400MHz/(SYSDIV2+1) = 400MHz/(7+1) = 50 MHz // configure the system to get its clock from the PLL void PLL_Init(void); /* SYSDIV2 Divisor Clock (MHz) 0 1 reserved 1 2 reserved 2 3 reserved 3 4 reserved 4 5 80.000 5 6 66.667 6 7 reserved 7 8 50.000 8 9 44.444 9 10 40.000 10 11 36.364 11 12 33.333 12 13 30.769 13 14 28.571 14 15 26.667 15 16 25.000 16 17 23.529 17 18 22.222 18 19 21.053 19 20 20.000 20 21 19.048 21 22 18.182 22 23 17.391 23 24 16.667 24 25 16.000 25 26 15.385 26 27 14.815 27 28 14.286 28 29 13.793 29 30 13.333 30 31 12.903 31 32 12.500 32 33 12.121 33 34 11.765 34 35 11.429 35 36 11.111 36 37 10.811 37 38 10.526 38 39 10.256 39 40 10.000 40 41 9.756 41 42 9.524 42 43 9.302 43 44 9.091 44 45 8.889 45 46 8.696 46 47 8.511 47 48 8.333 48 49 8.163 49 50 8.000 50 51 7.843 51 52 7.692 52 53 7.547 53 54 7.407 54 55 7.273 55 56 7.143 56 57 7.018 57 58 6.897 58 59 6.780 59 60 6.667 60 61 6.557 61 62 6.452 62 63 6.349 63 64 6.250 64 65 6.154 65 66 6.061 66 67 5.970 67 68 5.882 68 69 5.797 69 70 5.714 70 71 5.634 71 72 5.556 72 73 5.479 73 74 5.405 74 75 5.333 75 76 5.263 76 77 5.195 77 78 5.128 78 79 5.063 79 80 5.000 80 81 4.938 81 82 4.878 82 83 4.819 83 84 4.762 84 85 4.706 85 86 4.651 86 87 4.598 87 88 4.545 88 89 4.494 89 90 4.444 90 91 4.396 91 92 4.348 92 93 4.301 93 94 4.255 94 95 4.211 95 96 4.167 96 97 4.124 97 98 4.082 98 99 4.040 99 100 4.000 100 101 3.960 101 102 3.922 102 103 3.883 103 104 3.846 104 105 3.810 105 106 3.774 106 107 3.738 107 108 3.704 108 109 3.670 109 110 3.636 110 111 3.604 111 112 3.571 112 113 3.540 113 114 3.509 114 115 3.478 115 116 3.448 116 117 3.419 117 118 3.390 118 119 3.361 119 120 3.333 120 121 3.306 121 122 3.279 122 123 3.252 123 124 3.226 124 125 3.200 125 126 3.175 126 127 3.150 127 128 3.125 */
PLL.c
// PLL.c // Runs on LM4F120/TM4C123 // A software function to change the bus frequency using the PLL. // Daniel Valvano // September 10, 2013 /* This example accompanies the book "Embedded Systems: Real Time Interfacing to Arm Cortex M Microcontrollers", ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013 Program 2.10, Figure 2.37 Copyright 2013 by Jonathan W. Valvano, valvano@mail.utexas.edu You may use, edit, run or distribute this file as long as the above copyright notice remains THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. For more information about my classes, my research, and my books, see http://users.ece.utexas.edu/~valvano/ */ #include "PLL.h" // The #define statement SYSDIV2 in PLL.h // initializes the PLL to the desired frequency. // bus frequency is 400MHz/(SYSDIV2+1) = 400MHz/(7+1) = 50 MHz // see the table at the end of this file #define SYSCTL_RIS_R (*((volatile unsigned long *)0x400FE050)) #define SYSCTL_RIS_PLLLRIS 0x00000040 // PLL Lock Raw Interrupt Status #define SYSCTL_RCC_R (*((volatile unsigned long *)0x400FE060)) #define SYSCTL_RCC_XTAL_M 0x000007C0 // Crystal Value #define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // 6 MHz Crystal #define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // 8 MHz Crystal #define SYSCTL_RCC_XTAL_16MHZ 0x00000540 // 16 MHz Crystal #define SYSCTL_RCC2_R (*((volatile unsigned long *)0x400FE070)) #define SYSCTL_RCC2_USERCC2 0x80000000 // Use RCC2 #define SYSCTL_RCC2_DIV400 0x40000000 // Divide PLL as 400 MHz vs. 200 // MHz #define SYSCTL_RCC2_SYSDIV2_M 0x1F800000 // System Clock Divisor 2 #define SYSCTL_RCC2_SYSDIV2LSB 0x00400000 // Additional LSB for SYSDIV2 #define SYSCTL_RCC2_PWRDN2 0x00002000 // Power-Down PLL 2 #define SYSCTL_RCC2_BYPASS2 0x00000800 // PLL Bypass 2 #define SYSCTL_RCC2_OSCSRC2_M 0x00000070 // Oscillator Source 2 #define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 // MOSC // configure the system to get its clock from the PLL void PLL_Init(void){ // 0) configure the system to use RCC2 for advanced features // such as 400 MHz PLL and non-integer System Clock Divisor SYSCTL_RCC2_R |= SYSCTL_RCC2_USERCC2; // 1) bypass PLL while initializing SYSCTL_RCC2_R |= SYSCTL_RCC2_BYPASS2; // 2) select the crystal value and oscillator source SYSCTL_RCC_R &= ~SYSCTL_RCC_XTAL_M; // clear XTAL field SYSCTL_RCC_R += SYSCTL_RCC_XTAL_16MHZ;// configure for 16 MHz crystal SYSCTL_RCC2_R &= ~SYSCTL_RCC2_OSCSRC2_M;// clear oscillator source field SYSCTL_RCC2_R += SYSCTL_RCC2_OSCSRC2_MO;// configure for main oscillator source // 3) activate PLL by clearing PWRDN SYSCTL_RCC2_R &= ~SYSCTL_RCC2_PWRDN2; // 4) set the desired system divider and the system divider least significant bit SYSCTL_RCC2_R |= SYSCTL_RCC2_DIV400; // use 400 MHz PLL SYSCTL_RCC2_R = (SYSCTL_RCC2_R&~0x1FC00000) // clear system clock divider field + (SYSDIV2<<22); // configure for 80 MHz clock // 5) wait for the PLL to lock by polling PLLLRIS while((SYSCTL_RIS_R&SYSCTL_RIS_PLLLRIS)==0){}; // 6) enable use of PLL by clearing BYPASS SYSCTL_RCC2_R &= ~SYSCTL_RCC2_BYPASS2; } /* SYSDIV2 Divisor Clock (MHz) 0 1 reserved 1 2 reserved 2 3 reserved 3 4 reserved 4 5 80.000 5 6 66.667 6 7 reserved 7 8 50.000 8 9 44.444 9 10 40.000 10 11 36.364 11 12 33.333 12 13 30.769 13 14 28.571 14 15 26.667 15 16 25.000 16 17 23.529 17 18 22.222 18 19 21.053 19 20 20.000 20 21 19.048 21 22 18.182 22 23 17.391 23 24 16.667 24 25 16.000 25 26 15.385 26 27 14.815 27 28 14.286 28 29 13.793 29 30 13.333 30 31 12.903 31 32 12.500 32 33 12.121 33 34 11.765 34 35 11.429 35 36 11.111 36 37 10.811 37 38 10.526 38 39 10.256 39 40 10.000 40 41 9.756 41 42 9.524 42 43 9.302 43 44 9.091 44 45 8.889 45 46 8.696 46 47 8.511 47 48 8.333 48 49 8.163 49 50 8.000 50 51 7.843 51 52 7.692 52 53 7.547 53 54 7.407 54 55 7.273 55 56 7.143 56 57 7.018 57 58 6.897 58 59 6.780 59 60 6.667 60 61 6.557 61 62 6.452 62 63 6.349 63 64 6.250 64 65 6.154 65 66 6.061 66 67 5.970 67 68 5.882 68 69 5.797 69 70 5.714 70 71 5.634 71 72 5.556 72 73 5.479 73 74 5.405 74 75 5.333 75 76 5.263 76 77 5.195 77 78 5.128 78 79 5.063 79 80 5.000 80 81 4.938 81 82 4.878 82 83 4.819 83 84 4.762 84 85 4.706 85 86 4.651 86 87 4.598 87 88 4.545 88 89 4.494 89 90 4.444 90 91 4.396 91 92 4.348 92 93 4.301 93 94 4.255 94 95 4.211 95 96 4.167 96 97 4.124 97 98 4.082 98 99 4.040 99 100 4.000 100 101 3.960 101 102 3.922 102 103 3.883 103 104 3.846 104 105 3.810 105 106 3.774 106 107 3.738 107 108 3.704 108 109 3.670 109 110 3.636 110 111 3.604 111 112 3.571 112 113 3.540 113 114 3.509 114 115 3.478 115 116 3.448 116 117 3.419 117 118 3.390 118 119 3.361 119 120 3.333 120 121 3.306 121 122 3.279 122 123 3.252 123 124 3.226 124 125 3.200 125 126 3.175 126 127 3.150 127 128 3.125 */
А вот и библиотека для работы с дисплеем, Nokia5110.h
// Nokia5110.h // Runs on LM4F120/TM4C123 // Use SSI0 to send an 8-bit code to the Nokia5110 48x84 // pixel LCD to display text, images, or other information. // Daniel Valvano // September 16, 2013 // Font table, initialization, and other functions based // off of Nokia_5110_Example from Spark Fun: // 7-17-2011 // Spark Fun Electronics 2011 // Nathan Seidle // http://dlnmh9ip6v2uc.cloudfront.net/datasheets/LCD/Monochrome/Nokia_5110_Example.pde /* This example accompanies the book "Embedded Systems: Real Time Interfacing to Arm Cortex M Microcontrollers", ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013 Copyright 2013 by Jonathan W. Valvano, valvano@mail.utexas.edu You may use, edit, run or distribute this file as long as the above copyright notice remains THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. For more information about my classes, my research, and my books, see http://users.ece.utexas.edu/~valvano/ */ // Blue Nokia 5110 // --------------- // Signal (Nokia 5110) LaunchPad pin // Reset (RST, pin 1) connected to PA7 // SSI0Fss (CE, pin 2) connected to PA3 // Data/Command (DC, pin 3) connected to PA6 // SSI0Tx (Din, pin 4) connected to PA5 // SSI0Clk (Clk, pin 5) connected to PA2 // 3.3V (Vcc, pin 6) power // back light (BL, pin 7) not connected // Ground (Gnd, pin 8) ground // Red SparkFun Nokia 5110 (LCD-10168) // ----------------------------------- // Signal (Nokia 5110) LaunchPad pin // 3.3V (VCC, pin 1) power // Ground (GND, pin 2) ground // SSI0Fss (SCE, pin 3) connected to PA3 // Reset (RST, pin 4) connected to PA7 // Data/Command (D/C, pin 5) connected to PA6 // SSI0Tx (DN, pin 6) connected to PA5 // SSI0Clk (SCLK, pin 7) connected to PA2 // back light (LED, pin 8) not connected // Maximum dimensions of the LCD, although the pixels are // numbered from zero to (MAX-1). Address may automatically // be incremented after each transmission. #define MAX_X 84 #define MAX_Y 48 // Contrast value 0xB1 looks good on red SparkFun // and 0xB8 looks good on blue Nokia 5110. // Adjust this from 0xA0 (lighter) to 0xCF (darker) for your display. #define CONTRAST 0xB1 // This table contains the hex values that represent pixels // for a font that is 5 pixels wide and 8 pixels high static const char ASCII[][5] = { {0x00, 0x00, 0x00, 0x00, 0x00} // 20 ,{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 '\' ,{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 DEL ,{0x1f, 0x24, 0x7c, 0x24, 0x1f} // 7f UT sign }; //********Nokia5110_Init***************** // Initialize Nokia 5110 48x84 LCD by sending the proper // commands to the PCD8544 driver. One new feature of the // LM4F120 is that its SSIs can get their baud clock from // either the system clock or from the 16 MHz precision // internal oscillator. If the system clock is faster than // 50 MHz, the SSI baud clock will be faster than the 4 MHz // maximum of the Nokia 5110. // inputs: none // outputs: none // assumes: system clock rate of 50 MHz or less void Nokia5110_Init(void); //********Nokia5110_OutChar***************** // Print a character to the Nokia 5110 48x84 LCD. The // character will be printed at the current cursor position, // the cursor will automatically be updated, and it will // wrap to the next row or back to the top if necessary. // One blank column of pixels will be printed on either side // of the character for readability. Since characters are 8 // pixels tall and 5 pixels wide, 12 characters fit per row, // and there are six rows. // inputs: data character to print // outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_OutChar(unsigned char data); //********Nokia5110_OutString***************** // Print a string of characters to the Nokia 5110 48x84 LCD. // The string will automatically wrap, so padding spaces may // be needed to make the output look optimal. // inputs: ptr pointer to NULL-terminated ASCII string // outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_OutString(char *ptr); //********Nokia5110_OutUDec***************** // Output a 16-bit number in unsigned decimal format with a // fixed size of five right-justified digits of output. // Inputs: n 16-bit unsigned number // Outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_OutUDec(unsigned short n); //********Nokia5110_SetCursor***************** // Move the cursor to the desired X- and Y-position. The // next character will be printed here. X=0 is the leftmost // column. Y=0 is the top row. // inputs: newX new X-position of the cursor (0<=newX<=11) // newY new Y-position of the cursor (0<=newY<=5) // outputs: none void Nokia5110_SetCursor(unsigned char newX, unsigned char newY); //********Nokia5110_Clear***************** // Clear the LCD by writing zeros to the entire screen and // reset the cursor to (0,0) (top left corner of screen). // inputs: none // outputs: none void Nokia5110_Clear(void); //********Nokia5110_DrawFullImage***************** // Fill the whole screen by drawing a 48x84 bitmap image. // inputs: ptr pointer to 504 byte bitmap // outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_DrawFullImage(const char *ptr);
И, самое главное, Nokia5110.c
// Nokia5110.c // Runs on LM4F120/TM4C123 // Use SSI0 to send an 8-bit code to the Nokia5110 48x84 // pixel LCD to display text, images, or other information. // Daniel Valvano // September 16, 2013 // Font table, initialization, and other functions based // off of Nokia_5110_Example from Spark Fun: // 7-17-2011 // Spark Fun Electronics 2011 // Nathan Seidle // http://dlnmh9ip6v2uc.cloudfront.net/datasheets/LCD/Monochrome/Nokia_5110_Example.pde /* This example accompanies the book "Embedded Systems: Real Time Interfacing to Arm Cortex M Microcontrollers", ISBN: 978-1463590154, Jonathan Valvano, copyright (c) 2013 Copyright 2013 by Jonathan W. Valvano, valvano@mail.utexas.edu You may use, edit, run or distribute this file as long as the above copyright notice remains THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. VALVANO SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. For more information about my classes, my research, and my books, see http://users.ece.utexas.edu/~valvano/ */ // Blue Nokia 5110 // --------------- // Signal (Nokia 5110) LaunchPad pin // Reset (RST, pin 1) connected to PA7 // SSI0Fss (CE, pin 2) connected to PA3 // Data/Command (DC, pin 3) connected to PA6 // SSI0Tx (Din, pin 4) connected to PA5 // SSI0Clk (Clk, pin 5) connected to PA2 // 3.3V (Vcc, pin 6) power // back light (BL, pin 7) not connected, consists of 4 white LEDs which draw ~80mA total // Ground (Gnd, pin 8) ground // Red SparkFun Nokia 5110 (LCD-10168) // ----------------------------------- // Signal (Nokia 5110) LaunchPad pin // 3.3V (VCC, pin 1) power // Ground (GND, pin 2) ground // SSI0Fss (SCE, pin 3) connected to PA3 // Reset (RST, pin 4) connected to PA7 // Data/Command (D/C, pin 5) connected to PA6 // SSI0Tx (DN, pin 6) connected to PA5 // SSI0Clk (SCLK, pin 7) connected to PA2 // back light (LED, pin 8) not connected, consists of 4 white LEDs which draw ~80mA total #include "Nokia5110.h" #define DC (*((volatile unsigned long *)0x40004100)) #define DC_COMMAND 0 #define DC_DATA 0x40 #define RESET (*((volatile unsigned long *)0x40004200)) #define RESET_LOW 0 #define RESET_HIGH 0x80 #define GPIO_PORTA_DIR_R (*((volatile unsigned long *)0x40004400)) #define GPIO_PORTA_AFSEL_R (*((volatile unsigned long *)0x40004420)) #define GPIO_PORTA_DEN_R (*((volatile unsigned long *)0x4000451C)) #define GPIO_PORTA_AMSEL_R (*((volatile unsigned long *)0x40004528)) #define GPIO_PORTA_PCTL_R (*((volatile unsigned long *)0x4000452C)) #define SSI0_CR0_R (*((volatile unsigned long *)0x40008000)) #define SSI0_CR1_R (*((volatile unsigned long *)0x40008004)) #define SSI0_DR_R (*((volatile unsigned long *)0x40008008)) #define SSI0_SR_R (*((volatile unsigned long *)0x4000800C)) #define SSI0_CPSR_R (*((volatile unsigned long *)0x40008010)) #define SSI0_CC_R (*((volatile unsigned long *)0x40008FC8)) #define SSI_CR0_SCR_M 0x0000FF00 // SSI Serial Clock Rate #define SSI_CR0_SPH 0x00000080 // SSI Serial Clock Phase #define SSI_CR0_SPO 0x00000040 // SSI Serial Clock Polarity #define SSI_CR0_FRF_M 0x00000030 // SSI Frame Format Select #define SSI_CR0_FRF_MOTO 0x00000000 // Freescale SPI Frame Format #define SSI_CR0_DSS_M 0x0000000F // SSI Data Size Select #define SSI_CR0_DSS_8 0x00000007 // 8-bit data #define SSI_CR1_MS 0x00000004 // SSI Master/Slave Select #define SSI_CR1_SSE 0x00000002 // SSI Synchronous Serial Port // Enable #define SSI_SR_BSY 0x00000010 // SSI Busy Bit #define SSI_SR_TNF 0x00000002 // SSI Transmit FIFO Not Full #define SSI_CPSR_CPSDVSR_M 0x000000FF // SSI Clock Prescale Divisor #define SSI_CC_CS_M 0x0000000F // SSI Baud Clock Source #define SSI_CC_CS_SYSPLL 0x00000000 // Either the system clock (if the // PLL bypass is in effect) or the // PLL output (default) #define SYSCTL_RCGC1_R (*((volatile unsigned long *)0x400FE104)) #define SYSCTL_RCGC2_R (*((volatile unsigned long *)0x400FE108)) #define SYSCTL_RCGC1_SSI0 0x00000010 // SSI0 Clock Gating Control #define SYSCTL_RCGC2_GPIOA 0x00000001 // port A Clock Gating Control enum typeOfWrite{ COMMAND, // the transmission is an LCD command DATA // the transmission is data }; // The Data/Command pin must be valid when the eighth bit is // sent. The SSI module has hardware input and output FIFOs // that are 8 locations deep. Based on the observation that // the LCD interface tends to send a few commands and then a // lot of data, the FIFOs are not used when writing // commands, and they are used when writing data. This // ensures that the Data/Command pin status matches the byte // that is actually being transmitted. // The write command operation waits until all data has been // sent, configures the Data/Command pin for commands, sends // the command, and then waits for the transmission to // finish. // The write data operation waits until there is room in the // transmit FIFO, configures the Data/Command pin for data, // and then adds the data to the transmit FIFO. // This is a helper function that sends an 8-bit message to the LCD. // inputs: type COMMAND or DATA // message 8-bit code to transmit // outputs: none // assumes: SSI0 and port A have already been initialized and enabled void static lcdwrite(enum typeOfWrite type, char message){ if(type == COMMAND){ // wait until SSI0 not busy/transmit FIFO empty while((SSI0_SR_R&SSI_SR_BSY)==SSI_SR_BSY){}; DC = DC_COMMAND; SSI0_DR_R = message; // command out // wait until SSI0 not busy/transmit FIFO empty while((SSI0_SR_R&SSI_SR_BSY)==SSI_SR_BSY){}; } else{ while((SSI0_SR_R&SSI_SR_TNF)==0){}; // wait until transmit FIFO not full DC = DC_DATA; SSI0_DR_R = message; // data out } } //********Nokia5110_Init***************** // Initialize Nokia 5110 48x84 LCD by sending the proper // commands to the PCD8544 driver. One new feature of the // LM4F120 is that its SSIs can get their baud clock from // either the system clock or from the 16 MHz precision // internal oscillator. If the system clock is faster than // 50 MHz, the SSI baud clock will be faster than the 4 MHz // maximum of the Nokia 5110. // inputs: none // outputs: none // assumes: system clock rate of 50 MHz or less void Nokia5110_Init(void){ volatile unsigned long delay; SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI0; // activate SSI0 SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; // activate port A delay = SYSCTL_RCGC2_R; // allow time to finish activating GPIO_PORTA_DIR_R |= 0xC0; // make PA6,7 out GPIO_PORTA_AFSEL_R |= 0x2C; // enable alt funct on PA2,3,5 GPIO_PORTA_AFSEL_R &= ~0xC0; // disable alt funct on PA6,7 GPIO_PORTA_DEN_R |= 0xEC; // enable digital I/O on PA2,3,5,6,7 // configure PA2,3,5 as SSI GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0xFF0F00FF)+0x00202200; // configure PA6,7 as GPIO GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0x00FFFFFF)+0x00000000; GPIO_PORTA_AMSEL_R &= ~0xEC; // disable analog functionality on PA2,3,5,6,7 SSI0_CR1_R &= ~SSI_CR1_SSE; // disable SSI SSI0_CR1_R &= ~SSI_CR1_MS; // master mode // configure for system clock/PLL baud clock source SSI0_CC_R = (SSI0_CC_R&~SSI_CC_CS_M)+SSI_CC_CS_SYSPLL; // clock divider for 3.125 MHz SSIClk (50 MHz PIOSC/16) SSI0_CPSR_R = (SSI0_CPSR_R&~SSI_CPSR_CPSDVSR_M)+16; SSI0_CR0_R &= ~(SSI_CR0_SCR_M | // SCR = 0 (3.125 Mbps data rate) SSI_CR0_SPH | // SPH = 0 SSI_CR0_SPO); // SPO = 0 // FRF = Freescale format SSI0_CR0_R = (SSI0_CR0_R&~SSI_CR0_FRF_M)+SSI_CR0_FRF_MOTO; // DSS = 8-bit data SSI0_CR0_R = (SSI0_CR0_R&~SSI_CR0_DSS_M)+SSI_CR0_DSS_8; SSI0_CR1_R |= SSI_CR1_SSE; // enable SSI RESET = RESET_LOW; // reset the LCD to a known state for(delay=0; delay<10; delay=delay+1);// delay minimum 100 ns RESET = RESET_HIGH; // negative logic lcdwrite(COMMAND, 0x21); // chip active; horizontal addressing mode (V = 0); use extended instruction set (H = 1) // set LCD Vop (contrast), which may require some tweaking: lcdwrite(COMMAND, CONTRAST); // try 0xB1 (for 3.3V red SparkFun), 0xB8 (for 3.3V blue SparkFun), 0xBF if your display is too dark, or 0x80 to 0xFF if experimenting lcdwrite(COMMAND, 0x04); // set temp coefficient lcdwrite(COMMAND, 0x14); // LCD bias mode 1:48: try 0x13 or 0x14 lcdwrite(COMMAND, 0x20); // we must send 0x20 before modifying the display control mode lcdwrite(COMMAND, 0x0C); // set display control to normal mode: 0x0D for inverse } //********Nokia5110_OutChar***************** // Print a character to the Nokia 5110 48x84 LCD. The // character will be printed at the current cursor position, // the cursor will automatically be updated, and it will // wrap to the next row or back to the top if necessary. // One blank column of pixels will be printed on either side // of the character for readability. Since characters are 8 // pixels tall and 5 pixels wide, 12 characters fit per row, // and there are six rows. // inputs: data character to print // outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_OutChar(unsigned char data){ int i; lcdwrite(DATA, 0x00); // blank vertical line padding for(i=0; i<5; i=i+1){ lcdwrite(DATA, ASCII[data - 0x20][i]); } lcdwrite(DATA, 0x00); // blank vertical line padding } //********Nokia5110_OutString***************** // Print a string of characters to the Nokia 5110 48x84 LCD. // The string will automatically wrap, so padding spaces may // be needed to make the output look optimal. // inputs: ptr pointer to NULL-terminated ASCII string // outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_OutString(char *ptr){ while(*ptr){ Nokia5110_OutChar((unsigned char)*ptr); ptr = ptr + 1; } } //********Nokia5110_OutUDec***************** // Output a 16-bit number in unsigned decimal format with a // fixed size of five right-justified digits of output. // Inputs: n 16-bit unsigned number // Outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_OutUDec(unsigned short n){ if(n < 10){ Nokia5110_OutString(" "); Nokia5110_OutChar(n+'0'); /* n is between 0 and 9 */ } else if(n<100){ Nokia5110_OutString(" "); Nokia5110_OutChar(n/10+'0'); /* tens digit */ Nokia5110_OutChar(n%10+'0'); /* ones digit */ } else if(n<1000){ Nokia5110_OutString(" "); Nokia5110_OutChar(n/100+'0'); /* hundreds digit */ n = n%100; Nokia5110_OutChar(n/10+'0'); /* tens digit */ Nokia5110_OutChar(n%10+'0'); /* ones digit */ } else if(n<10000){ Nokia5110_OutChar(' '); Nokia5110_OutChar(n/1000+'0'); /* thousands digit */ n = n%1000; Nokia5110_OutChar(n/100+'0'); /* hundreds digit */ n = n%100; Nokia5110_OutChar(n/10+'0'); /* tens digit */ Nokia5110_OutChar(n%10+'0'); /* ones digit */ } else { Nokia5110_OutChar(n/10000+'0'); /* ten-thousands digit */ n = n%10000; Nokia5110_OutChar(n/1000+'0'); /* thousands digit */ n = n%1000; Nokia5110_OutChar(n/100+'0'); /* hundreds digit */ n = n%100; Nokia5110_OutChar(n/10+'0'); /* tens digit */ Nokia5110_OutChar(n%10+'0'); /* ones digit */ } } //********Nokia5110_SetCursor***************** // Move the cursor to the desired X- and Y-position. The // next character will be printed here. X=0 is the leftmost // column. Y=0 is the top row. // inputs: newX new X-position of the cursor (0<=newX<=11) // newY new Y-position of the cursor (0<=newY<=5) // outputs: none void Nokia5110_SetCursor(unsigned char newX, unsigned char newY){ if((newX > 11) || (newY > 5)){ // bad input return; // do nothing } // multiply newX by 7 because each character is 7 columns wide lcdwrite(COMMAND, 0x80|(newX*7)); // setting bit 7 updates X-position lcdwrite(COMMAND, 0x40|newY); // setting bit 6 updates Y-position } //********Nokia5110_Clear***************** // Clear the LCD by writing zeros to the entire screen and // reset the cursor to (0,0) (top left corner of screen). // inputs: none // outputs: none void Nokia5110_Clear(void){ int i; for(i=0; i<(MAX_X*MAX_Y/8); i=i+1){ lcdwrite(DATA, 0x00); } Nokia5110_SetCursor(0, 0); } //********Nokia5110_DrawFullImage***************** // Fill the whole screen by drawing a 48x84 bitmap image. // inputs: ptr pointer to 504 byte bitmap // outputs: none // assumes: LCD is in default horizontal addressing mode (V = 0) void Nokia5110_DrawFullImage(const char *ptr){ int i; Nokia5110_SetCursor(0, 0); for(i=0; i<(MAX_X*MAX_Y/8); i=i+1){ lcdwrite(DATA, ptr[i]); } }
UPD:
Схема подключения.
Контроллер | Дисплей |
---|---|
PA2 | Clk |
PA3 | CE |
PA5 | Din |
PA6 | DC |
PA7 | RST |
Gnd | Gnd |
3.3 V | Vcc через резистор |
3.3 V | [BL через резистор!] |
Комментариев нет:
Отправить комментарий