Смекни!
smekni.com

Построение компьютерной системы на микроконтроллере (стр. 2 из 2)

Рисунок 12 – Общий алгоритм работы устройства


4. Листинг программы

#include <msp430F135.h>

voidvLCD_Silence(void);/*Состояние выводов "по умолчанию"*/

voidvLCD_Init(void);/*Инициализация дисплея*/

voidvLCD_Clear();/*Очистка дисплея*/

voidvLCD_RetLeft();/*Перемещение курсора в левую позицию*/

voidvLCD_EntryModeSet(charID,charSH);/*Установка направления сдвига курсора

(ID=0/1 - влево/вправо) и разрешение сдвига дисплея (SH=1) при записи в DDRAM*/

voidvLCD_OnOff(charD,charCB);/*Включает модуль (D=1) и выбирает тип курсора (см. даташит)*/

voidvLCD_CurDispShift(charSC,charRL);/*Выполнияет сдвиг дисплея или курсора

(SC=0/1 - курсор/дисплей, RL=0/1 - влево/вправо)*/

voidvLCD_FuncSet(charDL,char _N,char _F);/*Устанавливает разрядность интерфейса

(DL=0/1 - 4/8 бита), режим развертки строк (_N=0/1 - одна строка/две строки)

и размер символа (_F=0/1 - 5х8/5х10)*/

voidvLCD_SetAddr(charADD);/*Установка адреса для последующих операций и выбор области DDRAM*/

voidvLCD_WriteData(charDATA);/*Запись данных в активную область*/

void vLCD_Delay(char a);/*Задержка на 0/1 - 40 мкс/1.95 мс */

/*Команды(0)/Данные(1)*/

void vRS(char set)

{

if(set)

P3OUT|=0x80;

else

P3OUT&=~0x80;

}

/*Синхронизация*/

void vEN(char set)

{

if(set)

P3OUT|=0x40;

else

P3OUT&=~0x40;

_NOP();

}

/*Запись в индикатор

RS - команды(0)/данные(1); Data - тело команды/данных*/

void vLCD_Write(char RS, char Data)

{

vRS(RS);

_NOP();

//_NOP();

P1OUT&=Data|0x0f;//Записьстаршейтетрады.

vEN(1);

_NOP();

//_NOP();

vEN(0);

_NOP();

//_NOP();

P1OUT&=~0xf0;

P1OUT|=(Data<<4)&~0x0f;//Запись младшей тетрады.

_NOP();

//_NOP();

vEN(1);

_NOP();

//_NOP();

vEN(0);

_NOP();

//_NOP();

P1OUT|=0xf0;//Устанавливает на выводах состояние "по умолчанию".

_NOP();

//_NOP();

}

/*Состояние выводов "по умолчанию"*/

void vLCD_Silence(void)

{

vEN(0);

vRS(0);

P1OUT=0xf0;

}

/*Инициализация дисплея*/

void vLCD_Init(void)

{

for(char i=0;i<21;i++)

vLCD_Delay(1);//задержка на 40 мс.

vRS(0);

_NOP();

P1OUT&=0x30|0x0f;//Запись старшей тетрады.

vEN(1);

_NOP();

vEN(0);

_NOP();

P1OUT|=0xf0;//Устанавливает на выводах состояние "по умолчанию".

_NOP();

for(char i=0;i<3;i++)

vLCD_Delay(1);//задержка на 4.1 мс.

vLCD_FuncSet(0,0,0);//4-х разрядная шина, развертка 1 строк, символ 5х8.

vLCD_FuncSet(0,1,0);//4-х разрядная шина, развертка 1 строк, символ 5х8.

vLCD_OnOff(1,0);//Вкл. модуля, выкл. курсора.

vLCD_Clear();//Очистка DDRAM.

vLCD_EntryModeSet(1,0);//Сдвиг курсора вправо, сдвиг дисплея запрещен.

}

/*Очистка дисплея*/

voidvLCD_Clear()

{

vLCD_Write(0,0x01);

vLCD_Delay(1);

}

/*Перемещение курсора в левую позицию*/

void vLCD_RetLeft()

{

vLCD_Write(0,0x02);

vLCD_Delay(1);

}

/*Установка направления сдвига курсора (ID=0/1 - влево/вправо)

и разрешение сдвига дисплея (SH=1) при записи в DDRAM*/

void vLCD_EntryModeSet(char ID,char SH)

{

char Data=0x04+(ID<<1)+SH;

vLCD_Write(0,Data);

vLCD_Delay(0);

}

