{"id":3323,"date":"2026-10-13T11:32:45","date_gmt":"2026-10-13T10:32:45","guid":{"rendered":"https:\/\/www.robertprice.co.uk\/robblog\/?p=3323"},"modified":"2026-10-13T11:32:45","modified_gmt":"2026-10-13T10:32:45","slug":"rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014","status":"publish","type":"post","link":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/","title":{"rendered":"RC2026 &#8211; Part 1 &#8211; Using a SPI LED Matrix from a RC2014"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">For the 2026 <a href=\"https:\/\/www.retrochallenge.org\/p\/entrants-list-202610.html\">RetroChallenge<\/a> I am exploring using SPI devices from a Z80 based <a href=\"https:\/\/rc2014.co.uk\/\">RC2014 computer<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first device I want to use is an <a href=\"https:\/\/link.amazon\/B02RkcjbF\">8&#215;8 LED matrix<\/a> (Amazon affilate link). Shelia Dixon has previously developed an <a href=\"https:\/\/z80kits.com\/shop\/8x8-led-matrix-display-module\/\">8&#215;8 LED matrix display module for the RC2014<\/a>, however this is directly interfaced to the RC2014 using two IO ports. I will be using a single port and communicating with it by bit banging the SPI protocol.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MAX7219 LED Matrix<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The 8&#215;8 LED matrix I&#8217;m using is a <a href=\"https:\/\/www.analog.com\/media\/en\/technical-documentation\/data-sheets\/max7219-max7221.pdf\">MAX7219<\/a> to handle the SPI communication and control the LEDs. It uses 5 wires from the RC2014<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>VCC &#8211; +5V<\/li>\n\n\n\n<li>GND<\/li>\n\n\n\n<li>CS &#8211; Chip Select &#8211; This is active low<\/li>\n\n\n\n<li>CLK &#8211; Clock &#8211; Data is loaded when the clock goes from low to high<\/li>\n\n\n\n<li>DIN &#8211; Data In &#8211; 1 bit of data<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m using the <a href=\"https:\/\/smallcomputercentral.com\/rcbus\/sc100-series\/sc129-digital-i-o-rc2014\/\">SC129 Digital IO module from Small Computing Central<\/a> on the RC2014 for the digital output. This provides pins suitable for dupont connectors. You could use the official RC2014 Digital IO module, but you would have to modify it to add connections. In this case, it&#8217;s simplier to use the SC129 module. The SC129 is connected to the LED matrix module as follows&#8230;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>SC129<\/strong><\/td><td><strong>MAX7219 LED Matrix module<\/strong><\/td><\/tr><tr><td>+5V<\/td><td>VCC<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><tr><td>OUT D0<\/td><td>DIN<\/td><\/tr><tr><td>OUT D1<\/td><td>CLK<\/td><\/tr><tr><td>OUT D2<\/td><td>CS<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The MAX7219 gives us this iming diagram to follow when we want to send it data.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-timing.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"402\" src=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-timing-1024x402.png\" alt=\"\" class=\"wp-image-3337\" srcset=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-timing-1024x402.png 1024w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-timing-300x118.png 300w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-timing-767x301.png 767w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-timing-1200x471.png 1200w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-timing.png 1360w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So to send data, we need to first take the CS line low. This tells activates the MAX7219 and it knows to listen for incoming data. Next we set DIN and take CLK high. This will load the single bit of data on DIN into the MAX7219. Now we take CLK low in preparation for the next bit to be sent. We repeat this 8 times in total to send a byte of data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The MAX7219 expects two bytes of data to be sent each message. The first byte is an address, the second byte is the data value.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-data.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"80\" src=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-data-1024x80.png\" alt=\"MX7219 address and data\" class=\"wp-image-3343\" srcset=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-data-1024x80.png 1024w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-data-300x23.png 300w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-data-757x59.png 757w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-data-1200x94.png 1200w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-data.png 1360w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Sending SPI data using the Z80<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">So how do we do this on the Z80? Well first we&#8217;re going to define some constants to help.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The SC129 is using IO Port 1.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OUTPUT_PORT     EQU $01<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">As we said earlier, the Data bit is D0, the Clock is D1, and the Select line is D2. We call the Data bit MOSI, which stands for Master Out Slave In. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MOSI            EQU %00000001\nCLK             EQU %00000010\nSELECT          EQU %00000100<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">As you can see, we&#8217;re using binary to define the location. When we want to set the bit in one of these positions we can use an OR statement, and when we want to clear the bit we can AND the Compliment (the inverse).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So to enable the MAX7219 we want the SELECT line to be low, the CLK line to be low, and we will take MOSI high. We can use the following Z80 subroutine to do this.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>select_max7219:\n    ld a, 0 &amp; ~SELECT &amp; ~CLK | MOSI\n    out (OUTPUT_PORT),a\n    ret<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To disable the MAX7219 we want the SELECT line to be high, the CLK line to be low, and we will take MOSI high.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>deselect_max7219:\n    ld a, 0 | SELECT &amp; ~CLK | MOSI\n    out (OUTPUT_PORT),a\n    ret<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To send a byte, need to send 8 bits of data. We pass the byte we want to send in the d register. To send a bit of data we know we need to take SELECT and CLK low. We can prepare this and save it to the e register to reuse each bit. We are going to be shifting data into the MOSI bit, so before we save it to e, we shift it to the right. Now for each bit we want to send, first load the a register with the value of the cached e restier. We then pick up the next bit from the d register by shifting d to the left. This pushes the bit we want to send into the carry flag. We retrieve it by shifting the a register to the left so it sets the value of the carry flag into the MOSI bit. We send this, before ORing the CLK bit to take it high, and sending that.<br><br>That was quite a wordy explaination, but here&#8217;s the code so hopefully it makes more sense.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>transmit_max7219_byte:\n    push bc\n    ld b, 8\n    ld a, 0 &amp;~SELECT &amp;~CLK | MOSI\n    rra\n    ld e, a\n.transmit_max7219_bit:\n    ld a, e\n    rl d\n    rla  \n    out (OUTPUT_PORT), a\n    or a, CLK\n    out (OUTPUT_PORT), a\n    djnz .transmit_max7219_bit\n    pop bc\n    ret<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To send a two byte instruction to the MAX7219 is expecting we need combine the subroutines we&#8217;ve built. We need to select the MAX7219, send two bytes, then deselect it. We&#8217;ll pass the two bytes in registers b and c.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>max7219_write:\n    call select_max7219\n    call transmit_max7219\n    call deselect_max7219\n    ret\n\ntransmit_max7219:\n    ld d, b\n    call transmit_max7219_byte\n    ld d, c\n    call transmit_max7219_byte\n    ret<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Controlling the MAX7219 using SPI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To tell the MAX7219 to turn on or off a LED we send a column address in one byte, and the column data in the next. So 8 columns of bits. However, we also need to send some additional command codes so the MAX7219 knows how to behave. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-registers.png\"><img loading=\"lazy\" decoding=\"async\" width=\"670\" height=\"782\" src=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-registers.png\" alt=\"\" class=\"wp-image-3351\" srcset=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-registers.png 670w, https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-registers-257x300.png 257w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A full list of commands can be found in the <a href=\"https:\/\/www.analog.com\/media\/en\/technical-documentation\/data-sheets\/max7219-max7221.pdf\">MAX7219 datasheet.<\/a> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The MAX7219 can interface with 7 segment displays, but we don&#8217;t want any of this functionality, so we need to tell it not to decode any incoming display commands. We also want to make sure it is running on a low duty cycle to reduce power usage. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These are the commands I use to initalise the display.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    ld bc, 0x0C00       ; shutdown mode, this ensures the LEDs are off.      \n    call max7219_write\n    ld bc, 0x0900       ; no decoding\n    call max7219_write\n    ld bc, 0x0A01       ; 3\/32 intensity\n    call max7219_write\n    ld bc, 0x0B07       ; scan all 7 columns\n    call max7219_write\n    ld bc, 0x0F00       ; No display test\n    call max7219_write<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once setup we can send the image. We send the column number in register b, and the column data in register c. So to send a cross I can use the following.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    ld hl, cross\n    ld b, 8\n.send_image:\n    ld c, (hl)\n    inc hl\n    call max7219_write\n    djnz .send_image<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>cross:\n    dc %00000000\n    dc %01000010\n    dc %00100100\n    dc %00011000\n    dc %00011000\n    dc %00100100\n    dc %01000010\n    dc %00000000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Finally I turn the display on.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    ld bc, 0x0C01       ; normal operation - turn on the display         \n    call max7219_write<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Building, deploying, and running on the RC2014<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To assemble the code I&#8217;m using the <a href=\"https:\/\/z00m128.github.io\/sjasmplus\/documentation.html\">SjASMPlus Z80 assembler<\/a> on my Macbook Pro. The RC2014 is running <a href=\"https:\/\/smallcomputercentral.com\/small-computer-monitor\/small-computer-monitor-v1-0\/\">SCM<\/a>, so to transfer the assembled code, I need to convert it into Intel hex before sending it across. I use <a href=\"https:\/\/github.com\/z88dk\/z88dk\/wiki\/Tool---appmake\">z88dk-appmake<\/a> to do this. Once across, I run the application using the &#8220;g&#8221; command in SCM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So to assemble my matrix.s source code to address $9000 and send it to my RC2014 using the serial device at \/dev\/tty.usbmodem03591, I would use the following. First, I would make sure I am connected to the RC2014 over serial using the following&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>% minicom -c on --device \/dev\/tty.usbmodem03591<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Next I would open another Terminal shell, and run the following&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>% sjasmplus matrix.s --raw=matrix.z80 \n% z88dk-appmake +hex --org 0x9000 -b matrix.z80\n% cat matrix.ihx > \/dev\/tty.usbmodem03591<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Going back to minicom, I execute the code using the following&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>g 9000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This will run the transmitted code, and my image will appear on the LED matrix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post I show how to use the SPI protocol from Z80 assembly language so an RC2014 computer can control a MAX7219 LED matrix.<\/p>\n","protected":false},"author":1,"featured_media":3357,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[209,187],"tags":[211,117,213,119],"class_list":["post-3323","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rc2026","category-retrochallenge","tag-max7219","tag-rc2014","tag-spi","tag-z80"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>RC2026 - Part 1 - Using a SPI LED Matrix from a RC2014 - Robert Price<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RC2026 - Part 1 - Using a SPI LED Matrix from a RC2014 - Robert Price\" \/>\n<meta property=\"og:description\" content=\"In this post I show how to use the SPI protocol from Z80 assembly language so an RC2014 computer can control a MAX7219 LED matrix.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/\" \/>\n<meta property=\"og:site_name\" content=\"Robert Price\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-13T10:32:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-RC2014.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"rob\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rob\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/\"},\"author\":{\"name\":\"rob\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"headline\":\"RC2026 &#8211; Part 1 &#8211; Using a SPI LED Matrix from a RC2014\",\"datePublished\":\"2026-10-13T10:32:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/\"},\"wordCount\":1046,\"image\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/MAX7219-RC2014.jpg\",\"keywords\":[\"MAX7219\",\"RC2014\",\"SPI\",\"Z80\"],\"articleSection\":[\"RC2026\",\"RetroChallenge\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/\",\"name\":\"RC2026 - Part 1 - Using a SPI LED Matrix from a RC2014 - Robert Price\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/MAX7219-RC2014.jpg\",\"datePublished\":\"2026-10-13T10:32:45+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/MAX7219-RC2014.jpg\",\"contentUrl\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/assets\\\/MAX7219-RC2014.jpg\",\"width\":1024,\"height\":768,\"caption\":\"MAX7219 connected to an RC2014\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RC2026 &#8211; Part 1 &#8211; Using a SPI LED Matrix from a RC2014\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#website\",\"url\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/\",\"name\":\"Robert Price\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.robertprice.co.uk\\\/robblog\\\/#\\\/schema\\\/person\\\/fac6d5b076e0e14e1fb13e15b542a6c5\",\"name\":\"rob\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g\",\"caption\":\"rob\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"RC2026 - Part 1 - Using a SPI LED Matrix from a RC2014 - Robert Price","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/","og_locale":"en_GB","og_type":"article","og_title":"RC2026 - Part 1 - Using a SPI LED Matrix from a RC2014 - Robert Price","og_description":"In this post I show how to use the SPI protocol from Z80 assembly language so an RC2014 computer can control a MAX7219 LED matrix.","og_url":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/","og_site_name":"Robert Price","article_published_time":"2026-10-13T10:32:45+00:00","og_image":[{"width":1024,"height":768,"url":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-RC2014.jpg","type":"image\/jpeg"}],"author":"rob","twitter_card":"summary_large_image","twitter_misc":{"Written by":"rob","Estimated reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/#article","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/"},"author":{"name":"rob","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"headline":"RC2026 &#8211; Part 1 &#8211; Using a SPI LED Matrix from a RC2014","datePublished":"2026-10-13T10:32:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/"},"wordCount":1046,"image":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/#primaryimage"},"thumbnailUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-RC2014.jpg","keywords":["MAX7219","RC2014","SPI","Z80"],"articleSection":["RC2026","RetroChallenge"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/","url":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/","name":"RC2026 - Part 1 - Using a SPI LED Matrix from a RC2014 - Robert Price","isPartOf":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/#primaryimage"},"image":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/#primaryimage"},"thumbnailUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-RC2014.jpg","datePublished":"2026-10-13T10:32:45+00:00","author":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5"},"breadcrumb":{"@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/#primaryimage","url":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-RC2014.jpg","contentUrl":"https:\/\/www.robertprice.co.uk\/robblog\/assets\/MAX7219-RC2014.jpg","width":1024,"height":768,"caption":"MAX7219 connected to an RC2014"},{"@type":"BreadcrumbList","@id":"https:\/\/www.robertprice.co.uk\/robblog\/rc2026-part-1-using-a-spi-led-matrix-from-a-rc2014\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.robertprice.co.uk\/robblog\/"},{"@type":"ListItem","position":2,"name":"RC2026 &#8211; Part 1 &#8211; Using a SPI LED Matrix from a RC2014"}]},{"@type":"WebSite","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#website","url":"https:\/\/www.robertprice.co.uk\/robblog\/","name":"Robert Price","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.robertprice.co.uk\/robblog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.robertprice.co.uk\/robblog\/#\/schema\/person\/fac6d5b076e0e14e1fb13e15b542a6c5","name":"rob","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6f0eb511179100a4e968abc70403e33686e6ab3e992e392bedd2ccac01da666c?s=96&d=mm&r=g","caption":"rob"}}]}},"_links":{"self":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/3323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/comments?post=3323"}],"version-history":[{"count":14,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/3323\/revisions"}],"predecessor-version":[{"id":3359,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/posts\/3323\/revisions\/3359"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/media\/3357"}],"wp:attachment":[{"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/media?parent=3323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/categories?post=3323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robertprice.co.uk\/robblog\/wp-json\/wp\/v2\/tags?post=3323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}