/**************************************************************************** test_sio.c - тест драйвера последовательного канала для учебного стенда SDK-1.1 (C) test_sio.c, Ключев А.О. 2007 г. Это свободная программа; вы можете повторно распространять ее и/или модифицировать ее в соответствии с Универсальной Общественной Лицензией GNU, опубликованной Фондом Свободного ПО; либо версии 2, либо (по вашему выбору) любой более поздней версии. Эта программа распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Для получения подробных сведений смотрите Универсальную Общественную Лицензию GNU. Вы должны были получить копию Универсальной Общественной Лицензии GNU вместе с этой программой; если нет, напишите по адресу: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------------- Россия, Санкт-Петербург, кафедра вычислительной техники СПбГУИТМО e-mail: kluchev@d1.ifmo.ru ****************************************************************************/ #include "aduc812.h" #include "sio.h" #include "led.h" #include "max.h" unsigned char mode, result, d1, d2; char drebezg[4][4]; int time_count[4][4]; char queue[20]; char frontQ = -1; char endQ = -1; unsigned char colnum=3; char KBTable[]="147*2580369#ABCD"; void insertQ(unsigned char a) { if (frontQ == 20) frontQ = -1; queue[++frontQ] = a; } unsigned char getQ() { unsigned char symbol; if (endQ == 20) endQ = -1; symbol = queue[++endQ]; return symbol; } unsigned char ScanKBOnce() { unsigned char row,col,rownum; unsigned int i; if (colnum==3) colnum=0; else colnum++; col = 0x1 << colnum; //0001,0010,0100,1000,0001,... write_max(KB, ~col); //11111110,11111101,11111011,11110111,11111110,... row=read_max(KB) & (0xF0); row=~row>>4; return row; } void moderes() { mode = 1; d1 = 0xFF; d2 = 0xFF; result = 0xFF; } void mistake() { EA = 0; ES = 0; type ("Mistake has happend\n"); leds(0xFF); moderes(); EA = 1; ES = 1; } void TIMER_KB(void) __interrupt( 2 ){ unsigned char input; unsigned char rownum; char x1=0xCC; input=ScanKBOnce()&(0x0F); for(rownum=0;rownum<4;rownum++){ if(input&(0x01<0) drebezg[colnum][rownum]--; else if (drebezg[colnum][rownum]==0) if(time_count[colnum][rownum]>0) time_count[colnum][rownum]=0; } if(time_count[colnum][rownum]==1) //first enterance //push if(time_count[column][rownum]==500){//after 1 sex //push time_count[column][rownum]==400; //once } } TH0 = 0xD8; // Инициализация таймера 0 d8 TL0 = 0xEF; //частота=10кГц(1 в 10млсек) //ES=1; //TI=1; } void SIO_ISR( void ) __interrupt ( 4 ) { if(TI) { leds(0xBB); TI=0; } if(RI) { leds(0xAA); } } void SetVector(unsigned char __xdata * Address, void * Vector) { unsigned char __xdata * TmpVector; // Временная переменная // Первым байтом по указанному адресу записывается // код команды передачи управления ljmp, равный 02h *Address = 0x02; // Далее записывается адрес перехода Vector TmpVector = (unsigned char __xdata *) (Address + 1); *TmpVector = (unsigned char) ((unsigned short)Vector >> 8); ++TmpVector; *TmpVector = (unsigned char) Vector; // Таким образом, по адресу Address теперь // располагается инструкция ljmp Vector } void main( void ) { int c; unsigned char i; unsigned char dipval; SetVector( 0x2023, (void *)SIO_ISR ); SetVector( 0x200B, (void *)TIMER_KB); init_sio_timer( S2400 ); moderes(); while(1){ if(readdip()==0x01){ //calc if(get_count_queue()>=4&&get_count_queue()<=6) { //fucking math } } else { if(get_count_queue()>0) { ES=1; ET0=0; //blocking TI=1; } } } /*for (i = 0; i<30; i++) { insertQ(i); leds(getQ()); }*/ }