Программный SPI, проект для CMake, проект для Proteus 8

This commit is contained in:
MultiMote 2015-03-17 15:31:21 +03:00
parent 593289547e
commit cb6044c8fa
4 changed files with 58 additions and 22 deletions

34
CMakeLists.txt Normal file

@ -0,0 +1,34 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.4)
SET(CMAKE_SYSTEM_NAME Generic)
#============================================================================================
PROJECT(N3310Lib)
SET(DEVICE "atmega8")
SET(FREQ "1000000")
#============================================================================================
SET(CMAKE_C_COMPILER avr-gcc)
SET(CMAKE_C_FLAGS "-Os -mmcu=${DEVICE} -DF_CPU=${FREQ}UL -std=gnu99")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
#============================================================================================
SET(SOURCE_FILES
main.c
n3310.c
)
#============================================================================================
ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCE_FILES})
ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND avr-objcopy -O ihex -R.eeprom ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME}.hex)
ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME}.eep)
ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND avr-size ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME} --mcu=${DEVICE} --format=avr)

39
n3310.c

@ -56,7 +56,7 @@ static byte UpdateLcd;
/* /*
* Имя : LcdInit * Имя : LcdInit
* Описание : Производит инициализацию порта и SPI МК, контроллера LCD * Îïèñàíèå : Ïðîèçâîäèò èíèöèàëèçàöèþ ïîðòà ÌÊ è êîíòðîëëåðà LCD
* Аргумент(ы) : Нет * Аргумент(ы) : Нет
* Возвращаемое значение : Нет * Возвращаемое значение : Нет
*/ */
@ -66,7 +66,7 @@ void LcdInit ( void )
LCD_PORT |= _BV ( LCD_RST_PIN ); LCD_PORT |= _BV ( LCD_RST_PIN );
// Устанавливаем нужные биты порта на выход // Устанавливаем нужные биты порта на выход
LCD_DDR |= _BV( LCD_RST_PIN ) | _BV( LCD_DC_PIN ) | _BV( LCD_CE_PIN ) | _BV( SPI_MOSI_PIN ) | _BV( SPI_CLK_PIN ); LCD_DDR |= _BV( LCD_RST_PIN ) | _BV( LCD_DC_PIN ) | _BV( LCD_CE_PIN ) | _BV(LCD_DATA_PIN) | _BV(LCD_CLK_PIN);
// Некалиброванная задержка // Некалиброванная задержка
Delay(); Delay();
@ -76,10 +76,6 @@ void LcdInit ( void )
Delay(); Delay();
LCD_PORT |= _BV ( LCD_RST_PIN ); LCD_PORT |= _BV ( LCD_RST_PIN );
// Активируем SPI:
// без прерываний, старший бит первый, режим мастера, CPOL->0, CPHA->0, Clk/4
SPCR = 0x50;
// Отключаем LCD контроллер - высокий уровень на SCE // Отключаем LCD контроллер - высокий уровень на SCE
LCD_PORT |= _BV( LCD_CE_PIN ); LCD_PORT |= _BV( LCD_CE_PIN );
@ -220,20 +216,27 @@ static void LcdSend ( byte data, LcdCmdData cd )
// Включаем контроллер дисплея (низкий уровень активный) // Включаем контроллер дисплея (низкий уровень активный)
LCD_PORT &= ~( _BV( LCD_CE_PIN ) ); LCD_PORT &= ~( _BV( LCD_CE_PIN ) );
if ( cd == LCD_DATA ) byte i;
{
LCD_PORT |= _BV( LCD_DC_PIN ); if (cd == LCD_DATA)
} LCD_PORT |= _BV(LCD_DC_PIN);
else else
{ LCD_PORT &= ~_BV(LCD_DC_PIN);
LCD_PORT &= ~( _BV( LCD_DC_PIN ) );
for (i = 0; i < 8; i++) {
if ((data >> (7 - i)) & 1) {
LCD_PORT |= _BV(LCD_DATA_PIN);
} else {
LCD_PORT &= ~_BV(LCD_DATA_PIN);
}
LCD_PORT |= _BV(LCD_CLK_PIN);
LCD_PORT &= ~_BV(LCD_CLK_PIN);
} }
LCD_PORT |= _BV(LCD_DATA_PIN);
// Отправка данных в контроллер дисплея LCD_PORT |= _BV(LCD_DC_PIN);
SPDR = data;
// Ждем окончания передачи
while ( (SPSR & 0x80) != 0x80 );
// Отключаем контроллер дисплея // Отключаем контроллер дисплея
LCD_PORT |= _BV( LCD_CE_PIN ); LCD_PORT |= _BV( LCD_CE_PIN );

@ -22,19 +22,18 @@
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
// çàêîììåíòèðóéòå ýòó äèðåêòèâó, åñëè âàø äèñïëåé îðèãèíàëüíûé // çàêîììåíòèðóéòå ýòó äèðåêòèâó, åñëè âàø äèñïëåé îðèãèíàëüíûé
#define CHINA_LCD //#define CHINA_LCD
// Ïîðò ê êîòîðîìó ïîäêëþ÷åí LCD (çäåñü ïðèìåð ðàñïèíîâêè äëÿ ATmega8) // Ïîðò ê êîòîðîìó ïîäêëþ÷åí LCD (çäåñü ïðèìåð ðàñïèíîâêè äëÿ ATmega8)
// Библиотека использует аппаратный SPI, поэтому если хотите иной порт - придется реализовать SPI программно)
#define LCD_PORT PORTB #define LCD_PORT PORTB
#define LCD_DDR DDRB #define LCD_DDR DDRB
// Ðàñïèíîâêà ïîðòà // Ðàñïèíîâêà ïîðòà
#define LCD_DC_PIN PB1 #define LCD_DC_PIN PB1
#define LCD_CE_PIN PB2 #define LCD_CE_PIN PB2
#define SPI_MOSI_PIN PB3 // SDIN дисплея обязательно подключаем к MOSI аппаратного SPI #define LCD_DATA_PIN PB3
#define LCD_RST_PIN PB4 #define LCD_RST_PIN PB4
#define SPI_CLK_PIN PB5 // SCLK дисплея обязательно подключаем к SCK аппаратного SPI #define LCD_CLK_PIN PB5
// Ðàçðåøåíèå äèñïëåÿ â ïèêñåëÿõ // Ðàçðåøåíèå äèñïëåÿ â ïèêñåëÿõ
#define LCD_X_RES 84 // ðàçðåøåíèå ïî ãîðèçîíòàëè #define LCD_X_RES 84 // ðàçðåøåíèå ïî ãîðèçîíòàëè

BIN
sch/n3310.pdsprj Normal file

Binary file not shown.