#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t bits_type;
//defines IOs
#define CFG_SHIFT_DDR DDRD
#define CFG_SHIFT_PORT PORTD
#define CFG_SHIFT_SRCLK PD3 //arduino pin 3 for Clock
#define CFG_SHIFT_RCLK PD4 //arduino pin 4 for Latch
#define CFG_SHIFT_SER PD2 //arduino pin 2 for Data
//number of pins in the shift register
#define CFG_SHIFT_REGISTER_PIN_COUNT 8
void shift_bits_init(void);
void shift_bits_out(bits_type b, size_t len);
//void LCDinit();
//void LCDprint(char _line, char _string[16]);
void shift_bits_init(void)
{
CFG_SHIFT_DDR |= _BV(CFG_SHIFT_RCLK)
| _BV(CFG_SHIFT_SRCLK)
| _BV(CFG_SHIFT_SER);
}
void shift_bits_out(bits_type b, size_t len)
{
CFG_SHIFT_PORT &= ~_BV(CFG_SHIFT_RCLK);
for (size_t i = 0; i < CFG_SHIFT_REGISTER_PIN_COUNT; i++){
CFG_SHIFT_PORT &= ~_BV(CFG_SHIFT_SRCLK);
if(i < len && (b & ((bits_type)1 << i)))
CFG_SHIFT_PORT |= _BV(CFG_SHIFT_SER);
CFG_SHIFT_PORT |= _BV(CFG_SHIFT_SRCLK);
CFG_SHIFT_PORT &= ~_BV(CFG_SHIFT_SER);
}
CFG_SHIFT_PORT |= _BV(CFG_SHIFT_RCLK);
}
void LCDSendByte(char d,char RS)
{
char dH,dL,temp;
//Keep Data on upper nybble
dH = d & 0xF0; //Get MSB
dL = d & 0x0F;
dL = d << 4; //Get LSB
//Send MSB with E=clock
temp=0;
temp=dH | RS | 0x02; //MSB With RS+E bit
shift_bits_out(temp, 8);
//Send MSB with E=0
temp=0;
temp=dH | RS; //MSB With RS bit
shift_bits_out(temp, 8);
//Send LSB with E=clock
temp=0;
temp=dL | RS | 0x02; //MSB With RS+E bit
shift_bits_out(temp, 8);
//Send LSB with E=0
temp=0;
temp=dL | RS; //MSB With RS bit
shift_bits_out(temp, 8);
}
void LCDInit()
{
int count;
char t[] = {0x43,0x03,0x03,0x02,0x28,0x01,0x0C,0x06,0x02,0x02};
for(count = 0; count <=9; count ++)
{
LCDSendByte(t[count],0); //command=0;
}
}
void LCDPrint(char line, char string[16])
{
int len,count;
if(line==0){
LCDSendByte(0x80,0); //RS = 0 Move Cursor to home
}
else{
LCDSendByte(0xC0,0); //RS = 0 Move Cursor to Second Line
}
len = strlen(string);
for(count=0;count<len;count++)
{
LCDSendByte(string[count],1);
}
}
int main()
{
shift_bits_init();
LCDInit();
_delay_ms(1000);
while(1)
{
LCDPrint(0, "Hello There");
LCDPrint(1, "was hard !");
_delay_ms(500);
}
return 0;
}