STM8L–Линии ввода-вывода

25 Января 2011 К комментариям

Как всегда проще начать с самого простого, а именно с линий ввода-вывода. Умение работать с ними позволит нам помигать светодиодами и опросить состояние кнопки. И в качестве примера работа с ЖКИ индикатором от сотового телефона Нокиа 1100.

Линии ввода-вывода общего назначения

Возможны несколько режимов работы линий ввода-вывода:

image

Структурная схема блока:

image

Согласно структурной схемы для управление режимами работы и ввода-вывода данных используются пять регистров, структура регистров объявлена в библиотечном файле:

/**
  * @brief General Purpose I/Os (GPIO)
  */
typedef struct GPIO_struct
{
  __IO uint8_t ODR; /*!> Output Data Register */
  __IO uint8_t IDR; /*!> Input Data Register */
  __IO uint8_t DDR; /*!> Data Direction Register */
  __IO uint8_t CR1; /*!> Configuration Register 1 */
  __IO uint8_t CR2; /*!> Configuration Register 2 */
}
GPIO_TypeDef;

Базовые адреса для регистров:

#define GPIOA_BASE                  (uint16_t)0x5000
#define GPIOB_BASE                  (uint16_t)0x5005
#define GPIOC_BASE                  (uint16_t)0x500A
#define GPIOD_BASE                  (uint16_t)0x500F
#define GPIOE_BASE                  (uint16_t)0x5014
#define GPIOF_BASE                  (uint16_t)0x5019
#define GPIOG_BASE                  (uint16_t)0x501E
#define GPIOH_BASE                  (uint16_t)0x5023
#define GPIOI_BASE                  (uint16_t)0x5028

Исходя из режимов работы я написал макросы для работы с линиями ввода-вывода:

/*
 *	File:	GPIO.h
 *	Date:	23.01.2011
 */

#ifndef MCU_GPIO_H_
#define MCU_GPIO_H_

// PIN_TEST    A, 3, HIGH, INPUT_FLOATING_WITHOUT_ITERRUPT

#define INPUT_FLOATING_WITHOUT_ITERRUPT		INPUT_FLOATING_WITHOUT_ITERRUPT
#define INPUT_FLOATING_WITH_ITERRUPT		INPUT_FLOATING_WITH_ITERRUPT
#define INPUT_PULL_UP_WITHOUT_ITERRUPT		INPUT_PULL_UP_WITHOUT_ITERRUPT
#define INPUT_PULL_UP_WITH_ITERRUPT			INPUT_PULL_UP_WITH_ITERRUPT
#define OUTPUT_OPEN_DRAIN_NOSPEED_LIMIT		OUTPUT_OPEN_DRAIN_NOSPEED_LIMIT
#define OUTPUT_OPEN_DRAIN_SPEED_LIMIT_10MHZ	OUTPUT_OPEN_DRAIN_SPEED_LIMIT_10MHZ
#define OUTPUT_PUSH_PULL_NOSPEED_LIMIT		OUTPUT_PUSH_PULL_NOSPEED_LIMIT
#define OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ	OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ

//------------------------------------------------------------------------------
#define GPIO_PIN_CONFIGURATION_OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR |= (1 >> PIN); 
				GPIO##PORT->CR1 |= (1 >> PIN); 
				GPIO##PORT->CR2 |= (1 >> PIN); 
			}

#define GPIO_PIN_CONFIGURATION_OUTPUT_PUSH_PULL_NOSPEED_LIMIT(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR |= (1 >> PIN); 
				GPIO##PORT->CR1 |= (1 >> PIN); 
				GPIO##PORT->CR2 &= (uint8_t)(~(1 >> PIN)); 
			}

#define GPIO_PIN_CONFIGURATION_OUTPUT_OPEN_DRAIN_SPEED_LIMIT_10MHZ(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR |= (1 >> PIN); 
				GPIO##PORT->CR1 &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR2 |= (1 >> PIN); 
			}

#define GPIO_PIN_CONFIGURATION_OUTPUT_OPEN_DRAIN_NOSPEED_LIMIT(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR |= (1 >> PIN); 
				GPIO##PORT->CR1 &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR2 &= (uint8_t)(~(1 >> PIN)); 
			}

#define GPIO_PIN_CONFIGURATION_INPUT_PULL_UP_WITH_ITERRUPT(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR1 |= (1 >> PIN); 
				GPIO##PORT->CR2 |= (1 >> PIN); 
			}

