Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[SOLVED] help! keypad 4x4 program

Status
Not open for further replies.

Iren

Newbie level 3
Joined
Jun 1, 2013
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,299
Hello! (and apologize in advance for my English) I have some problem with programming 8051.. This is my code:
Code:
ORG	0000H	; смещение при загрузке кода будет равно 0
	LJMP	SBROS	; переход на сброс

	ORG	000BH	; смещение на 11 байт
	LJMP	TIME_00	; переход на обработку переполнения таймера

	ORG	0100H	; пропускаем первые 256 байт, которые отводятся под блок PSP
	
DIGITS:	DB	03fh,06h,05bh,04fh,066h,06dh,07dh,07h,07fh,06fh	; цифры на индикаторе от 0 до 9

SBROS:	CLR	TCON.4		; остановка таймера 
	MOV	R3, #00H	; обнуляем R3
	MOV	TMOD, #1	; запускаем т/с в режиме таймера
	MOV	P1, #00H	; обнуляем P1
	MOV	P3, #00H	; обнуляем P3 

START:	CLR	A	; очищаем аккумулятор
	CLR	C	; обнуляем флаг переноса
	MOV	R5, #10H	; Нач. значение для перебора строк
	MOV	R1, #004H	; счетчик декрементов при вычислении смещений регистра строк

; CJNE - сравнивает значения первых двх операндов и выполняет ветвление, если операнды не равны	
READ_ROW:	CJNE	R4, #0, NEXT;  проверка не нажата ли предыдущая кнопка
	MOV	A, R5
	RRC	A	; Сдвиг содержимого аккумулятора вправо. седьмой бит = С
	JC	START	; если установлен перенос (с=1), переход на метку старт	
	DEC	R1	; уменьшаем R1 - прошла обработка одной строки, переход на следующую
	MOV	R5, A	; в R5 помещаем следующую строку
	MOV	P0, R5	;подсветка очередной строки

	MOV	A, P1	;считывание столбцов 
	JZ	READ_ROW	; переход, если содержимое аккумулятора равно 0
	

	MOV	R4, #1		; нажата ли кнопка в данной строке
	MOV	DPTR, #DIGITS

	MOV	R2, #0		;счётчик инкрементов для вычисления номера столбца   
NEXT:	INC	R2
	RRC	A	; Сдвиг содержимого аккумулятора вправо через флаг переноса
	JNC	NEXT	; если установлен перенос, переход на метку next
	; JB - если бит равен нулю. вычисление первой цифры номера кнопки
	JB P1.0, OUT1_0      
        JB P1.1, OUT1_0
        JB P1.3, OUT1_1
        JB P1.2, OUT1_0

OUT1_1:	MOV	P2, #00000110B ; код единицы
	LJMP	OUT2
OUT1_0:	MOV	P2, #00111111B ; код нуля

OUT2:	MOV	A, R1		;вычисление второй цифры номера кнопки
	MOV	B, #004H	; число смещений
	MUL	AB
	DEC	R2
	ADD	A, R2

	MOVC	A, @A+DPTR	; загружает аккумулятор константой из памяти программы
	MOV	P3, A	; выдает константу в индикатор - P3
	
	MOV	TH0, #76
	MOV	TL0, #01
	MOV	IE, #10000010B	;   прерывания разрешены для T/C0
	SETB	TCON.4
	LJMP	READ_ROW

TIME_00:	INC	R3	;обработки прерывания по переполнению таймера 0
	CJNE	R3, #20, CYCLE	;ожидание 1 сек

	CLR	TCON.4		;остановка таймер 0
	MOV	P2, #0		;погашение индикатора порта 2
	MOV	P3, #0		;погашение индикатора порта 3
	MOV	R4, #0		;сброс флажка индикации предыдущей кнопки
	MOV	R3, #00H
CYCLE:	RETI

	END

But survey is in the lines, and does not go into columns :(
What is my mistake?
 

Code:
ORG	0000H	
	LJMP	SBROS	; reset timer

	ORG	000BH	
	LJMP	TIME_00	; timer overflow

	ORG	0100H	
	
DIGITS:	DB	03fh,06h,05bh,04fh,066h,06dh,07dh,07h,07fh,06fh	; figures on the display from 0 to 9

SBROS:	CLR	TCON.4		; stop timer
	MOV	R3, #00H	
	MOV	TMOD, #1	; start timer
	MOV	P1, #00H	 
	MOV	P3, #00H	  

START:	CLR	A	
	CLR	C	
	MOV	R5, #10H	; initial value to iterate through rows
	MOV	R1, #004H	; 4 rows on keyboard

READ_ROW:	CJNE	R4, #0, NEXT;  not whether previous button is pressed
	MOV	A, R5
	RRC	A	; 
	JC	START	; 
	DEC	R1	; treatment was one row move to the next
	MOV	R5, A	; next row
	MOV	P0, R5	; highlighting the next line

	MOV	A, P1	;	read columns
	JZ	READ_ROW	 
	

	MOV	R4, #1		; you have pressed the button in the row
	MOV	DPTR, #DIGITS

	MOV	R2, #0		;counter increments to calculate the number of column
NEXT:	INC	R2
	RRC	A	 
	JNC	NEXT	 
	JB P1.0, OUT1_0      
        JB P1.1, OUT1_0
        JB P1.3, OUT1_1
        JB P1.2, OUT1_0

OUT1_1:	MOV	P2, #00000110B ; first digit = 1
	LJMP	OUT2
OUT1_0:	MOV	P2, #00111111B ; first digit = 0

OUT2:	MOV	A, R1		;calculation of the second digit of the buttons
	MOV	B, #004H	
	MUL	AB
	DEC	R2
	ADD	A, R2

	MOVC	A, @A+DPTR	
	MOV	P3, A	; produces a constant light
	
	MOV	TH0, #76
	MOV	TL0, #01
	MOV	IE, #10000010B   
	SETB	TCON.4
	LJMP	READ_ROW

TIME_00:	INC	R3	
	CJNE	R3, #20, CYCLE	

	CLR	TCON.4		
	MOV	P2, #0		
	MOV	P3, #0		
	MOV	R4, #0		
	MOV	R3, #00H
CYCLE:	RETI

	END

Program was written in MCU8051 IDE. The controller should handle pressing a button on the keyboard, and then give the button code on two indicators. The problem is that the program cycles on the processing rows. That is, even if the button is pressed, there is no calculation of the column. Accordingly, it is impossible to issue a code on the display.
 

Hi!
R4 not initialised. If in R4 has the garbage before the start of the subroutine then the subroutine have an endless cycle because in A is #0.
CLR A
CLR C
....
READ_ROW: CJNE R4, #0, NEXT
....
NEXT: INC R2
RRC A
JNC NEXT
....
Maybe I forgot something, has long been not programming 8051.
 

I tried .. no error in this..

- - - Updated - - -

How I can understand what button is pressed??
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top