#define clock_delay 10
//PROGRAM TO DISPLAY ETAL on TOP display by entering from left and 1234 at bottom display entering from right simultaneoulsy
//GLOBAL DECLARATION
volatile uint8_t *outa;
volatile uint8_t address=0x01,store=0x00;
volatile uint8_t dum=0x00,dum2=0x00;
volatile long i,j,k,m,n;
void setup() {
// put your setup code here, to run once:
volatile uint8_t *dira;
dira=0x21;*dira=0xff;
outa=0x22;
for(m=0;m<32;m++){
for(k=0;k<8;k++){
display_2();
display_1();
}
dum=0x00;dum2=0x00;
for(j=0;j<100000;j++);
}
}
void loop() {
// put your main code here, to run repeatedly:
}
void display_1(){
volatile uint8_t arr_pattern[]={0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00};
volatile uint8_t arr_pattern2[]={0x38,0x44,0x04,0x08,0x10,0x20,0x7c,0x00};
volatile uint8_t arr_pattern3[]={0x38,0x44,0x04,0x18,0x04,0x44,0x38,0x00};
volatile uint8_t arr_pattern4[]={0x08,0x18,0x28,0x48,0x7c,0x08,0x08,0x00};
*outa&=~0x02;
if(m>=24){
//display4
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
//data transfer for right to left
if(m<=31){
dum=arr_pattern[k]>>(31-m);
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
}
if(m>=16){
//display3
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
//data transfer for right to left
if(m<=22){
dum=arr_pattern[k]>>(23-m);
}
//data transfer from left to right
else{
dum=arr_pattern[k]<<(m-23);
if(m<=31){
dum2=arr_pattern2[k]>>(31-m);
dum=dum|dum2;
}
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
}
if(m>=8){
//display2
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
//data transfer for right to left
if(m<=14){
dum=arr_pattern[k]>>(15-m);
}
//data transfer from left to right
else{
dum=arr_pattern[k]<<(m-15);
if(m<=23){
dum2=arr_pattern2[k]>>(23-m);
dum=dum|dum2;
}
else{
dum=arr_pattern2[k]<<(m-23);
if(m<=31){
dum2=arr_pattern3[k]>>(31-m);
dum=dum|dum2;
}
}
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
}
//display1
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
//data transfer for right to left
if(m<=7){
dum=arr_pattern[k]>>(7-m);
}
//data transfer from left to right
else{
dum=arr_pattern[k]<<(m-7);
if(m<=15){
dum2=arr_pattern2[k]>>(15-m);
dum=dum|dum2;
}
else{
dum=arr_pattern2[k]<<(m-15);
if(m<=23){
dum2=arr_pattern3[k]>>(23-m);
dum=dum|dum2;
}
else{
dum=arr_pattern3[k]<<(m-23);
if(m<=31){
dum2=arr_pattern4[k]>>(31-m);
dum=dum|dum2;
}
}
}
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x01;
else *outa&=~0x01;
*outa|=0x04;
for(j=0;j<clock_delay;j++);
*outa&=~0x04;
}
*outa|=0x02;
}
void display_2(){
volatile uint8_t arr_pattern[]={0x7c,0x40,0x40,0x78,0x40,0x40,0x7c,0x00};
volatile uint8_t arr_pattern2[]={0x7c,0x10,0x10,0x10,0x10,0x10,0x10,0x00};
volatile uint8_t arr_pattern3[]={0x38,0x44,0x44,0x7c,0x44,0x44,0x44,0x00};
volatile uint8_t arr_pattern4[]={0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00};
*outa&=~0x10;
//display1
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
//data transfer for left to right
if(m<=7){
dum=arr_pattern4[k]<<(7-m);
}
//data transfer from right to left
else{
dum=arr_pattern4[k]>>(m-7);
if(m<=15){
dum2=arr_pattern3[k]<<(15-m);
dum=dum|dum2;
}
else{
dum=arr_pattern3[k]>>(m-15);
if(m<=23){
dum2=arr_pattern2[k]<<(23-m);
dum=dum|dum2;
}
else{
dum=arr_pattern2[k]>>(m-23);
if(m<=31){
dum2=arr_pattern[k]<<(31-m);
dum=dum|dum2;
}
}
}
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
//3 displays zeroes
if(m<8){
for(j=0;j<3;j++){
address=0x01;
address=address+k;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
for(n=0;n<8;n++){
*outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
}
}
else{
//display2
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
//data transfer for left to right
if(m<=14){
dum=arr_pattern4[k]<<(15-m);
}
//data transfer from right to left
else{
dum=arr_pattern4[k]>>(m-15);
if(m<=23){
dum2=arr_pattern3[k]<<(23-m);
dum=dum|dum2;
}
else{
dum=arr_pattern3[k]>>(m-23);
if(m<=31){
dum2=arr_pattern2[k]<<(31-m);
dum=dum|dum2;
}
}
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
}
//2 displays zeroes
if(m<16){
for(j=0;j<2;j++){
address=0x01;
address=address+k;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
for(n=0;n<8;n++){
*outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
}
}
else{
//display3
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
//data transfer for left to right
if(m<=22){
dum=arr_pattern4[k]<<(23-m);
}
//data transfer from right to left
else{
dum=arr_pattern4[k]>>(m-23);
if(m<=31){
dum2=arr_pattern3[k]<<(31-m);
dum=dum|dum2;
}
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
}
//1 displays zeroes
if(m<24){
address=0x01;
address=address+k;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
for(n=0;n<8;n++){
*outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
}
else{
//display4
//address
address=0x01;
address=address+k;;
for(i=7;i>=0;i--){
store=(address>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
//data transfer for left to right
if(m<=31){
dum=arr_pattern4[k]<<(31-m);
}
//data transmission
for(i=7;i>=0;i--){
store=(dum>>i)&0x01;
if(store)*outa|=0x08;
else *outa&=~0x08;
*outa|=0x20;
for(j=0;j<clock_delay;j++);
*outa&=~0x20;
}
}
*outa|=0x10;
}