This article tells how to output data to VGA monitor using controller PIC18. This controller is not quite well for tasks like this, but this example shows that it isn't impossible. This program was written in 2004, and it is introduced here just for describe principles of "VGA game with PIC18" project.
Source code is here: terminal.rar
Specification:
Text screen resolution | 30x30 chars |
Graphics resolution | 240x480 pixels |
Char size | 8x16 pixels |
Colors | 15 |
Cursor emulating | Yes. |
Char set | English, Russian |
Interface | SPI, up to 250 kbits per second |
There are two limitations:
Here is demo mode generated screen. (Ptogram was written in 2004, and demo-screen function was added just now for demonstration purpose):
VGA monitor is controlled by 5 wires:
Syncronization wires used to tell to monitor when frame started and how march frames per second. Analog wires used to specify color of every pixel on the screen. The higher voltage on wire brings the brighter color. By combinating different voltage levels on three RGB wires we can gen different colors (e.g. when generating simmilar levels for red and green wires and zero level for blue wire, we will get yellow color).
The picture on the sreen is drawed line by line from the top to the bottom. Each line drown left to right. When line fully drown, horisontal synchronization pulse will be generated (HSYNC) to tell to monitor that next part of information should be drown at next line. When all lines are drown, verlical sinchronization pulse (VSYNC) will be generated to tell to monitor that frame is over and next information should be outputed from the top of the screen.
Frame rate must be greater than 60 Hz to prevent blinking. In standart VGA-mode each frame consist of 525 lines. 480 of them contain picture, and other contain top and bottom borders and blank lines for vertical sinchro (they have not color information). Each line is splitted at several parts: video information, left and right borders, horisontal blanking pulse.
The lenght of line = 1s /60 frames / 525 lines = 31.75 us.
Here is a picture dscribing data transfer to VGA:
(not finished, see page in russian)
(not finished, see page in russian)