Chip115 писал(а):да. вылечен. мне больше 2 к не давал
Вы точно не путаете флэш с ОЗУ?
Chip115 писал(а):да. вылечен. мне больше 2 к не давал
Код: Выделить всё
$NOMOD51
;----------
; This file is part of the C51 Compiler package
; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
; Version 8.01
;
; *** <<< Use Configuration Wizard in Context Menu >>> ***
;----------
; STARTUP.A51: This code is executed after processor reset.
;
; To translate this file use A51 with the following invocation:
;
; A51 STARTUP.A51
;
; To link the modified STARTUP.OBJ file to your application use the following
; Lx51 invocation:
;
; Lx51 your object file list, STARTUP.OBJ controls
;
;----------
;
; User-defined <h> Power-On Initialization of Memory
;
; With the following EQU statements the initialization of memory
; at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
; <i> Note: The absolute start-address of IDATA memory is always 0
; <i> The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN EQU 80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of XDATA memory
XDATASTART EQU 0
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
; <i> The length of XDATA memory in bytes.
XDATALEN EQU 0
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of PDATA memory
PDATASTART EQU 0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF>
; <i> The length of PDATA memory in bytes.
PDATALEN EQU 0H
;
;</h>
;----------
;
;<h> Reentrant Stack Initialization
;
; The following EQU statements define the stack pointer for reentrant
; functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
; <q> IBPSTACK: Enable SMALL model reentrant stack
; <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
; <i> Set the top of the stack to the highest location.
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.
; <q> XBPSTACK: Enable LARGE model reentrant stack
; <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.
; <q> PBPSTACK: Enable COMPACT model reentrant stack
; <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
;
; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;</h>
;----------
;
; Memory Page for Using the Compact Model with 64 KByte xdata RAM
; <e>Compact Model Page Definition
;
; <i>Define the XDATA page used for PDATA variables.
; <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF>
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE EQU 0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR DATA 0A0H
;
; </e>
;----------
; Standard SFR Symbols
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
NAME ?C_STARTUP
?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
RSEG ?C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE
ENDIF
IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
MOV ?C_IBP,#LOW IBPSTACKTOP
ENDIF
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIF
MOV SP,#?STACK-1
; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
#endif
;</h>
LJMP ?C_START
END
Код: Выделить всё
ANL PCA0MD, #0BFh
MOV PCA0MD, #000h

Код: Выделить всё
void Timer3_Init(void)
{
TMR3CN = 0x04; // òàéìåð3 â 16 áèò. ðåæèìå âêëþ÷åí. ïðåääåëèòåëü ÷àñòîòû 1:12
EIE1 = 0x80; // Âêëþ÷èòü ïðåðûâàíèå îò òàéìåðà3
TMR3L = 0x3F; // 06 10 ms
TMR3H = 0xB0; // f8 1 ìñ
}
void Timer3_ISR (void) interrupt 14
{
TMR3CN=TMR3CN^0xC0; // сбрасываем флаги TF3H TF3L
if (test2==1)
{
MC3PHAC_Send(cmd_FORW,sizeof(cmd_FORW)); // start
test2=0;
}
}
Chip115 писал(а):Можете взглянуть на настройки таймера 3?
Интересует место, где сбрасываются флаги в подпрограмме обработки прерывания.
Код: Выделить всё
xdata unsigned char mas[]={0x36,0x2E,0x1E,0x35,0x2D,0x1D,0x33,0x2B,0x1B}; // массив состояний клавиатуры
char check_noise ()
{
unsigned char nCounter=0; // переменная для хранения инкремента
for (nCounter=0; nCounter < NCOUNTER; nCounter++) {}
return nCounter;
}
Код: Выделить всё
//----------
// Function for scan of keyboard
//----------
void Scan (void)
{
P1=0x3E; // выберем столбик для опроса на порту P 1.2
if(P1==mas[0]) // если нажата Dn_1
{
while (P1==mas[0]) {cnoise=check_noise ();} // проверяем на истинность срабатывания
if (cnoise==NCOUNTER) /* если check_noise () вернула значение равное NCOUNTER, то срабатывание истинное*/
{
}
}
if (P1==mas[1] ) // если нажата up_1
{
while (P1==mas[1]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
}
}
if (P1==mas[2]) // если нажат сброс "Штанга"
{
while (P1==mas[2]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
}
}
P1=0x3D; // выберем столбик для опроса на порту P 1.1
if(P1==mas[3] ) // если нажата Dn_0
{
while (P1==mas[3]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
} }
}
if (P1==mas[4]) // If press up_0 .
{
while (P1==mas[4]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
}
}
if (P1==mas[5]&flag_1==0) // если нажата res_t .
{
while (P1==mas[5]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
}
}
P1=0x3B; // выберем столбик для опроса на порту P 1.0
if(P1==mas[6]) // если нажат стоп
{
while (P1==mas[6]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
}
}
if (P1==mas[7] ) // если нажат старт
{
while (P1==mas[7]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
}
}
if (P1==mas[8]) // если нажат s/l
{
while (P1==mas[8]) {cnoise=check_noise ();}
if (cnoise==NCOUNTER)
{
}
}
}

Chip115 писал(а):Проводники меж платой с МК и клавиатурой длинные,да еще собраны все в кучу. + рядом проходят импульсные высоковольтные цепи и аналогичные низковольтные.
Chip115 писал(а):Есть еще одна проблема.
МитяРа писал(а):Chip115 писал(а):Есть еще одна проблема.
Ты пробовал, как мя те посоветовал сканировать единицей и повесить на обратные линии по 2.4кОм на землю?
Chip115 писал(а):Попробую )
МитяРа писал(а):Chip115 писал(а):Попробую )
Была у мя классная книжка издательства Бином "Справочник по ОМЭВМ", там очень хорошо описано со схемами сканирование клавиатуры..
Если не найдёшь, могу прислать по почте...
Chip115 писал(а):она?
Chip115 писал(а):у меня диоды стоят,