Рисунок 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]=='\0')//Если обнаружен симовл конца строки - выход из цикла.
return;
else
{
vLCD_WriteData(string[i]);
if(++ColumnCounter>19)//Если достигнут физический конец строки,
{
vLCD_SetAddr(ADD);//продолжаем запись с начальной позиции.
ColumnCounter=column;
}
}
}
_NOP();
}
Заключение
В данном курсовом проекте было разработано удаленное устройство индикации.
Использование внешнего кварцевого генератора обеспечивает высокую стабильность работы последовательного коммуникационного интерфейса (USART).
В ходе проектирования устройства были рассмотрены основные принципы построения устройств на микроконтроллерах MSP430 от Texas Instruments. А так же изучены аппаратные возможности данных микроконтроллеров.
Научились по описаниям работы или временным диаграммам функционирования устройств составлять алгоритмы тех или иных блоков программ.
В целом по разработанному курсовому проекту можно заметить, что использование микроконтроллеров MSP430 позволяет строить недорогие и производительные микроконтроллерные системы не использую внешнее периферийное оборудование (аналоговый компаратор, аппаратный тайме и др.).