// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name : step_test
// Author : PulseRain Technology LLC & STEP FPGA
// Description : This program is developed by Arduino IDE, runninng on the STEP-MAX10 board embedded a FP51-1T MCU core.
// Web : www.stepfpga.com https://www.pulserain.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2018/03/20 |
// --------------------------------------------------------------------
//
#include "M10PWM.h"
#include "M10SevenSeg.h"
#define LCD_CSR_CMD 0
#define LCD_CSR_DAT 1
#define LCD_CSR_RST 2
static void lcd_write_cmd (uint8_t data) __reentrant
{
LCD_CSR = LCD_CSR_CMD;
LCD_DATA = data;
nop_delay (5);
while(LCD_CSR == 0);
}
static void lcd_write_dat (uint8_t data) __reentrant
{
LCD_CSR = LCD_CSR_DAT;
LCD_DATA = data;
nop_delay (5);
while(LCD_CSR == 0);
}
static void lcd_reset () __reentrant
{
LCD_CSR = LCD_CSR_RST;
delay(50);
LCD_CSR = 0;
delay(50);
}
static void lcd_init() __reentrant
{
lcd_reset();
lcd_write_cmd (0x11);
delay(50);
lcd_write_cmd(0xB1);
lcd_write_dat(0x05);
lcd_write_dat(0x3C);
lcd_write_dat(0x3C);
lcd_write_cmd(0xB2);
lcd_write_dat(0x05);
lcd_write_dat(0x3C);
lcd_write_dat(0x3C);
lcd_write_cmd(0xB3);
lcd_write_dat(0x05);
lcd_write_dat(0x3C);
lcd_write_dat(0x3C);
lcd_write_dat(0x05);
lcd_write_dat(0x3C);
lcd_write_dat(0x3C);
lcd_write_cmd(0xB4); //Column inversion
lcd_write_dat(0x03);
lcd_write_cmd(0xC0);
lcd_write_dat(0x28);
lcd_write_dat(0x08);
lcd_write_dat(0x04);
lcd_write_cmd(0xC1);
lcd_write_dat(0xC0);
lcd_write_cmd(0xC2);
lcd_write_dat(0x0D);
lcd_write_dat(0x00);
lcd_write_cmd(0xC3);
lcd_write_dat(0x8D);
lcd_write_dat(0x2A);
lcd_write_cmd(0xC4);
lcd_write_dat(0x8D);
lcd_write_dat(0xEE);
lcd_write_cmd(0xC5); //VCOM
lcd_write_dat(0x1A);
lcd_write_cmd(0x36); //MX, MY, RGB mode
lcd_write_dat(0xC0);
lcd_write_cmd(0xe0);
lcd_write_dat(0x04);
lcd_write_dat(0x22);
lcd_write_dat(0x07);
lcd_write_dat(0x0a);
lcd_write_dat(0x2e);
lcd_write_dat(0x30);
lcd_write_dat(0x25);
lcd_write_dat(0x2a);
lcd_write_dat(0x28);
lcd_write_dat(0x26);
lcd_write_dat(0x2e);
lcd_write_dat(0x3a);
lcd_write_dat(0x00);
lcd_write_dat(0x01);
lcd_write_dat(0x03);
lcd_write_dat(0x13);
lcd_write_cmd(0xe1);
lcd_write_dat(0x04);
lcd_write_dat(0x16);
lcd_write_dat(0x06);
lcd_write_dat(0x0d);
lcd_write_dat(0x2d);
lcd_write_dat(0x26);
lcd_write_dat(0x23);
lcd_write_dat(0x27);
lcd_write_dat(0x27);
lcd_write_dat(0x25);
lcd_write_dat(0x2d);
lcd_write_dat(0x3b);
lcd_write_dat(0x00);
lcd_write_dat(0x01);
lcd_write_dat(0x04);
lcd_write_dat(0x13);
lcd_write_cmd(0x3a);
lcd_write_dat(0x06);
lcd_write_cmd(0x29);
}
void lcd_SetRegion(uint8_t x_start,uint8_t y_start,uint8_t x_end,uint8_t y_end) __reentrant
{
lcd_write_cmd(0x2a);
lcd_write_dat(0x0);
lcd_write_dat(x_start);
lcd_write_dat(0x0);
lcd_write_dat(x_end);
lcd_write_cmd(0x2b);
lcd_write_dat(0x0);
lcd_write_dat(y_start);
lcd_write_dat(0x0);
lcd_write_dat(y_end);
lcd_write_cmd(0x2c);
}
void lcd_write_16bit(uint16_t Data) __reentrant
{
uint8_t t;
t = (Data>>8) & 0xff;
lcd_write_dat(t);
t = Data & 0xff;
lcd_write_dat(t);
}
uint8_t flash_byte_read (uint32_t addr)
{
uint8_t t;
t = (addr >> 24) & 0xff;
FLASH_READ_DATA = t;
t = (addr >> 16) & 0xff;
FLASH_READ_DATA = t;
t = (addr >> 8) & 0xff;
FLASH_READ_DATA = t;
t = addr & 0xff;
FLASH_READ_DATA = t;
nop_delay (10);
FLASH_READ_CSR = 0;
nop_delay (10);
while(FLASH_READ_CSR == 0);
t = FLASH_READ_DATA;
return t;
}
static void single_color()
{
uint8_t i,j,k,t;
const uint8_t x = 128, y = 154;
const uint8_t x_total = 132, y_total = 162;
uint32_t addr = 0x8000;
lcd_SetRegion(0,0,x_total-1,y_total-1);
for (i = 0; i < x_total; ++i) {
for (j = 0; j < y_total; ++j) {
for (k = 0; k < 3; ++k) {
lcd_write_dat(0xff);
}
}
}
lcd_SetRegion((x_total - x) >> 1, (y_total- y) >> 1,x-1 +((x_total - x) >> 1),y-1 + ((y_total- y) >> 1));
for (i=0;i<x;i++) {
for (j=0;j<y;j++) {
// lcd_write_16bit(0x00ff);
// lcd_write_dat (0);
for (k = 0; k < 3; ++k) {
t = flash_byte_read (addr++);
lcd_write_dat(t);
// Serial.print (addr, HEX);
// Serial.write (" ");
// Serial.println(t, HEX);
}
}
}
}
uint8_t old_count = 0;
uint8_t count = 0;
uint32_t big_count = 0;
typedef struct {
void (*init) () __reentrant;
uint8_t (*dataAvailable)() __reentrant;
uint8_t (*read) () __reentrant;
} PS2_STRUCT;
extern const PS2_STRUCT PS2;
//----------------------------------------------------------------------------
// ps2_init()
//
// Parameters:
// None
//
// Return Value:
// None
//
// Remarks:
// call this function to init the PS2 module
//----------------------------------------------------------------------------
static void ps2_init() __reentrant
{
PS2_CSR = 0;
PS2_DATA = 0;
} // End of ps2_init()
//----------------------------------------------------------------------------
// ps2_data_available()
//
// Parameters:
// None
//
// Return Value:
// 1 when there is data in the FIFO
// 0 when FIFO is empty
//
// Remarks:
// call this function to see if there is data in the receiving FIFO
//----------------------------------------------------------------------------
static uint8_t ps2_data_available() __reentrant
{
if (PS2_CSR) {
return 1;
} else {
return 0;
}
} // End of ps2_data_available()
static uint8_t ps2_read() __reentrant
{
uint8_t t;
t = PS2_DATA;
PS2_CSR = 0;
return t;
} // End of ps2_read()
const PS2_STRUCT PS2 = {
.init = ps2_init,
.dataAvailable = ps2_data_available,
.read = ps2_read
};
typedef struct {
void (*reset) () __reentrant;
void (*writeCMD)(uint8_t) __reentrant;
void (*writeDAT) (uint8_t) __reentrant;
} LCD_STRUCT;
const LCD_STRUCT LCD = {
.reset = lcd_reset,
.writeCMD = lcd_write_cmd,
.writeDAT = lcd_write_dat
};
void setup() {
uint8_t t, i;
Serial.begin (115200);
SEVEN_SEG.init();
ROTARY_ENCODER = 0x0;
P3_DIRECTION = 0xFF;
PS2.init();
PWM.resolution (0, 938);
lcd_init();
single_color();
PWM.dutyCycle (0, 255, 0);
Serial.write ("Hello world!");
}
void loop() {
uint8_t t;
// Serial.println (big_count++);
old_count = count;
count = ROTARY_ENCODER;
SEVEN_SEG.byteHex (count);
if (old_count != count) {
PWM.dutyCycle (0, count, 255-count);
}
P3 = (1 << (count >> 5)) - 1;
if (PS2.dataAvailable()) {
t = PS2.read();
if (t == 0xF0) {
Serial.print(t, HEX);
} else {
Serial.println(t, HEX);
}
}
}