/*Включает модуль (D=1) и выбирает тип курсора (см. даташит)*/

void vLCD_OnOff(char D,char CB)

{

char Data=0x08+(D<<2)+CB;

vLCD_Write(0,Data);

vLCD_Delay(0);

}

/*Выполнияет сдвиг дисплея или курсора (SC=0/1 - курсор/дисплей,

RL=0/1 - влево/вправо)*/

voidvLCD_CurDispShift(charSC,charRL)

{

char Data=0x10+(SC<<3)+(RL<<2);

vLCD_Write(0,Data);

vLCD_Delay(1);

}

/*Устанавливает разрядность интерфейса (DL=0/1 - 4/8 бита), режим развертки bстрок (N=0/1 - одна строка/две строки) и размер символа (F=0/1 - 5х8/5х10)*/

void vLCD_FuncSet(char DL,char _N,char _F)

{

char Data=0x20+(DL<<4)+(_N<<3)+(_F<<2);

vLCD_Write(0,Data);

vLCD_Delay(0);

}

/*Установка адреса для последующих операций и выбор области DDRAM*/

void vLCD_SetAddr(char ADD)

{

ADD+=0x80;

vLCD_Write(0,ADD);

vLCD_Delay(0);

}

/*Запись данных в активную область*/

void vLCD_WriteData(char DATA)

{

vLCD_Write(1,DATA);

vLCD_Delay(0);

}

/*Задержка на 0/1 - 40 мкс/1.95 мс */

void vLCD_Delay(char a)

{

IFG1&=~WDTIFG;//Сбросили очередной флаг прерывания...

//Запуск Собаки с очисткой.

if(a)

WDTCTL=0x5A00 | 0x1f;//TMSEL,SSEL,WDIS.1,WDIS.0 - период 1.95 мс.

else

WDTCTL=0x5A00 | 0x1b;//TMSEL,WDIS.1,WDIS.0 0 - период 12.8 мкс.

char z=1;

if(!a)z=4;

for(char i=0;i<z;i++)

{

while(!(IFG1&WDTIFG))

_NOP();//пока нет прерывания от Собаки - висим.

IFG1&=~WDTIFG;//Сбросили очередной флаг прерывания...

}

//Остановка Собаки.

WDTCTL=0x5A00 | 0x93;//HOLD,TMSEL,WDIS.1,WDIS.0

}

/*Вывод строки c позиции line,column до конца строки. Если фактическая длинна строки больше, строка переписывается с начальной позиции.

Начало строки: line - номер строки сверху (0-3),

column - позиция первого символа в строке, string - строка символов*/

void vLCD_TransMassive(unsigned char line,unsigned char column,

unsignedcharstring[])

{

//Для корректной работы следует установить следующий режим:

//vLCD_EntryModeSet(1,0);//Сдвиг курсора вправо, сдвиг дисплея запрещен.

unsigned char ADD=line,ColumnCounter=column;

/*Вычисляем ардес в DDRAM*/

switch(ADD)

{

case 3:

ADD=0x54;

break;

case 2:

ADD=0x14;

break;

case 1:

ADD=0x40;

case 0:

break;

default:

ADD=0x00;

}

if(column>19)

column=0;

ADD+=column;

vLCD_SetAddr(ADD);//Установка адреса.

for(chari=0;;i++)//Запись строки (бесконечный цикл).

{

if(string[i]=='&bsol;0')//Если обнаружен симовл конца строки - выход из цикла.

return;

else

{

vLCD_WriteData(string[i]);

if(++ColumnCounter>19)//Если достигнут физический конец строки,

{

vLCD_SetAddr(ADD);//продолжаем запись с начальной позиции.

ColumnCounter=column;

}

}

}

_NOP();

}


Заключение

В данном курсовом проекте было разработано удаленное устройство индикации.

Использование внешнего кварцевого генератора обеспечивает высокую стабильность работы последовательного коммуникационного интерфейса (USART).

В ходе проектирования устройства были рассмотрены основные принципы построения устройств на микроконтроллерах MSP430 от Texas Instruments. А так же изучены аппаратные возможности данных микроконтроллеров.

Научились по описаниям работы или временным диаграммам функционирования устройств составлять алгоритмы тех или иных блоков программ.

В целом по разработанному курсовому проекту можно заметить, что использование микроконтроллеров MSP430 позволяет строить недорогие и производительные микроконтроллерные системы не использую внешнее периферийное оборудование (аналоговый компаратор, аппаратный тайме и др.).