#define tASD 1
#define tASL 1
#define tASED 1
#define tCS 1
#define tAHL 1
#define tASED 1
#define PWEH 1
#define tDDR 1
#define tDHR 1
#define FRQ_DISABLED 0
#define FRQ_256HZ 1
#define FRQ_128HZ 1
#define AS 13
#define DS 4
#define RW 3
//#define CS 0
#define RESET 2
char buspins [] = {5,6,7,8,9,10,11,12};
int pincount = sizeof(buspins);
byte curstate = 0xFF;
byte newstate = curstate;
int BusMode = 0xFF;
void switchBusMode(int mode) {
if(BusMode!=mode) {
if(mode == OUTPUT) {
DDRD = 0xFF;
} else {
DDRD = 0;
}
BusMode=mode;
}
}
void setBusData(byte data) {
PORTD = data;
}
byte getBusData() {
byte result = PIND;
return result;
}
void resetSignals() {
//Init state: AS:0; DS:0; R/W|: 0; CS|: 1; AD0-7: 0
//digitalWrite(CS, HIGH);
digitalWrite(AS, LOW);
digitalWrite(DS, HIGH);
digitalWrite(RW, HIGH);
setBusData(0);
switchBusMode(OUTPUT);
delay(1);
}
void initControlSignals() {
digitalWrite(RESET, LOW);
resetSignals();
pinMode(RESET, OUTPUT);
//pinMode(CS, OUTPUT);
pinMode(AS, OUTPUT);
pinMode(DS, OUTPUT);
pinMode(RW, OUTPUT);
delay(300);
digitalWrite(RESET, HIGH);
}
void startDevice() {
}
char hexToChar(byte *ptr, int size) {
char result = 0;
for(int i=0; i<size; i++) {
result = result << 4;
if(ptr[i]>='A' && ptr[i]<='F') {
result = result + ptr[i] - 'A'+10;
} else if(ptr[i]>='a' && ptr[i]<='f') {
result = result + ptr[i] - 'a'+10;
} else if(ptr[i]>='0' && ptr[i]<='9') {
result = result + ptr[i] - '0';
}
}
return result;
}
byte readInput(byte old) {
byte buf[64];
int count = Serial.available();
byte result = old;
if(count) {
int toRead = min(64,count);
Serial.readBytes(buf,toRead);
result = hexToChar(buf, toRead-1);
}
return result;
}
void testOutput() {
switchBusMode(OUTPUT);
if(newstate != curstate) {
setBusData(newstate);
curstate = newstate;
}
newstate = readInput(curstate);
}
void testInput() {
switchBusMode(INPUT);
Serial.println(getBusData(),HEX);
}
void writeData(byte addr, byte data) {
}
byte readData(byte addr) {
byte result = 0;
digitalWrite(RW, HIGH);
digitalWrite(DS, HIGH);
delay(tASD);
digitalWrite(AS, HIGH);
setBusData(addr); //AS0-7 set addres value
delay(tASL);
digitalWrite(AS, LOW); //AS > 0 after PWASH 60ns and tASL 30ns
delay(tAHL);
switchBusMode(INPUT);
delay(tASED);
digitalWrite(DS, LOW);
delay(PWEH);
result = getBusData();
delay(tDDR);
digitalWrite(DS, HIGH);
delay(tDHR);
/*restor bus signals to default*/
resetSignals();
return result;
}
void testDSread() {
byte addr = readInput(0);
Serial.print("Reading from:");
Serial.print(addr,HEX);
Serial.print("\t");
Serial.println(readData(addr));
}
void setup() {
// put your setup code here, to run once:
//setBus(false,curstate);
//setBusData(curstate);
//Serial.begin(115200);
//Serial.println("Start!");
startDevice();
DDRD = 0xFF;
PORTD = 0xF3;
}
void loop() {
delay(1000);
// data output test
//testOutput();
// data input test
//testInput();
// DS read test
//testDSread();
}