atmega16+wh1602p

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вт апр 09, 2013 20:43:04

Сообщение triest »

Взял программку. Прикрутил дисплей. Но ничего не работает.
Код(не мой):
Спойлер

Код: Выделить всё

	.include "m16def.inc"	; ?????????? ATMega16

			.CSEG
			.ORG 	0x0000			; погналт
			JMP 	Reset			; на сброс.
			//нафиг тут ненужные вектора
			.ORG	INT0addr		; External Interrupt Request 0т 
			RETI
			.ORG	INT1addr		; External Interrupt Request 1
			RETI
			.ORG	OC2addr			; Timer/Counter2 Compare Match
			RETI
			.ORG	OVF2addr		; Timer/Counter2 Overflow
			RETI
			.ORG	ICP1addr		; Timer/Counter1 Capture Event
			RETI
			.ORG	OC1Aaddr		; Timer/Counter1 Compare Match A
			RETI
			.ORG	OC1Baddr		; Timer/Counter1 Compare Match B
			RETI
			.ORG	OVF1addr		; Timer/Counter1 Overflow
			RETI
			.ORG	OVF0addr		; Timer/Counter0 Overflow
			RETI
			.ORG	SPIaddr			; Serial Transfer Complete
			RETI
			.ORG	URXCaddr		; USART, Rx Complete
			RETI
			.ORG	UDREaddr		; USART Data Register Empty
			RETI
			.ORG	UTXCaddr		; USART, Tx Complete
			RETI
			.ORG	ADCCaddr		; ADC Conversion Complete
			RETI
			.ORG	ERDYaddr		; EEPROM Ready
			RETI
			.ORG	ACIaddr			; Analog Comparator
			RETI
			.ORG	TWIaddr			; 2-wire Serial Interface
			RETI
			.ORG	SPMRaddr		; Store Program Memory Ready
			RETI

			// DATA_PORT шана данных
			// CMD_PORT[0..2] линия управления
			//(0-E (строб); 1-R/W (0-запись,1-чтение); 2-RS (0-?команда, 1-данные))

			.equ 		CMD_PORT		= PORTA
			.equ		CMD_PORT_DDR	= DDRA
			.equ 		E 				= 1
			.equ 		RW 				= 2
			.equ 		RS 				= 3

			.equ 		DATA_PORT 		= PORTB
			.equ 		DATA_PORT_DDR	= DDRB
			.equ 		DATA_PORT_PIN	= PINB

			.ORG	INT_VECTORS_SIZE		; ????? ??????? ??????????

Reset:
			LDI		R16,low(RAMEND)		; стек для прерываний
			OUT		SPL,R16 			; 
			LDI		R16,High(RAMEND)	;
			OUT		SPH,R16 			;  push / pop

			CALL 	DPORT_In		 	; понт шины данных на вход

			SBI 	CMD_PORT_DDR, E		; ноги управляющих сигналов на выход
			SBI 	CMD_PORT_DDR, RW 	; ?????????
			SBI 	CMD_PORT_DDR, RS 	; ?? ?????

			CBI 	CMD_PORT,E			; убрали управляющие сигналы
			CBI 	CMD_PORT,RW			; ???????????
			CBI 	CMD_PORT,RS			; ???????

	// науза перед стартом 0,5 сек
			CALL 	wait_05 		;

	// начали инициализацию 16*2, (???.8???)

	// команда 8 бит 2 строки
			CALL 	DPORT_Out		 	; порт шины данных на выход

			CBI		CMD_PORT,RS			; команда RS=0
			CBI		CMD_PORT,RW			; будем записывать R/W=0

			LDI 	R16,0x38			; 8бит 2 строки
			OUT		DATA_PORT,R16		; данные в порт
			NOP
			CALL 	strob				; стробтрующтй импульс
			CALL 	wait_4mkc			; пауза 4мс(как по датишу)

	// ??? ??????? 8??? 2 ??????
			CALL 	DPORT_Out		 	; порты шины данных

			CBI		CMD_PORT,RS			; бедет команда RS=0
			CBI		CMD_PORT,RW			; будем писать данные R/W=0

			LDI 	R16,0x38			; 8бит 2 строки
			OUT		DATA_PORT,R16		; выставили данные в порт
			NOP
			CALL 	strob				; стробирующий импульс

	// режим указали, готовим дисплей к выводу информации
	
	// команда очистки экрана
			CALL 	LCD_busy			; проверка готовности
		

			CALL 	DPORT_Out		 	; порт шины данных на выход

			CBI		CMD_PORT,RS			; будет команда RS=0
			CBI		CMD_PORT,RW			; будем писать данные R/W=0

			LDI 	R16,0x01			; ?очистить экран (код 01h)
			OUT		DATA_PORT,R16		; выставили данные в порт
			NOP
			CALL 	strob				; стрибирующий импульс

	// команда включения экрана
			CALL 	LCD_busy			; проверяем готовность

			CALL 	DPORT_Out		 	; порт шины данных на выход

			CBI		CMD_PORT,RS			; будет команда RS=0
			CBI		CMD_PORT,RW			; будем писать данные R/W=0

			LDI 	R16,0x0C			; вкл. экран (код 0Ch)
			OUT		DATA_PORT,R16		; выставили данные в порт
			NOP
			CALL 	strob				; строб

	// задаем режим смешения курсора
			CALL 	LCD_busy			; проверим режим готовности ЖКИ

			CALL 	DPORT_Out		 	; порт шины данных

			CBI		CMD_PORT,RS			; ????? ??????? RS=0
			CBI		CMD_PORT,RW			; ????? ?????? ?????? R/W=0

			LDI 	R16,0x06			; включаем экран (??? 06)
			OUT		DATA_PORT,R16		; выставить данные в порт
			NOP
			CALL 	strob

	// команда $80 (датиш)
			CALL 	LCD_busy			; проверка занятости

			CALL 	DPORT_Out		 	; поррт шины данных на выход

			CBI		CMD_PORT,RS			; ????? ??????? RS=0
			CBI		CMD_PORT,RW			; ????? ?????? ?????? R/W=0

			LDI 	R16,0x80			; 
			OUT		DATA_PORT,R16		; ?дынные в порт
			NOP
			CALL 	strob				; стробирующий импульс

	// инициализация закончена
		
	// шлем данные
			CALL 	LCD_busy			; проверка занятости

			CALL 	DPORT_Out		 	; порт данных на выход

			SBI 	CMD_PORT,RS			; ????? ?????? RS=1
			CBI 	CMD_PORT,RW			; ????? ?????? ?????? R/W =0

			LDI 	R16,'A'				; код буквы A
			OUT 	DATA_PORT,R16		; выставить в порт
			NOP 
			CALL 	strob


	// посылаем букву
			CALL 	LCD_busy			; проверка готовности

			CALL 	DPORT_Out		 	;порт шины данных на выход

			SBI 	CMD_PORT,RS			; будут данные RS=1
			CBI 	CMD_PORT,RW			; ????? ?????? ?????? R/W =0

			LDI 	R16,'a'				; код быквы a
			OUT 	DATA_PORT,R16		; ?посылаем буквы
			NOP 
			CALL 	strob

	// ???????? ??? ?????
			CALL 	LCD_busy			; проверка занятости

			CALL 	DPORT_Out		 	; шина данных на выход

			SBI 	CMD_PORT,RS			; ????? ?????? RS=1
			CBI 	CMD_PORT,RW			; ????? ?????? ?????? R/W =0

			LDI 	R16,0x41			; ??? ????? A
			OUT 	DATA_PORT,R16		; выставляем в порт
			NOP 
			CALL 	strob

	// собствеено символы на экране...

	// порт в исходном состоянии
			CALL 	DPORT_In 		 	; порт шины данных на вход
	
