Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kharakhnin / Методичка_проектирование МП систем.doc
Скачиваний:
116
Добавлен:
08.03.2016
Размер:
1.92 Mб
Скачать

5.3. Алгоритм программы для sdk

Алгоритм основной программы.

Нет

Да

Нет

Да

Нет

Да

Нет

Да

Алгоритм прерывания.

5.4. Программа для sdk

#include <ADUC812.h>

#include <ser_inc.h>

bit start_process=FALSE;

bit rrr=TRUE;

int i=1;

/////////////////////// For KB///////////////////////

char KBTable[]="147*2580369#ABCD";

char* symbol_from_kb;

///////////////////////////////////////////////////////

///////////////////////For LCD////////////////////////

static bit CurPosCtrl=1;

static char cur_x=0;//0-15

static bit cur_y=0; //0/1

///////////////////////////////////////////////////////

void Initilization(void);

void Buzz(void);

bit ScanKBOnce(char *ch);

unsigned char ReadMax(unsigned char xdata* regnum);

void WriteMax(unsigned char xdata* regnum,unsigned char val);

void Svetik(bit);

///////////////////Functions for LCD///////////////////////////

void SwitchCurPosControl(bit o);

void Strobe(char c);

void LCD_SwitchCursor(bit cursor, bit blink);

void LCD_Clear(void);

void InitLCD(void);

void LCD_Putch(char ch);

void LCD_GotoXY(unsigned char x,bit y);

void LCD_Type(char* s);

/////////////////////////////////////////////////////////////

///////////////////Function for Interrupt////////////////////

void SetVect(unsigned char num, void code * handler);

void TIMER0_ISR(void);

void COM_ISR(void);

////////////////////////////////////////////////////////////

////////////////////Functions for COM-port///////////////////////

void WSio(unsigned char Sym);

unsigned char RSio(void);

void Type(char * Str);

void MyInitSIO(void);

///////////////////////////////////////////////////////////////////

///////////////////Functions for ADC and DAC///////////////////////

void SetVoltage(float v, bit channel);

float GetVoltage(unsigned char channel);

///////////////////////////////////////////////////////////////////

void main(void)

{

Initilization();

while(1)

{

if(rrr)

{

char start_mes[] = {0xA1,0x6f,0xbf,0x6f,0xb3,0xbd,0x6f,0x63,0xbf,0xc4,0x20,0xba,0x20,0xbe,0x79,0x63,0xba,0x79};

LCD_Clear();

LCD_Type(start_mes);

rrr=FALSE;

}

if(start_process)

{

if(ScanKBOnce(symbol_from_kb)==0x01)

{

char sym=*symbol_from_kb;

float voltage=0;

switch(sym)

{

case '1': {// 1 impuls

Type("1");

//SetVoltage(0.1,DAC0);

//voltage=GetVoltage(0);

break;

}

case '2': {// 10 impulsov

Type("10");

break;

}

case '3': { // 100 impulsov

Type("100");

break;

}

case 'A': { // 1000 impulsov

Type("1000");

break;

}

case '4': {

Type("10000");//10 000 impulsov

break;

}

case '5': {

Type("100000");

break;

}

case '6': { // 0.0001 metra

SetVoltage(0.2,DAC0);

voltage=GetVoltage(0);

Type("0.0001");

break;

}

case '7': {// -0.0001 metra

SetVoltage(-0.2,DAC0);

voltage=GetVoltage(0);

Type("-0.0001");

break;

}

case '8': {// 0.001 metra

SetVoltage(1.2,DAC0);

voltage=GetVoltage(0);

Type("0.001");

break;

}

case '9': {// -0.001

SetVoltage(-1.2,DAC0);

voltage=GetVoltage(0);

Type("-0.001");

break;

}

}//switch

}

}

}//while(1)

}//main

void Initilization(void)

{

DACCON = 0x7F;

ADCCON1 = 0xAC;

InitLCD();

MyInitSIO();

SetVect(0x04,(void code*)COM_ISR);

IE=0x10;

EA=TRUE;

}

