If you’re trying to compile the source code with the Keil compiler, you’re probably getting error messages about ‘undefined identifier’ or similar. This is because the standard Keil reg52.h header file doesn’t define all the necessary identifiers for the STC89C5x chips.
We need to define the special function register (sfr)
P4 = 0xE8;
so the code can access bits of the fourth GPIO port and then define the special bit (sbit)
INT2 = P4^3;
so that the code can react to the infra red photodiode that is connected to that pin. It seems that the best way to include these extra hardware definitions is to edit and save the standard reg52.h file. Here’s my modified version: reg52.h
Timer 2 interrupt
The bottom line of the display is handled in a slightly different way. The idea is that the current rotation rate (measured inside the timer 1 interrupt) is used to calculate the settings for timer 2 so that the timer2 interrupt occurs 256 times per revolution. Then from inside the timer2 interrupt code we just have to output the next set of 8 pixels to each of the ports that control the lower set of 8 LEDS on the arms.
Timer 2 has a 16-bit counter and an interrupt is generated when it counts up to FFFF. To get 256 interrupts per turn, we count the number of ticks per turn from interrupt 1 and work out 3/4 of that value. This is subtracted from FFFF to get the ‘start’ count.
Inside the timer 2 interrupt we count how many interrupts actually occur and use this to tweak the timer 2 start count slightly so that the 256 pulses eventually synchronize and stay in register with the infra red photodiode pulse. If 256 or more pulses occurred in the last revolution the start value is tweaked slightly lower so that the interrupts during the next revolution happen slightly slower – and vice versa if 255 or fewer pulses occurred.
With the comments in the code that should enable you to modify the code for your own applications. Be aware that the free version of the Keil compiler limits the compiled code size (to 2K, I think) so the full program here won’t produce a hex file. But if you trim the program down to only work the clock on the upper row or only scroll a limited amount of text on the lower row, then you can get it to fit within 2K.
For an individual just writing code for fun, the Keil licence costs way too much: if you want to write larger programs you have to use one of the free alternatives to the Keil compiler – which are a little more tricky to set up and get working.
Edit: 2022-May-5. Rather late, I know, especially as the clock kit seems to be no longer available, but I’ve been playing with newer versions of the STC microcontrollers (notably the STC8A8K64S4A12, which is cheap, but a blindingly fast powerhouse) and installed the latest version of SDCC under Linux Mint, so I have an open-source way of compiling 8051 code without hitting the Keil 2K limit. I edited the source code for the POVclock (with the Dickens scrolling text on the bottom line) so that it compiles with SDCC, and uploads using the stcgal uploader. If the file is named POVclockSDCC.c then compile with:
sdcc –mmcs51 –std-c99 POVclockSDCC.c
Upload the hex (.ihx) file with:
The source code that compiles with a standard install of sdcc is here: https://ceptimus.co.uk/POVclockSDCC.c
Main differences were to change the include to <8052.h>, add some double-underscores in front of the keywords code, interrupt, using, bit (sbit), add the definitions for P4, INT2, and T2MOD to the c file (instead of modifying the standard header file), adding a few initializers = 0 to keep the compiler happy about not using variables before they were initialized, and putting some static qualifiers on the interrupt edge detection ‘snapshot’ bits. That got it to compile to a hex file without errors or warnings (and actually work). I’m using the latest version of sdcc at the time of writing sdcc -v
gives 4.2.0 but I think it should work with whatever older versions of sdcc come with your distro: just use whatever package manager your distro has and install sdcc and stcgal.