loop:		NOP
		;	CALL 	LED_blink			; тупо 5 portD
			NOP
			RJMP 	loop				; 


////////////////////////////////////////////////////////////////////////
DPORT_In:
		// ???? ???? ?????? ?? ????
			LDI 	R16,0x00
			OUT 	DATA_PORT_DDR, R16 	; порт шину данных на вход
			LDI 	R16,0xFF
			OUT 	DATA_PORT, R16 		;запись Pull-up
			RET

DPORT_Out:
		// порт шины данных на выход
			LDI 	R16,0x00 			;
			OUT 	DATA_PORT,R16		; ?????????? ????
			LDI 	R16,0xFF			;
			OUT 	DATA_PORT_DDR,R16	; ???? ?? ?????
			RET

strob: 
		// стробирующий импульс
			SBI		CMD_PORT,E			; выключаем стробирующий импульс
			CALL 	delay 				; ждем
			CBI 	CMD_PORT,E			; выключаем
			CALL 	delay				; ждем
			RET

LCD_busy: 
		// проверка готовности ЖКИ
			CALL 	DPORT_In 		 	; порт шины данных на выход

	busy:
			CBI		CMD_PORT,RS			; ????? ??????? RS=0
			SBI		CMD_PORT,RW			; ????? ?????? ?????? R/W=1

			SBI 	CMD_PORT,E			; стробирующий импульс

			CALL delay 					; ???????? ?????

			IN 		R16,DATA_PORT_PIN	; ?????? ??????
			CBI 	CMD_PORT,0			; ???????????? ??????? ????.

			ANDI	R16,0x80			; проверяем флаг
			BRNE	Busy				; если нет, крутимся в цикле

			RET

delay:
		// ????? ?????? ~500????.
			LDI 	R17,0x04
	d0:		DEC 	R17
			BRNE 	d0
			RET
			
wait_05:
		// ?задержка 0,5 сек (?????????? ?????????? AVRdelayloop3.exe)

			; =========== 
			;    delay loop generator 
			;     4000000 cycles:
			; ----------------------------- 
			; delaying 3999996 cycles:
			          ldi  R17, $24
			WGLOOP0:  ldi  R18, $BC
			WGLOOP1:  ldi  R19, $C4
			WGLOOP2:  dec  R19
			          brne WGLOOP2
			          dec  R18
			          brne WGLOOP1
			          dec  R17
			          brne WGLOOP0
			; ----------------------------- 
			; delaying 3 cycles:
			          ldi  R17, $01
			WGLOOP3:  dec  R17
			          brne WGLOOP3
			; ----------------------------- 
			; delaying 1 cycle:
			          nop
			; =========== 
			RET

wait_4mkc:
			; =========== 
			;    delay loop generator 
			;     32 cycles:
			; ----------------------------- 
			; delaying 30 cycles:
			          ldi  R17, $0A
			WGLOOP4:  dec  R17
			          brne WGLOOP4
			; ----------------------------- 
			; delaying 2 cycles:
			          nop
			          nop
			; =========== 
			RET


LED_blink:

			SBI 	PORTD,5		; ???. ????????? ?? PORTD.5 (??? PINBoard)
			CALL 	wait_05
			CBI		PORTD,5		; ????. ????????? ?? PORTD.5 (??? PINBoard)
			CALL 	wait_05
			RET
Файл протеуса ниже.
Что не так?
Вложения
LCD.rar
(26.72 КБ) 178 скачиваний
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Если тебе нужен просто рабочий код, то лови проект но на си.
Вложения
Watch.rar
(918.57 КБ) 189 скачиваний
Реклама
Ответить

Вернуться в «Периферия»