 ; ******************************************** ; Function : LCD字符顯示+KEY按鍵處理示例程序 * ; MicroProcessor : HT48R50A-1/28SKDIP-A * ; Author: www.picavr.com * ; Crystal : 4MHz * ; ******************************************** #INCLUDE HT48R50A-1.INC LCD_DATA EQU PC LCD_DATA_CTRL EQU PCC LCD_CTRL EQU PB LCD_CTRL_CTRL EQU PBC E EQU 1 RS EQU 0 ;------------------------------------------------------------ DATA .SECTION AT 60H 'DATA' DELAY_COUNTER_1 DB ? ;[60H] DELAY_COUNTER_2 DB ? ;[61H] DELAY_COUNTER_3 DB ? ;[62H] DATA DB ? ;[63H] COUNTER DB ? ;[64H] ;------------------------------------------------------------ CODE .SECTION AT 00H 'CODE' ORG 00H JMP START ORG 0CH JMP TIMER1 ORG 20H START: MOV A,01111111B MOV PAC,A CALL LCD_RESET MOV A,OFFSET LCD_MESSAGE_1 MOV TBLP,A CALL LCD_DISPLAY MOV A,09H MOV INTC,A MOV A,80H MOV TMR1C,A FIRST_TIME: MOV A,PA AND A,00010000B SUB A,00010000B SZ ACC JMP FIRST_TIME PRESS_ANY_KEY: MOV A,OFFSET LCD_MESSAGE_2 MOV TBLP,A CALL LCD_DISPLAY ANY_KEY: MOV A,PA AND A,00010000B SUB A,00010000B SZ ACC JMP ANY_KEY MOV A,PA AND A,00001111B MOV DATA,A SUB A,09H SZ ACC JMP NEXT_CHECK JMP START NEXT_CHECK: MOV A,DATA SUB A,08H SZ ACC JMP PLAY_MONOTONY JMP PLAY_A_SONG PLAY_MONOTONY: CALL MONOTONY JMP ANY_KEY PLAY_A_SONG: MOV A,OFFSET LCD_MESSAGE_3 MOV TBLP,A CALL LCD_DISPLAY CLR COUNTER PLAY_LOOP: MOV A,OFFSET SONG_DATA ADD A,COUNTER MOV TBLP,A TABRDL DATA DEC DATA CALL MONOTONY INC COUNTER MOV A,COUNTER SUB A,4BH SZ ACC JMP PLAY_LOOP JMP PRESS_ANY_KEY RET ;------------------------------------------------------------ TIMER1: CPL PA RETI ;------------------------------------------------------------ MONOTONY PROC MOV A,OFFSET MUSIC_DATA ADD A,DATA MOV TBLP,A TABRDL DATA MOV A,DATA MOV TMR1L,A MOV A,TBLP ADD A,08H MOV TBLP,A TABRDL DATA MOV A,DATA MOV TMR1H,A SET TMR1C.4 CALL DELAY_LONG CLR TMR1C.4 RET MONOTONY ENDP ;------------------------------------------------------------ LCD_RESET PROC CLR LCD_DATA_CTRL CLR LCD_CTRL_CTRL CLR LCD_DATA CLR LCD_CTRL MOV A,00110011B ;STEP 0 MOV DATA,A ;LCD RESET CALL TRANSFER ; MOV A,00110010B ;SETP 1 MOV DATA,A ;FUNCTION SET CALL TRANSFER ; MOV A,00001100B ;STEP 2 MOV DATA,A ;DISPLAY TURN ON CALL TRANSFER ; MOV A,00000001B ;STEP 3 MOV DATA,A ;DISPLAY CLEAN CALL TRANSFER ; CALL DELAY ;DELAY SOME TIME MOV A,00000110B ;STEP 4 MOV DATA,A ;ENTRY MODE SET CALL TRANSFER ; RET LCD_RESET ENDP ;------------------------------------------------------------ LCD_DISPLAY PROC MOV A,10000000B ;STEP 1 MOV DATA,A ;DD RAM ADDRESS SET CALL TRANSFER ;FIRST LINE MOV A,10H ;STEP 2-1 MOV COUNTER,A ;WRITE DATA TO DD RAM FIRST_LINE: CLR LCD_CTRL.RS MOV A,00011100B ;STEP 2-2 MOV DATA,A ;DISPLAY/CURSOR CALL TRANSFER ;SHIFT SET LCD_CTRL.RS TABRDL DATA CALL TRANSFER CALL DELAY INC TBLP SDZ COUNTER JMP FIRST_LINE CLR LCD_CTRL.RS MOV A,11000000B ;STEP 3 MOV DATA,A ;DD RAM ADDRESS SET CALL TRANSFER ;SECOND LINE MOV A,10H ;STEP 4-1 MOV COUNTER,A ;WRITE DATA TO DD RAM SECOND_LINE: CLR LCD_CTRL.RS MOV A,00011000B ;STEP 4-2 MOV DATA,A ;DISPLAY/CURSOR CALL TRANSFER ;SHIFT SET LCD_CTRL.RS TABRDL DATA CALL TRANSFER CALL DELAY INC TBLP SDZ COUNTER JMP SECOND_LINE CLR LCD_CTRL.RS RET LCD_DISPLAY ENDP ;------------------------------------------------------------ TRANSFER PROC SWAP DATA MOV A,DATA MOV PC,A CALL WRITE SWAP DATA MOV A,DATA MOV PC,A CALL WRITE RET TRANSFER ENDP ;------------------------------------------------------------ WRITE PROC SET LCD_CTRL.E CLR LCD_CTRL.E MOV A,0FFH MOV DELAY_COUNTER_1,A WRITE_WAIT: SDZ DELAY_COUNTER_1 JMP WRITE_WAIT RET WRITE ENDP ;------------------------------------------------------------ DELAY PROC MOV A,0A0H MOV DELAY_COUNTER_1,A MOV DELAY_COUNTER_2,A DELAY_WAIT: SDZ DELAY_COUNTER_2 JMP DELAY_WAIT SDZ DELAY_COUNTER_1 JMP DELAY_WAIT RET DELAY ENDP ;------------------------------------------------------------ DELAY_LONG PROC MOV A,003H MOV DELAY_COUNTER_1,A MOV DELAY_COUNTER_2,A MOV DELAY_COUNTER_3,A DELAY_LONG_WAIT: SDZ DELAY_COUNTER_3 JMP DELAY_LONG_WAIT SDZ DELAY_COUNTER_2 JMP DELAY_LONG_WAIT SDZ DELAY_COUNTER_1 JMP DELAY_LONG_WAIT RET DELAY_LONG ENDP ;------------------------------------------------------------ ORG 0F00H LCD_MESSAGE_1: ;[LCD 4 BITS DATA ] ;[TRANSFER TEST OK] DC 4CH,43H,44H,20H,34H,20H,42H,49H DC 54H,53H,20H,44H,41H,54H,41H,20H DC 54H,52H,41H,4EH,53H,46H,45H,52H DC 20H,54H,45H,53H,54H,20H,4FH,4BH LCD_MESSAGE_2: ;[ MINI PIANO ] ;[ PRESS ANY KEY! ] DC 20H,20H,20H,4DH,49H,4EH,49H,20H DC 50H,49H,41H,4EH,4FH,20H,20H,20H DC 20H,50H,52H,45H,53H,53H,20H,41H DC 4EH,59H,20H,4BH,45H,59H,21H,20H LCD_MESSAGE_3: ;[ PLAY MUSIC ] ;[ JUST A MOMENT! ] DC 20H,20H,20H,50H,4CH,41H,59H,20H DC 4DH,55H,53H,49H,43H,20H,20H,20H DC 20H,4AH,55H,53H,54H,20H,41H,20H DC 4DH,4FH,4DH,45H,4EH,54H,21H,20H MUSIC_DATA: DC 043H,0B1H,009H,033H DC 083H,0C7H,005H,023H DC 0FCH,0FCH,0FDH,0FDH DC 0FDH,0FDH,0FEH,0FEH SONG_DATA: DC 06H,06H,05H,06H,05H,03H DC 05H,03H,03H,02H,03H,03H DC 02H,02H,01H,02H,02H,05H DC 05H,03H,03H,02H,03H,03H DC 06H,06H,05H,06H,05H,03H DC 04H,04H,04H,03H,02H,03H,03H DC 05H,05H,05H,05H,05H,07H DC 06H,06H,06H,06H,05H,06H,06H DC 08H,08H,08H,07H,05H DC 06H,06H,06H,06H,05H,06H,05H,03H DC 05H,05H,05H,05H,05H,07H DC 06H,06H,06H,06H,05H,06H ;------------------------------------------------------------ END
|