unsigned char ReadMax(unsigned char xdata *regnum)

{

unsigned char oldDPP=DPP;

unsigned char val=0;

DPP=MAXBASE;

val=*regnum;

DPP=oldDPP;

return val;

}

void WriteMax(unsigned char xdata *regnum, unsigned char val)

{

unsigned char oldDPP=DPP;

DPP=MAXBASE;

*regnum=val;

DPP=oldDPP;

}

void Buzz(void)

{

int dur,i;

for(dur = 0; dur < 8000; dur++)

{

WriteMax(ENA,0x3C);

for(i=0; i < 25; i++)continue;

WriteMax(ENA,0x20);

for(i=0; i < 25; i++)continue;

}

}

bit ScanKBOnce(char *ch)

{

unsigned char row,col,rownum,colnum;

unsigned int i;

for(colnum = 0; colnum < 4; colnum++)

{

col = 0x1 << colnum; //0001,0010,0100,1000,0001,...

WriteMax(KB, ~col); //11111110,11111101,11111011,11110111,11111110,...

for(rownum = 0; rownum < 4; rownum++)

{

row = ReadMax(KB) & (0x10 << rownum);

if( !row )

{

for(i = 0; i<10000; i++)continue;

row = ReadMax(KB) & (0x10 << rownum);

if( !row )

{

*ch = (KBTable[(colnum<<2) + rownum]);

return 1;

}

}

}

}

return 0;

}

void Svetik(bit tetrad)

{

int j,u;

if(tetrad)

{

for(j=0;j<50;j++)

{

WriteMax(SV,0x0F);

for(u=0;u<31000;u++) continue;

WriteMax(SV,0xF0);

for(u=0;u<31000;u++) continue;

}

}else

{

WriteMax(SV,i);

i++;

}

}

////////////////////////////////////////////////////////for LCD///////////////////////////////////////////

void SwitchCurPosControl(bit o)

{

CurPosCtrl=o;

}

void Strobe(char c)

{

unsigned int i;

WriteMax(C_IND,c | 0x1);

WriteMax(C_IND,c & 0xFE);

for (i=0;i<300;i++)continue;

}

void LCD_SwitchCursor(bit cursor, bit blink)

{

unsigned char i=0;

WriteMax( DATA_IND, DISPLAY_CTRL |

DISPLAY_ON |

((cursor)?CURSOR_ON:0) |

((blink)?BLINK:0) );

Strobe(0x8); //R/W = 0; RS = 0

}

void LCD_Clear(void)

{

int i;

WriteMax(DATA_IND, CLEAR);

Strobe(0x8); //clear

cur_x = 0;

cur_y = 0;

// for(i=0; i<1600; i++)continue;

}

void InitLCD(void)

{

unsigned short i;

for(i=0; i<4000; i++)continue;

// cmd = 0x30; //

WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS);

Strobe(0x8);

for(i=0; i<1500; i++)continue;

// cmd = 0x30; //

WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS);

Strobe(0x8);

for(i=0; i<50; i++)continue;

// cmd = 0x30; //

WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS);

Strobe(0x8);

// for(i=0; i<100; i++)continue;

// cmd = 0x38; //

WriteMax(DATA_IND, FUNCTION_SET|EIGHT_BITS|TWO_LINE);

Strobe(0x8);

// cmd = 0x08; //

WriteMax(DATA_IND, DISPLAY_CTRL); //Display off

Strobe(0x8);

// cmd = 0x01; //

WriteMax(DATA_IND, CLEAR);

Strobe(0x8);

// for(i=0; i<1600; i++)continue;

WriteMax(DATA_IND, ENTRY_MODE|INCR);

Strobe(0x8);

// cmd = 0x0F; //Display ON

WriteMax(DATA_IND, DISPLAY_CTRL|DISPLAY_ON); //Cursor OFF, Blinking OFF

Strobe(0x8);

}

void LCD_Putch(char ch)