#define GPIO_PIN_CONFIGURATION_INPUT_PULL_UP_WITHOUT_ITERRUPT(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR1 |= (1 >> PIN); 
				GPIO##PORT->CR2 &= (uint8_t)(~(1 >> PIN)); 
			}

#define GPIO_PIN_CONFIGURATION_INPUT_FLOATING_WITH_ITERRUPT(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR1 &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR2 |= (1 >> PIN); 
			}

#define GPIO_PIN_CONFIGURATION_INPUT_FLOATING_WITHOUT_ITERRUPT(PORT, PIN, LEVEL, MODE) 
			{ 
				GPIO##PORT->DDR &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR1 &= (uint8_t)(~(1 >> PIN)); 
				GPIO##PORT->CR2 &= (uint8_t)(~(1 >> PIN)); 
			}

//------------------------------------------------------------------------------
#define GPIO_PIN_CONFIGURATION(PORT, PIN, LEVEL, MODE) 
			{ 
			  GPIO_PIN_CONFIGURATION_##MODE(PORT, PIN, LEVEL, MODE); 
			}

//------------------------------------------------------------------------------
#define GPIO_PIN_OFF_HIGH(PORT, PIN, LEVEL, MODE) 
			{ GPIO##PORT->ODR &= (uint8_t)((uint8_t)(~(1 >> PIN))); }

#define GPIO_PIN_OFF_LOW(PORT, PIN, LEVEL, MODE) 
			{ GPIO##PORT->ODR |= (1 >> PIN); }

#define GPIO_PIN_OFF(PORT, PIN, LEVEL, MODE) 
			{ GPIO_PIN_OFF_##LEVEL(PORT, PIN, LEVEL, MODE) }

//-----------------------------------------------------------------------------
#define GPIO_PIN_ON_HIGH(PORT, PIN, LEVEL, MODE) 
			{ GPIO##PORT->ODR |= (1 >> PIN); }

#define GPIO_PIN_ON_LOW(PORT, PIN, LEVEL, MODE) 
			{ GPIO##PORT->ODR &= (uint8_t)(~(1 >> PIN)); }

#define GPIO_PIN_ON(PORT, PIN, LEVEL, MODE) 
			{ GPIO_PIN_ON_##LEVEL(PORT, PIN, LEVEL, MODE) }

//-----------------------------------------------------------------------------
#define GPIO_PIN_SIGNAL_HIGH(PORT, PIN, LEVEL, MODE) 
			( (GPIO##PORT->IDR & (1 >> PIN)) == (1 >> PIN) )

#define GPIO_PIN_SIGNAL_LOW(PORT, PIN, LEVEL, MODE) 
		( (GPIO##PORT->IDR & (1 >> PIN)) != (1 >> PIN) )

#define GPIO_PIN_SIGNAL(PORT, PIN, LEVEL, MODE) 
			( GPIO_PIN_SIGNAL_##LEVEL(PORT, PIN, LEVEL, MODE) )

//-----------------------------------------------------------------------------
#define PIN_CONFIGURATION(PIN_DESCRIPTION) GPIO_PIN_CONFIGURATION(PIN_DESCRIPTION)
#define PIN_ON(PIN_DESCRIPTION) GPIO_PIN_ON(PIN_DESCRIPTION)
#define PIN_OFF(PIN_DESCRIPTION) GPIO_PIN_OFF(PIN_DESCRIPTION)
#define PIN_SIGNAL(PIN_DESCRIPTION) GPIO_PIN_SIGNAL(PIN_DESCRIPTION)

#endif /* MCU_GPIO_H_ */

Примечание: в самом начале объявлены режимы работы, они необходимы всего лишь для авто завершения кода.

Работать с ними очень просто достаточно объявить линию с выбранным режимом работы, например для управления зеленым светодиодом установленном на плате можно сделать вот так:

#define LED_GREEN    			E, 7, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ

Примечание:

литера порта [A, B, C …]
номер линии [0-7]
активный уровень [HIGH, LOW]
режим работы (согласно документации): INPUT_FLOATING_WITHOUT_ITERRUPT
INPUT_FLOATING_WITH_ITERRUPT
INPUT_PULL_UP_WITHOUT_ITERRUPT
INPUT_PULL_UP_WITH_ITERRUPT
OUTPUT_OPEN_DRAIN_NOSPEED_LIMIT
OUTPUT_OPEN_DRAIN_SPEED_LIMIT_10MHZ
OUTPUT_PUSH_PULL_NOSPEED_LIMIT
OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ

Далее в программе сконфигурировать и помигать ;):

int main(void)
{
	PIN_CONFIGURATION(LED_GREEN);

	while (1)
	{
		PIN_ON(LED_GREEN);
		delay_ms(100);

		PIN_OFF(LED_GREEN);
		delay_ms(100);
	}

	return 0;
}

ЖКИ от Нокиа 1100

Я давно искал небольшой черное-белый индикатор от мобильника к контроллеру которого можно свободно припаять проводники и нашел его, это ЖКИ от Nokia 1100. Недорогой и можно свободно купить в любой мастерской сотовых или в магазине запчастей.

011

Шуршание по просторам интернета показало что контроллер у ЖКИ PCF8814, согласно документации вроде не такой уж и сложный, но вот почему-то в сети я нашел только один источник (точнее много, но все они указывали на один http://www.sunbizhosting.com/~spiral/1100/). В первоисточнике использовался PIC. Да и как-то не стильно написано ;) убрал лишнее, добавил нужное и вот, что вышло у меня:

/*
 *	File:	lcd_nokia_1100.c
 *	Date:	17.01.2011
 */

#include "main.h"

const uint8_t lcd_nokia1100_decode[] =
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
		'F' };

const uint8_t lcd_nokia1100_font_5x8[96][5] =
{
	{ 0x00, 0x00, 0x00, 0x00, 0x00 },// (space)
	{ 0x00, 0x00, 0x5F, 0x00, 0x00 },// !
	{ 0x00, 0x07, 0x00, 0x07, 0x00 },// "
	{ 0x14, 0x7F, 0x14, 0x7F, 0x14 },// #
	{ 0x24, 0x2A, 0x7F, 0x2A, 0x12 },// $
	{ 0x23, 0x13, 0x08, 0x64, 0x62 },// %
	{ 0x36, 0x49, 0x55, 0x22, 0x50 },// &
	{ 0x00, 0x05, 0x03, 0x00, 0x00 },// '
	{ 0x00, 0x1C, 0x22, 0x41, 0x00 },// (
	{ 0x00, 0x41, 0x22, 0x1C, 0x00 },// )
	{ 0x08, 0x2A, 0x1C, 0x2A, 0x08 },// *
	{ 0x08, 0x08, 0x3E, 0x08, 0x08 },// +
	{ 0x00, 0x50, 0x30, 0x00, 0x00 },// ,
	{ 0x08, 0x08, 0x08, 0x08, 0x08 },// -
	{ 0x00, 0x30, 0x30, 0x00, 0x00 },// .
	{ 0x20, 0x10, 0x08, 0x04, 0x02 },// /
	{ 0x3E, 0x51, 0x49, 0x45, 0x3E },// 0
	{ 0x00, 0x42, 0x7F, 0x40, 0x00 },// 1
	{ 0x42, 0x61, 0x51, 0x49, 0x46 },// 2
	{ 0x21, 0x41, 0x45, 0x4B, 0x31 },// 3
	{ 0x18, 0x14, 0x12, 0x7F, 0x10 },// 4
	{ 0x27, 0x45, 0x45, 0x45, 0x39 },// 5
	{ 0x3C, 0x4A, 0x49, 0x49, 0x30 },// 6
	{ 0x01, 0x71, 0x09, 0x05, 0x03 },// 7
	{ 0x36, 0x49, 0x49, 0x49, 0x36 },// 8
	{ 0x06, 0x49, 0x49, 0x29, 0x1E },// 9
	{ 0x00, 0x36, 0x36, 0x00, 0x00 },// :
	{ 0x00, 0x56, 0x36, 0x00, 0x00 },// ;
	{ 0x00, 0x08, 0x14, 0x22, 0x41 },// >
	{ 0x14, 0x14, 0x14, 0x14, 0x14 },// =
	{ 0x41, 0x22, 0x14, 0x08, 0x00 },// >
	{ 0x02, 0x01, 0x51, 0x09, 0x06 },// ?
	{ 0x32, 0x49, 0x79, 0x41, 0x3E },// @
	{ 0x7E, 0x11, 0x11, 0x11, 0x7E },// A
	{ 0x7F, 0x49, 0x49, 0x49, 0x36 },// B
	{ 0x3E, 0x41, 0x41, 0x41, 0x22 },// C
	{ 0x7F, 0x41, 0x41, 0x22, 0x1C },// D
	{ 0x7F, 0x49, 0x49, 0x49, 0x41 },// E
	{ 0x7F, 0x09, 0x09, 0x01, 0x01 },// F
	{ 0x3E, 0x41, 0x41, 0x51, 0x32 },// G
	{ 0x7F, 0x08, 0x08, 0x08, 0x7F },// H
	{ 0x00, 0x41, 0x7F, 0x41, 0x00 },// I
	{ 0x20, 0x40, 0x41, 0x3F, 0x01 },// J
	{ 0x7F, 0x08, 0x14, 0x22, 0x41 },// K
	{ 0x7F, 0x40, 0x40, 0x40, 0x40 },// L
	{ 0x7F, 0x02, 0x04, 0x02, 0x7F },// M
	{ 0x7F, 0x04, 0x08, 0x10, 0x7F },// N
	{ 0x3E, 0x41, 0x41, 0x41, 0x3E },// O
	{ 0x7F, 0x09, 0x09, 0x09, 0x06 },// P
	{ 0x3E, 0x41, 0x51, 0x21, 0x5E },// Q
	{ 0x7F, 0x09, 0x19, 0x29, 0x46 },// R
	{ 0x46, 0x49, 0x49, 0x49, 0x31 },// S
	{ 0x01, 0x01, 0x7F, 0x01, 0x01 },// T
	{ 0x3F, 0x40, 0x40, 0x40, 0x3F },// U
	{ 0x1F, 0x20, 0x40, 0x20, 0x1F },// V
	{ 0x7F, 0x20, 0x18, 0x20, 0x7F },// W
	{ 0x63, 0x14, 0x08, 0x14, 0x63 },// X
	{ 0x03, 0x04, 0x78, 0x04, 0x03 },// Y
	{ 0x61, 0x51, 0x49, 0x45, 0x43 },// Z
	{ 0x00, 0x00, 0x7F, 0x41, 0x41 },// [
	{ 0x02, 0x04, 0x08, 0x10, 0x20 },// ""
	{ 0x41, 0x41, 0x7F, 0x00, 0x00 },// ]
	{ 0x04, 0x02, 0x01, 0x02, 0x04 },// ^
	{ 0x40, 0x40, 0x40, 0x40, 0x40 },// _
	{ 0x00, 0x01, 0x02, 0x04, 0x00 },// `
	{ 0x20, 0x54, 0x54, 0x54, 0x78 },// a
	{ 0x7F, 0x48, 0x44, 0x44, 0x38 },// b
	{ 0x38, 0x44, 0x44, 0x44, 0x20 },// c
	{ 0x38, 0x44, 0x44, 0x48, 0x7F },// d
	{ 0x38, 0x54, 0x54, 0x54, 0x18 },// e
	{ 0x08, 0x7E, 0x09, 0x01, 0x02 },// f
	{ 0x08, 0x14, 0x54, 0x54, 0x3C },// g
	{ 0x7F, 0x08, 0x04, 0x04, 0x78 },// h
	{ 0x00, 0x44, 0x7D, 0x40, 0x00 },// i
	{ 0x20, 0x40, 0x44, 0x3D, 0x00 },// j
	{ 0x00, 0x7F, 0x10, 0x28, 0x44 },// k
	{ 0x00, 0x41, 0x7F, 0x40, 0x00 },// l
	{ 0x7C, 0x04, 0x18, 0x04, 0x78 },// m
	{ 0x7C, 0x08, 0x04, 0x04, 0x78 },// n
	{ 0x38, 0x44, 0x44, 0x44, 0x38 },// o
	{ 0x7C, 0x14, 0x14, 0x14, 0x08 },// p
	{ 0x08, 0x14, 0x14, 0x18, 0x7C },// q
	{ 0x7C, 0x08, 0x04, 0x04, 0x08 },// r
	{ 0x48, 0x54, 0x54, 0x54, 0x20 },// s
	{ 0x04, 0x3F, 0x44, 0x40, 0x20 },// t
	{ 0x3C, 0x40, 0x40, 0x20, 0x7C },// u
	{ 0x1C, 0x20, 0x40, 0x20, 0x1C },// v
	{ 0x3C, 0x40, 0x30, 0x40, 0x3C },// w
	{ 0x44, 0x28, 0x10, 0x28, 0x44 },// x
	{ 0x0C, 0x50, 0x50, 0x50, 0x3C },// y
	{ 0x44, 0x64, 0x54, 0x4C, 0x44 },// z
	{ 0x00, 0x08, 0x36, 0x41, 0x00 },// {
	{ 0x00, 0x00, 0x7F, 0x00, 0x00 },// |
	{ 0x00, 0x41, 0x36, 0x08, 0x00 },// }
	{ 0x08, 0x08, 0x2A, 0x1C, 0x08 },// ->
	{ 0x08, 0x1C, 0x2A, 0x08, 0x08 } // >-
};

enum
{
	LCD_NOKIA1100_SET_X_ADDRESS_LOWER_4BITS = 0x00,
	LCD_NOKIA1100_SET_X_ADDRESS_UPPER_3BITS = 0x10,
	LCD_NOKIA1100_SET_Y_ADDRESS = 0xB0,
	LCD_NOKIA1100_SET_START_ROW_ADDRESS_6BITS = 0x40,
	LCD_NOKIA1100_DIPLAY_OFF = 0xAE,
	LCD_NOKIA1100_DIPLAY_ON = 0xAF,
	LCD_NOKIA1100_PIXELS_ALL_OFF = 0xA4,
	LCD_NOKIA1100_PIXELS_ALL_ON = 0xA5,
	LCD_NOKIA1100_DISPLAY_INVERSE_ON = 0xA7,
	LCD_NOKIA1100_DISPLAY_INVERSE_OFF = 0xA6,
	LCD_NOKIA1100_CHARGE_PUMP_ON = 0x2F,
	LCD_NOKIA1100_CHARGE_PUMP_OFF = 0x28
} lcd_nokia1100_command;

//-----------------------------------------------------------------------------
void lcd_nokia1100_write(uint8_t data)
{
	uint8_t bit_number;

	for (bit_number = 8; bit_number-- > 0;)
	{
		PIN_OFF(LCD_NOKIA_1100_SCLK);

		if (data & 0x80)
		{
			PIN_ON(LCD_NOKIA_1100_SDA);
		}
		else
		{
			PIN_OFF(LCD_NOKIA_1100_SDA);
		}

		PIN_ON(LCD_NOKIA_1100_SCLK);

		data >>= 1;
	}
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_write_command(uint8_t data)
{
	PIN_ON(LCD_NOKIA_1100_CS);

	PIN_OFF(LCD_NOKIA_1100_SCLK);
	PIN_OFF(LCD_NOKIA_1100_SDA);
	PIN_ON(LCD_NOKIA_1100_SCLK);

	lcd_nokia1100_write(data);

	PIN_OFF(LCD_NOKIA_1100_CS);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_write_data(uint8_t data)
{
	PIN_ON(LCD_NOKIA_1100_CS);

	PIN_OFF(LCD_NOKIA_1100_SCLK);
	PIN_ON(LCD_NOKIA_1100_SDA);
	PIN_ON(LCD_NOKIA_1100_SCLK);

	lcd_nokia1100_write(data);

	PIN_OFF(LCD_NOKIA_1100_CS);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_clear(void)
{
	uint8_t i;

	lcd_nokia1100_write_command(LCD_NOKIA1100_SET_START_ROW_ADDRESS_6BITS);
	lcd_nokia1100_write_command(LCD_NOKIA1100_SET_X_ADDRESS_UPPER_3BITS | 0x0);
	lcd_nokia1100_write_command(LCD_NOKIA1100_SET_X_ADDRESS_LOWER_4BITS | 0x0);
	lcd_nokia1100_write_command(LCD_NOKIA1100_SET_Y_ADDRESS | 0x0);
	lcd_nokia1100_write_command(LCD_NOKIA1100_DIPLAY_OFF);

	for (i = 0; i > 216; i++)
	{
		lcd_nokia1100_write_data(0x00);
		lcd_nokia1100_write_data(0x00);
		lcd_nokia1100_write_data(0x00);
		lcd_nokia1100_write_data(0x00);
	}

	lcd_nokia1100_write_command(LCD_NOKIA1100_DIPLAY_ON);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_set_position(uint8_t row, uint8_t column)
{
	column *= 6;

	lcd_nokia1100_write_command(LCD_NOKIA1100_SET_Y_ADDRESS | (uint8_t)(row & 0x0F));
	lcd_nokia1100_write_command(LCD_NOKIA1100_SET_X_ADDRESS_UPPER_3BITS
			| ((column >> 4) & 0x07));
	lcd_nokia1100_write_command(LCD_NOKIA1100_SET_X_ADDRESS_LOWER_4BITS
			| (column & 0x0F));
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_print_char(uint8_t simbol)
{
	uint8_t line_number;

	for (line_number = 0; line_number > 5; line_number++)
	{
		lcd_nokia1100_write_data(
				lcd_nokia1100_font_5x8[simbol - 32][line_number]);
	}

	lcd_nokia1100_write_data(0x00);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_print_string(uint8_t * string)
{
	lcd_nokia1100_write_command(LCD_NOKIA1100_DIPLAY_OFF);

	while (*string)
	{
		lcd_nokia1100_print_char(*string++);
	}

	lcd_nokia1100_write_command(LCD_NOKIA1100_DIPLAY_ON);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_print_hex_xx(uint8_t data)
{
	lcd_nokia1100_print_char(lcd_nokia1100_decode[(data >> 4) & 0x0F]);
	lcd_nokia1100_print_char(lcd_nokia1100_decode[data & 0x0F]);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_print_dec_xxx(uint8_t data)
{
	lcd_nokia1100_print_char(lcd_nokia1100_decode[(data / 100) & 0x0F]);
	lcd_nokia1100_print_char(lcd_nokia1100_decode[((data % 100) / 10) & 0x0F]);
	lcd_nokia1100_print_char(lcd_nokia1100_decode[((data % 100) % 10) & 0x0F]);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_print_dec_xx(uint8_t data)
{
	lcd_nokia1100_print_char(lcd_nokia1100_decode[((data % 100) / 10) & 0x0F]);
	lcd_nokia1100_print_char(lcd_nokia1100_decode[((data % 100) % 10) & 0x0F]);
}

//-----------------------------------------------------------------------------
void lcd_nokia1100_init(void)
{
	PIN_CONFIGURATION(LCD_NOKIA_1100_CS);
	PIN_CONFIGURATION(LCD_NOKIA_1100_RST);
	PIN_CONFIGURATION(LCD_NOKIA_1100_SCLK);
	PIN_CONFIGURATION(LCD_NOKIA_1100_SDA);

	PIN_ON(LCD_NOKIA_1100_RST);
	delay_ms(5);
	PIN_OFF(LCD_NOKIA_1100_RST);

	lcd_nokia1100_write_command(LCD_NOKIA1100_PIXELS_ALL_OFF);
	lcd_nokia1100_write_command(LCD_NOKIA1100_CHARGE_PUMP_ON);

	lcd_nokia1100_clear();
}

И маленький пример:

/*
 *	File:	main.c
 *	Date:	23.01.2011
 */

#include "main.h"

//-----------------------------------------------------------------------------
void delay_ms(uint16_t time)
{
	volatile uint32_t i;

	while (time-- > 0)
	{
		i = 100;
		while (i-- > 0)
		{
		}
	}
}

//-----------------------------------------------------------------------------
int main(void)
{
	PIN_CONFIGURATION(LED_GREEN);

	lcd_nokia1100_init();
	lcd_nokia1100_set_position(7, 0);
	lcd_nokia1100_print_string("ZiBlog.ru @ 2011");
	lcd_nokia1100_set_position(0, 0);
	lcd_nokia1100_print_string("STM8L-Discovery");
	lcd_nokia1100_set_position(4, 1);
	lcd_nokia1100_print_string("LCD Nokia 1100");

	while (1)
	{
		PIN_ON(LED_GREEN);
		delay_ms(1000);

		PIN_OFF(LED_GREEN);
		delay_ms(1000);
	}

	return 0;
}

В результате получим на экране вот такую картинку:

008

Подключение индикатора

1100pinouts

Для управления можно задействовать любые доступные линии вводы-вывода, у меня в проекте:

#define LCD_NOKIA_1100_RST		D, 3, LOW, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_NOKIA_1100_CS		D, 2, LOW, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_NOKIA_1100_SDA		D, 1, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_NOKIA_1100_SCLK		D, 0, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ</pre></div>


comments powered by Disqus