Пятница, Ноябрь 27, 2020

Прием байта по прерыванию

#include<p18cxxx.h>
#include<delays.h>
#include<xlcd.h>
#include<usart.h>
#pragma config OSC=XT
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config MCLRE=OFF
#pragma config BOREN=OFF
#pragma config PBADEN=OFF
//*******************Переменные**************************************
#pragma udata
char str1[]="DON'T TOUCH ME ";
char str2[]="FUCK YOU SHIT ";
char count=0;
char addr_1st=0;
char i=0;
char j=0;
char RxIn=0;
char RxBuf[16];
char asc[16];
//********************Прерывания**************************************
#pragma code
void MyHighInt(void);          //Прототипы подпрограммы обслуживания
void MyLowInt(void);           //прерываний

#pragma interrupt MyHighInt    //Это высокоприоритетное прерывание
#pragma code high_vector=0x08  //Это вектор по адресу 0х08
void high_vector(void){
    _asm GOTO MyHighInt _endasm
}

#pragma interrupt MyLowInt     //Это низкоприоритетное прерывание
#pragma code low_vector=0x18   //Это вектор по адресу 0х18
void low_vector(void){
    _asm GOTO MyLowInt _endasm
}
//*******************************************************************
#pragma code
//Функции задержки для LCD
void DelayFor18TCY(void)
{
    Delay10TCYx(2);
}
void DelayPORXLCD(void)
{
    Delay1KTCYx(15);
}
void DelayXLCD(void)
{
    Delay1KTCYx(5);
}
char* HexToASCII(char *sour,char *dest,int len);
//******************Главная функция***************************************
void main(void)
{
    ADCON1=0;
    ADCON1=0x0f;
    //If using interrupts, ensure that the GIE and PEIE
    //bits in the INTCON register (INTCON<7:6>) are set.
    RCONbits.IPEN=0;          //включено только высокоприоритетное прерывание
    INTCONbits.GIE=1;         //глобальное разрешение прерывания
    INTCONbits.PEIE=1;        //When IPEN = 0:1 = Enables all unmasked peripheral interrupts
    //Конфигурируем USART
    OpenUSART( USART_TX_INT_OFF &USART_RX_INT_ON &USART_ASYNCH_MODE &USART_EIGHT_BIT &USART_CONT_RX &USART_BRGH_HIGH,25 );
    //Конфигурируем LCD
    OpenXLCD(FOUR_BIT & LINES_5X7);
    while(BusyXLCD());
    WriteCmdXLCD(CURSOR_OFF&BLINK_OFF);
    addr_1st=0x80;            //Адрес первого символа
//**Главный цикл программы************************************************
    while(1)
    {
//******Просто мигаем второй строкой для проверки прерывания**************        
        while(BusyXLCD());
        SetDDRamAddr(0xC0);
        putsXLCD(str1);
        Delay10KTCYx(50);
//******Чистим строку 2***************************************************
        while(BusyXLCD());
        SetDDRamAddr(0xC0);
        for(i=0;i<16;i++){
            while(BusyXLCD());
            WriteDataXLCD(' ');
        }
        Delay10KTCYx(50);
    }
}


//*******************Попадаем сюда по прерыванию на Rx**************
void MyHighInt(void){
    int i;
    if(PIR1bits.RCIF){                     //прерывание по Rx?
        RxIn=getcUSART();                  //приняли байт в RxIN
        RxBuf[addr_1st-0x80]=RxIn;
        if(addr_1st==0x90){                //проверим не кончилась ли строка
            while(BusyXLCD());
            SetDDRamAddr(0x80);            //чистим строку
            for(i=0;i<16;i++){
               while(BusyXLCD());
               WriteDataXLCD(' ');
            }
            addr_1st=0x80;                 //начало первой строки
        }
        if(RxIn==0x7F){//(RxIn==0x08){     //если Backspase
            if(addr_1st!=0x80){            //если еще не ввели символ в 0х80
                while(BusyXLCD());           
                SetDDRamAddr(--addr_1st);
                while(BusyXLCD());
                WriteDataXLCD(' ');
                RxBuf[addr_1st-0x80]=0x00;
                RxBuf[(addr_1st-0x80)+1]=0x00;
            }
        }   
        else if(RxIn==0x0D){               //Если нажата кнопка Eter
            putsUSART(RxBuf);
            while(BusyXLCD());
            SetDDRamAddr(0x80);            //чистим строку
            for(i=0;i<16;i++){
               while(BusyXLCD());
               WriteDataXLCD(' ');
            }
            addr_1st=0x80;
            for(i=0;i<16;i++)             //Чисим буфер
                RxBuf[i]=0x00;
        }  
        else{                        
            while(BusyXLCD());           
            SetDDRamAddr(addr_1st++);
            WriteDataXLCD(RxIn);           //байт на LCD
        }
    }
}
//******************************************************************
void MyLowInt(void){
}
//Функция возвращает адрес массива символов в памяти, куда запишет
//преобразованные в строку шеснадцатиричные значения байтов в массиве,
//переданном ей параметром sour(адрес массива байтов, который надо преобразовать)
//len -колличество байтов в sour,dest-адрес массива, куда запишем преобразованную
//строку, равную len*2.
char* HexToASCII(char *sour,char *dest,int len)
{
    int i;
    char tmp;
    int j=0;
    for(i=0;i<len;i++){
        tmp=((sour[i]>>4)&0x0f);
        if(tmp<=9){
            dest[j]=tmp+0x30;
        }
        else if(tmp>=0x0A && tmp<=0x0F){
            dest[j]=tmp+0x37;
        }
        j++;
        tmp=sour[i];
        tmp=tmp &= 0x0f;
        if(tmp<=9){
            dest[j]=tmp+0x30;
        }
        else if(tmp>=0x0A && tmp<=0x0F){
            dest[j]=tmp+0x37;
        }
        j++;
        
        
    }
    dest[j]=0;
    return dest;
}


 

НАЗАД                                                                                                                                         ДАЛЕЕ


Back to Top