; File Name C750DSP.ASM ; Single Message, Moving Message Display ; *************** USE METALINKS (( ASM51.EXE )) TO ASSEMBLE ***************** ; ; ************ THIS ASSEMBLER WILL CREATE A ( HEX ) FILE ************** ; 0B0H = PORT3 DIRECT ADDRESS D_BUS DATA 0B0H ; data bus ( PORT 3 ) ; 90H = PORT 1 DIRECT ADDRESS A_BUS DATA 90H ; address bus ( PORT 1 ),A0=P1.0,A1=P1.1,A2=P1.2 ; 80H.0 = PORT 0 BIT 0 ( PORT0 BIT ADDRESS ) WR BIT 80H.0; WR signal. to write to display A_BUS,data must be stable, ; then WR is brought LOW, data is written on LOW to HIGH ; transition of WR. so we then bring WR to HIGH to write. ; PORT 0 BIT 1 DIRECT BIT ADDRESS A3 BIT 80H.1; clear for brightness set, then set and leave set. ; to set brightness send the following out to the data D_BUS. ; MSD-LSD 0=100% 1=80% 2=53% 3=40% 4=27% 5=20% 6=13% 7=blank RST BIT 80h.2; Display Reset ;*************************************************************************** ;* FIRMWARE For Control Of The HDSP-2112 Display * ;* A MOVING MESSAGE DISPLAY * ;* FOR THE PHILLIPS 87C750 MICROCONTROLLER * ;*************************************************************************** org 0 ; Establish Reset Vector at 0 ; Routine to Reset Display on Power-Up clr D_BUS.7; Enable Display clr RST ; Reset & Clear Display setb wr acall delay2 ; No Read or Write for at least 3 clock cycles ; after Reset & Clear setb RST ; Hold RST High for remainder of program ; Set Display Brightness bright: clr a3 ; clr A3 to setup for brightness set mov D_BUS,#7; data to blank display clr wr ; WR=LOW setb wr ; WR=HIGH, data written to display on LOW to HIGH mov D_BUS,#6; 13% brightness clr wr setb wr setb a3 ; transition of WR pin, then we leave A3 set for the ; remainder of the program, as it is ONLY used to ; tell the display we want to set BRIGHTNESS. count: mov r7,#4 ; Load R7 with the number of times+1 you want your ; message to be displayed before power down. ; a 4 here will play the message 3 times etc... count2: djnz r7,load ; Decrement counter, if not=zero goto load ajmp power_down ; else power down. load: mov dptr,#message-1 ; load message address -1 begin: mov r0,#20h; beginning RAM address for storage + manipulation mov r5,#8 ; #8=indicator of how many DIGITS the HDSP-2112 has mov a,#20h ; ASCII equivalent of a BLANK space on display. ramclr: mov @r0,a ; load ASCII BLANKS in display RAM inc r0 ; increment to next RAM address djnz r5,ramclr ; if we havent BLANKED out 8 address's keep going fetch: acall getchr ; RAM BLANK done , get first character to be diplayed halt: jz count2 ; if return value in ACC = decimal 0 start over mov r5,#8 ; number of display DIGITS available on HDSP-2112 mov r0,#20h; load beginning RAM address doit: xch a,@r0 ; SWAP ACC data with display RAM data inc r0 ; increment to next RAM address djnz r5,doit; check if END of RAM location, if not keep going mov r0,#20h; again load first RAM address mov r4,#7 ; address to select first digit ; ( far right ) on display acall msgout ; send message digit to display ajmp fetch ; return to routine FETCH. msgout: clr d_bus.7; re-enable display mov r5,#8 ; load number of digits our display has for use. ; notice here with R5 holding the starting value ; of 8, that this allows the routine MSGOUT1 to ; decrement R4 8 times. R4 originally holds the ; address for digit #8, or the ( RIGHT MOST ) ; digit on our display. By decrementing R4 ; we move the display digit ( ADDRESS ) from ; digit to digit. ; or from digit 8 to digit 1, from RIGHT TO LEFT ; as seen facing the display. ;NOTE: ( IF WE CHANGE R5 TO 7 THE DISPLAY WILL SCROLL ; TO DIGIT 2 THE SECOND FROM THE LEFT FACING THE ; DISPLAY ). msgout1: mov a,r4 ; load digit address for display digit selection mov A_BUS,a ; select digit position on display dec r4 ; 1st digit=7 ( right side of display ) decrement for mov a,@r0 ; next, then load ACC with data to display. mov D_BUS,a ; move data to display clr wr ; WRITE STROBE for display setb wr ; write data to display on LOW to HIGH transition inc r0 ; increment RAM pointer to next data digit for display djnz r5,msgout1 ; if not=8 total digits keep going acall delay2 ; delay to prevent JERKY look between digit updates. ; and to set our display ( SCROLL SPEED ). ret ; return to calling routine. getchr: inc dptr ; increment DPTR to point to next display digit clr a ; location ( MESSAGE ADDRESS ) in CODE space. movc a,@a+dptr; move CODE ( MESSAGE ) digit pointed to by ret ; ACC+DPTR too ACC, and return to calling routine. power_down: mov 87h,#2 ; Set bit "PD" of the PCON Special Function Register ; This will cause the controller to Power Down. ; routine DELAY2 sets the SCROLL SPEED, and will prevent a JERKY APPEARANCE ; between display digit updates. by changing the value first loaded into ; R1 in the first line to a lower number the scroll speed is faster, and by ; changing it to a higher number the scroll speed will be slower. delay2: mov r1,#2 delay3: mov r2,#00h delay4: mov r3,#00h delay5: djnz r3,delay5 djnz r2,delay4 djnz r1,delay3 ret nop ; the number 0 will indicate the END of our message. message: db ' Merry Christmas..............,' db ' And A Happy New Year..........',0 END