{

if(CurPosCtrl)

{

LCD_GotoXY(cur_x,cur_y);

if(++cur_x>15)cur_x=0,cur_y=~cur_y;

}

WriteMax(DATA_IND,ch);

Strobe(0xC); //R/W = 0, RS = 1 (¤ ­­лҐ)

}

void LCD_GotoXY(unsigned char x,bit y)

{

WriteMax(DATA_IND,RAM_DD|(x+((y)?0x40:0)));

Strobe(0x8); //set ram

cur_x = x;

cur_y = y;

}

void LCD_Type(char* s)

{

bit t = CurPosCtrl;

SwitchCurPosControl(1);

while(*s)

LCD_Putch(*s++);

SwitchCurPosControl(t);

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////Functions interrupticus/////////////////////////////////////////////////////////////////////////////////////

void SetVect(unsigned char num, void code * handler)

{

unsigned char xdata * p = RAM_TABLE + (num << 3) + 3;

*p++ = LJMP;

*(unsigned short xdata *)p = (unsigned short)handler;

}

void COM_ISR(void) interrupt 4

{

if(RI)//read from RS-232

{

switch(RSio())

{

case 'Y':

{

start_process=TRUE;

LCD_Clear();

rrr=TRUE;

break;

}

case 'N':

{

char stop_mes[]={0xa8,0x70,0x6f,0xe5,0x65,0x63,0x63,0x20,0x6f,0x63,0xbf,0x61,0xbd,0x6f,0xb3,0xbb,0x65,0xbd};

start_process=FALSE;

LCD_Clear();

LCD_Type(stop_mes);

rrr=FALSE;

i=1;

break;

}

case 'M':

{

int h=0;

char mes1[]={0x48,0x61,0x20,0xba,0x61,0xbf,0x79,0xc1,0xba,0x65,0x20,0x35,0x4f,0x4f,0xba,0xb4,0x20,0xbe,0x70,0x6f,0xb3,0x6f,0xbb,0x6f,0xba,0xb8};

LCD_Clear();

LCD_Type(mes1);

Svetik(TRUE);

Buzz();

LCD_Clear();

WriteMax(SV,0x00);

rrr=TRUE;

start_process=FALSE;

i=1;

for(;h<32000;h++) continue;

break;

}

case 'L':

{

char mes2[]={0x31,0x4f,0x4f,0x20,0xbc,0x65,0xbf,0x70,0x6f,0xb3,0x20,0xbe,0x70,0x6f,0xb3,0x6f,0xe3,0x61};

int h=0;

LCD_Type(mes2);

Svetik(FALSE);

Buzz();

for(;h<32000;h++) continue;

LCD_Clear();

WriteMax(SV,0x00);

break;

}

}

}

if(TI)// write to RS-232

{

}

}

//////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////COM-port functions/////////////////////////////////////

void WSio(unsigned char Sym)

{

SBUF=Sym;

TI=0;

while(!TI);

TI=0;

}

unsigned char RSio(void)

{

while(!RI);

RI=0;

return SBUF;

}

void Type(char * Str)

{

while(*Str)

WSio(*Str++);

}

void MyInitSIO(void)

{

T3CON= 0x83;

T3FD= 0x2D;

SCON= 0x50;

}

///////////////////////////////////////////////////ADc DAc////////////////////////

void SetVoltage(float v, bit channel)

{

unsigned short max_val;

unsigned short val;

if(DACCON & 0x80)

{

max_val = 0xFF;

}

else

{

max_val = 0xFFF;

}

val = (unsigned short)(v * max_val / VDD);

val &= max_val;

if(channel == DAC0)

{

DAC0H = val >> 8;

DAC0L = val;

}

else

{

DAC1H = val >> 8;

DAC1L = val;

}

}

float GetVoltage(unsigned char channel)

{

float v;

while(ADCCON3 & BUSY);

ADCCON2 = 0x10 | channel ;

while(ADCCON3 & BUSY);

v = ((unsigned short)(ADCDATAH&0xF) << 8) | ADCDATAL;

v = v * 5.0 / 0xFFF;

return v;

}

/////////////////////////////////////////////////////