![]() |
Главная Микроконтроллеры [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [ 64 ] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]
; Здесь должен быть код, заменяющий часть защищаемой программы или ; шифрование данных sbis PIMD,3 rjnp RESET ; Работа с ключом завершена, переполнение стека допустимо rjmp MainLoop
; )Кден прихода импульса на вход INTO, находясь в режиме Power Down Idi г31.$40 out GIHSK,г31 Idi г31,$30 out HCUCR.г31 UnLoop: sei sleep rjnp UnLoop EXT IMTO: ; Если PD3=0, данные относятся к принтеру sbis PIMD,3 nov Byte.Byte6 rcall ByteExchange nov Byte6.Byte nov Byte,Byte7 rcall ByteExchange nov Byte7.Byte ret ; Обмен одним байтом данных ByteExchange: 101 LoopCounter.B ; Обработка положительного фронта сигнала синхронизации Loops: sbrs Byte,7 cbi PORTD.1 sbrc Byte,7 sbi PORTD, 1 Waiti: sbls PIND.2 ; rjnp Waltl sec : 0=1 ; sbis PIMD,0 clc ; c=0 rol Byte WaitO: sbic PIND,2 rjmp WaitO ; Цикл для 8 битов байта dec LoopCounter brne Loops ret ; Вывод бита )Кдем прихода положительного фронта Прием бита )Кдем прихода отрицательного фронта .EXIT Программа PC Исходник на С примера, проверяющего наличие ключа. Binclude Binclude Binclude char SendByte(char ByteOut) { int i.j: long li: unsigned char ByteOutCpy. Bytein = 0; ByteOutCpy = ByteOut: for (i=0; i<B; i++) { Bytein = (Bytein « 1) + ((inportb(0x379)&0xS0)==0); outportb{0x37A.0x021(((12S&ByteOutCpy)==0))); for (li=0: li<20001; li++); outportb(0x37A, 0x001 (((12B«,ByteOutCpy )==0))); for (11=0; 1K20001; li++): outportb(0x37A. 0x021 (((12S«,ByteOutCpy)==0))); ByteOutCpy = ByteOutCpy « 1; for (li=0; 1К20001; li++): return Bytein; void KeyOn(void) { int i; long li; for (i=0; i<64; i++) { outportb(0x37A,0x00); for (li=0; 1K200001: li++): outportb(0x37A.0x03); for (li=0: 1K200001; li++); delay(IOO); void KeyOff(vold) { int i; long li; for (i=0: i<128: i++) { outportb(0x37A,0x0B); for (li=0; 1K20001: li++): outportb(0x37A.0x08); for (li=0; 1K20001: li++); void RiainO { KeyOnO; printf("%02X ",SendByte(0)); printf("%02X ".SendByte(l)) prlntf("%02X ••,SendByte(2)); prlntf("%02X ,SendByte(3)); printf("%02X ••,SendByte(4)); printf("%02X ".SendByteCS)): printf("%02X ".SendByteCe)); printf("%02X ••,SendByte(7)); printfCAn"); printfC%02X •,SendByte(7)); printf("%02X ".SendByte(6)): printf("%02X ",SendByte(5)); printf("%02X ",SendByte(4)): prinTfC%02X -.SendByteCS)): printfC%02X ••,SendByte(2)); printfC%02X ".SendByte(l)); printfC%02X -.SendByteCO)): Включение ключа Отправка 8 байтов. Отправка следующих В байтов и одновременное получение байтов, отправленных раньше [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [ 64 ] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] 0.0011 |