The Max7456 from Maxim is a monochrome video overlay chip. With this you can overlay text and simple graphics over your PAL or NTSC video signal. You can also use it with no overlay, just like a simple monitor.
Included in this sample is a tutorial how you cam make your own characters with my converter tool. This tool converts the Maxim mcm files to Bascom data lines.
Syntax
Videotext string, y , x
Remarks
String |
String to be displayd |
y |
Constant or variable with y position. |
x |
Constant or variable with x position. |
There are some controle characters implanted to controle (part of) the string.
Ascii 133=start blinking text, 134= stop blinking text
Ascii 131=enable the background, 132= disable the background
Ascii 135=invert text, 136= non-inverted text
In Bascom it’s easy to use this with {133} option, like:
Videotext “{133}Flashing text{134}”, 9 , 0
Syntax
Rowbrightness row, brightness
Remarks
Row |
Row number to change 1-13 for NTSC , 1-16 for PAL |
Brightness |
&B0000xx11 Character Black Level in % of OSD white level
00 = 0% 01 = 10% 10 = 20% 11 = 30%
&B000011xx Character White Level in % of OSD white level
00 = 120% 01 = 100% 10 = 90% 11 = 80% |
Syntax
Writecustomcharacter Characters
Remarks
Characters |
Number of characters theat need to be programmed in the VRAM |
Because the max7456 has NVM memory (eeprom) the writecustomercharacter routine only needs to be used one’s. The custom characters wil be left in the NVM memory even after power lost.
Downloads
Sample Bascom code , same as below
Maxim’s evaluation kit software , needed to edit the character table
Converter tool , to convert the mcm file.
Converter manual
Source code of the converter tool in VB6
And for the people who want to take it a step further, here a nice site (In German language) where is showed how to make your own graphics.
Update: 2009-03-24, Bug in the Bascom code and in the Converter tool, both fixed .
-Bascom: Max7456 was disabled in the Writecustomcharacter sub routine, but not enabled at the end of the sub.
-Converter tool: loops in exportarray was counting to 56 instead of 54, removed the loops and made fixed lines.
Example:
'=================================================
'= MAX7456 Video overlay Demo =
'= By EvertDekker.com 2009 =
'= Created with Bascom-Avr: 1.11.9.3.001 license =
'= No copyright for private use =
'= Version 1.1 =
'=================================================
$regfile = "m128def.DAT"
$crystal = 7372800
$baud = 19200
$hwstack = 75
$swstack = 75
$framesize = 50
Config Spi = Hard , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 0 'Setup the hardware spi
Spiinit 'Init the spi bus
'=== Dimension ===
Dim Temp As Byte , Lus As Byte
Dim Regaddr As Byte
Dim Regdata As Byte
Dim Buffer(2) As Byte
Declare Sub Initmax7456()
Declare Sub Videotext(byval Text As String , Byval Ypos As Byte , Byval Xpos As Byte)
Declare Sub Writereg(byval Regaddr As Byte , Byval Regdata As Byte)
Declare Sub Rowbrightness(byval Row As Byte , Byval Brightness As Byte)
Declare Sub Writecustomcharacter(byval Characters As Byte)
'=== Const ===
Const Vm0 = &H00 'Video mode 1
Const Vm1 = &H01 'Video mode 2
Const Hos = &H02 'Horizontal Offset
Const Vos = &H03 'Vertical Offset
Const Dmm = &H04 'Display Memory Mode
Const Dmah = &H05 'Display Memory Address High
Const Dmal = &H06 'Display Memory Address Low
Const Dmdi = &H07 'Display Memory Data In
Const Cmm = &H08 'Character Memory Mode
Const Cmah = &H09 'Character Memory Address High
Const Cmal = &H0A 'Character Memory Address Low
Const Cmdi = &H0B 'Character Memory Data In
Const Osdm = &H0C 'Osd Insertion Mux
Const Osdbl = &H6C 'OSD Black Level
Const Readreg = &H80 'Read register = register + &H80
Const Status_read = &HA0 'Status register
Const True = 1
Const False = 0
'=== Main ===
Initmax7456 'Init the Max7456
Waitms 100
Writecustomcharacter 3 'Write the customcharacters to the MAX7456 NVM, this has only need to be done one's. This line and data can be removed after that.
Do
Videotext "HELLO WORLD" , 1 , 8 'Demo of the various possibilitys
Videotext "MAX7456 Video overlay" , 3 , 3
Videotext "Code written with Bascom-avr" , 4 , 0
Videotext "By Evertdekker.com" , 5 , 5
Videotext "{133}Flashing text{134}" , 9 , 0 '{133}=start blinking text, {134}= stop blinking text
Videotext "{131}WITH BACKGROUND{132}" , 10 , 0 '{131}=enable the background, {132}= disable the background
Videotext "{135}Inverted TEXT{136}" , 11 , 0 '{135}=invert text, {136}= non-inverted text
Videotext "Adjust rowbrightness" , 12 , 0
Videotext "INCLUDE CUSTOM CHARS: + " , 7 , 0
'Rowbrightness 12 , &B00001111 'Change the row brightness, see the SUB for the usage discription
Wait 5
Loop
End
'=== Subroutines===
Sub Initmax7456()
Writereg Vm0 , &B01001100
'01001000 ; 0 , 1=PAL, 00=Auto Sync, 1=Enable OSD, 0=Enable OSD always, 0=SW Reset, 0=Enable Video Buffer
Writereg Vm1 , &B01111111
'00010100 ; 0 = NA, 001=Background MODE Brightness 7%, 11=Blinking Time 160ms, 00=Blinking Duty Cycle BT:BT
Writereg Dmm , &B01000000
'01000000 ; 0=NA, 1=8bit operation,
Writereg Hos , &B00011111
'00011111 ; 00=NA, 00000000 = Farthest left (-32 pixels),00100000 = No horizontal offset, 00111111 = Farthest right (+31 pixels)
Writereg Vos , &B00010000
'00010000 ; 000=NA, 00000000 = Farthest up (+16 pixels), 00010000 = No vertical offset, 00011111 = Farthest down (-15 pixels)
End Sub
Sub Videotext(byval Text As String , Byval Ypos As Byte , Byval Xpos As Byte)
Local Charcount As Byte , Tempstring As String * 1 , Tempbyte As Byte , Position As Word , Chars As Byte , Controlcharcount As Byte , Attribute As Byte
Controlcharcount = 0 : Attribute = 0 'Set the local variable to zero
Charcount = Len(text) - 1 'Count the number of characters in the string minus, because we must start at 0
For Chars = 0 To Charcount 'do the loop as much as there are characters
Position = Ypos * 30 'Position where the characters must be showed 30=characters per line
Position = Position + Xpos 'Position + the xpos
Position = Position + Chars 'Position + the charactercount that's handled this loop
Position = Position - Controlcharcount 'There was a controle charater, deduct from the charactercount because it must not be handled as real character
Regdata = High(position) 'Put the highbyte of position in the regdatabuffer
Writereg Dmah , Regdata 'Write the data to the register
Regdata = Low(position) 'Put the lowbyte of position in the regdatabuffer
Writereg Dmal , Regdata 'Write the data to the register
Tempbyte = Chars + 1 'Need the character position from the textstring
Tempstring = Mid(text , Tempbyte , 1) 'Take out 1 character that we need to handle now
Tempbyte = Asc(tempstring) 'Get the ascii value of this character
If Tempbyte < 130 Then 'Character larger then 130 are controle characters
Tempbyte = Tempbyte - 32 'Max7456 character table starts at &H00, so deduct 32 to get it even with the ascii table
Regdata = Lookup(tempbyte , Characterslookup) 'Lookup the character from the datatable
Writereg Dmdi , Regdata 'Write the data to the DisplayMemory register
Else
Incr Controlcharcount 'It's a controle character, increase the counter
If Tempbyte = 131 Then Set Attribute.7 'Set the local background bit in the character attribute
If Tempbyte = 132 Then Reset Attribute.7 'Reset the local background bit
If Tempbyte = 133 Then Set Attribute.6 'Set the blink bit
If Tempbyte = 134 Then Reset Attribute.6 'Reset the blink bit
If Tempbyte = 135 Then Set Attribute.5 'Set the inverse bit
If Tempbyte = 136 Then Reset Attribute.5 'Reset the inverse bit
End If
Regdata = High(position) 'Put the highbyte of position in the regdatabuffer
Regdata = Regdata Or &B00000010 'Set bit1 for the character attribute
Writereg Dmah , Regdata 'Write the data to the register
Regdata = Low(position) 'Put the lowbyte of position in the regdatabuffer
Writereg Dmal , Regdata 'Write the data to the register
Writereg Dmdi , Attribute 'Write the attribute to the DisplayMemory register
Next Carcount
End Sub
Sub Writecustomcharacter(byval Characters As Byte)
Local Count As Byte
Restore Customcharacter 'Goto the begin of the data
For Count = 1 To Characters 'Number of characters that need to be programmed, must match with the characters in the data
Writereg Vm0 , &B01000100 'Disable osd
Read Regdata 'Read the first databyte, is the character to will be programmed
Writereg Cmah , Regdata 'Write to the register
For Lus = 0 To 53 'Each Character is made of 54bytes
Writereg Cmal , Lus 'Write the byteno of the character
Read Regdata 'Read the data from the datatable
Writereg Cmdi , Regdata 'program the data in the shadowram
Next Lus
Writereg Cmm , &HA0 'Copy shadowram to NVram
Waitms 200 'Wait until copy is ready
Next Count
Writereg Vm0 , &B01001100 'enable osd
End Sub
Sub Rowbrightness(byval Row As Byte , Byval Brightness As Byte)
If Brightness > &B00001111 Then Brightness = &B00001111 'B0000xx11 Character Black Level in % of OSD white level 00 = 0% 01 = 10% 10 = 20% 11 = 30%
Regaddr = &H10 + Row 'B000011xx Character White Level in % of OSD white level 00 = 120% 01 = 100% 10 = 90% 11 = 80%
Regdata = Brightness
Writereg Regaddr , Regdata
End Sub
Sub Writereg(byval Regaddr As Byte , Byval Regdata As Byte)
Buffer(1) = Regaddr 'Put both bytes in the array
Buffer(2) = Regdata
Spiout Buffer(1) , 2 'Shift the array out the SPI
End Sub
Characterslookup:
'Convert the ascii table to the Max7456 table. (Not excist) are characters that are not in the MAX7456 table and will show a ? (&H42)
Data &H00 '32 Space
Data &H42 '33 ! (not excist)
Data &H48 '34 ""
Data &H42 '35 # (not excist)
Data &H42 '36 $ (not excist)
Data &H42 '37 % (not excist)
Data &H42 '38 & (not excist)
Data &H47 '39 '
Data &H3F '40 (
Data &H40 '41 )
Data &H42 '42 * (not excist)
Data &H50 '43 + (not excist)
Data &H45 '44 ,
Data &H49 '45 -
Data &H41 '46 .
Data &H47 '47 /
Data &H0A '48 0
Data &H01 '49 1
Data &H02 '50 2
Data &H03 '51 3
Data &H04 '52 4
Data &H05 '53 5
Data &H06 '54 6
Data &H07 '55 7
Data &H08 '56 8
Data &H09 '57 9
Data &H44 '58 :
Data &H43 '59 ;
Data &H4A '60 <
Data &H42 '61 = (not excist)
Data &H4B '62 >
Data &H42 '63 ?
Data &H4C '64 @
Data &H0B '65 A
Data &H0C '66 B
Data &H0D '67 C
Data &H0E '68 D
Data &H0F '69 E
Data &H10 '70 F
Data &H11 '71 G
Data &H12 '72 H
Data &H13 '73 I
Data &H14 '74 J
Data &H15 '75 K
Data &H16 '76 L
Data &H17 '77 M
Data &H18 '78 N
Data &H19 '79 O
Data &H1A '80 P
Data &H1B '81 Q
Data &H1C '82 R
Data &H1D '83 S
Data &H1E '84 T
Data &H1F '85 U
Data &H20 '86 V
Data &H21 '87 W
Data &H22 '88 X
Data &H23 '89 Y
Data &H24 '90 Z
Data &H42 '91 [ (not excist)
Data &H42 '92 \ (not excist)
Data &H42 '93 ] (not excist)
Data &H42 '94 ^ (not excist)
Data &H42 '95 Underscore (not excist)
Data &H42 '96 ` (not excist)
Data &H25 '97 a
Data &H26 '98 b
Data &H27 '99 c
Data &H28 '100 d
Data &H29 '101 e
Data &H2A '102 f
Data &H2B '103 g
Data &H2C '104 h
Data &H2D '105 i
Data &H2E '106 j
Data &H2F '107 k
Data &H30 '108 l
Data &H31 '109 m
Data &H32 '110 n
Data &H33 '111 o
Data &H34 '112 p
Data &H35 '113 q
Data &H36 '114 r
Data &H37 '115 s
Data &H38 '116 t
Data &H39 '117 u
Data &H3A '118 v
Data &H3B '119 w
Data &H3C '120 x
Data &H3D '121 y
Data &H3E '122 z
Data &H42 '123 { (not excist)
Data &H42 '124 | (not excist)
Data &H42 '125 } (not excist)
Data &H42 '126 ~ (not excist)
Customcharacter:
'Total of 3 characters in this datatable
Data &H50 ' Character 80
Data &H55, &H55, &H55, &H55, &H55, &H55, &H55, &H00
Data &H15, &H54, &HAA, &H85, &H52, &HAA, &HA1, &H52
Data &HA0, &HA8, &H52, &H85, &H28, &H02, &H80, &H41
Data &H2A, &HAA, &H15, &H2A, &HAA, &H15, &H42, &H80
Data &H55, &H2A, &HAA, &H15, &H2A, &HAA, &H01, &H02
Data &H85, &H28, &H52, &HA0, &HA8, &H52, &HAA, &HA1
Data &H54, &HAA, &H85, &H55, &H00, &H15
Data &H51 ' Character 81
Data &H55, &H55, &H55, &H55, &H55, &H55, &H55, &H55
Data &H55, &H55, &H56, &H55, &H55, &H56, &H55, &H55
Data &H56, &H55, &H6A, &HAA, &HAA, &H55, &H5A, &H55
Data &H55, &H66, &H55, &H55, &H66, &H55, &H55, &H96
Data &H55, &H55, &H96, &H55, &H56, &H56, &H55, &H59
Data &H56, &H55, &H65, &H56, &H55, &H55, &H56, &H55
Data &H55, &H5A, &H55, &H55, &H55, &H55
Data &H52 ' Character 82
Data &H55, &H55, &H55, &H55, &H55, &H55, &H55, &H55
Data &H55, &H55, &H59, &H55, &H55, &H59, &H55, &H55
Data &H59, &H55, &H6A, &HAA, &HAA, &H55, &H59, &H56
Data &H55, &H59, &H56, &H55, &H65, &H56, &H55, &H65
Data &H56, &H55, &H65, &H56, &H55, &H95, &H56, &H55
Data &H95, &H56, &H56, &H55, &H56, &H56, &H55, &H56
Data &H59, &H55, &H69, &H55, &H55, &H55