I've code shift register and decade counter to display a 8x8 led matrix. The bits seem to be off by 1 bit, e.g I expect them to go from row-1, column-1 to r-2,c-2 but the mid part, i.e. r-1,c-2 is also lighting.
/* * free_lance_2.c * * Created: 23-05-2020 11:23:32 * Author: Chirag Goyal */ #include <avr/io.h> #define F_CPU 16000000UL #include<util/delay.h> #define reg_port PORTD #define reg_data PD7 #define reg_clock PD1 #define reg_latch PD5 #define data_high() (reg_port|=(1<<reg_data)) #define data_low() (reg_port&=~(1<<reg_data)) #define cd_en PD2 #define cd_clk PD3 #define cd_rst PD4 #define del 1 void reg_pulse() //to pulse the shift register { reg_port|=(1<<reg_clock); reg_port&=~(1<<reg_clock); } void reg_store() //to store the data { reg_port|=(1<<reg_latch); _delay_ms(del); reg_port&=~(1<<reg_latch); _delay_ms(del); } void counter_init() { reg_port&=~(1<<cd_en); reg_port&=~(1<<cd_rst); } void reg_write(unsigned char x) { for(unsigned char i=0;i<8;i++) { if(x&0b10000000) data_high(); else data_low(); reg_pulse(); x=x<<1; } reg_store(); } void counter() { reg_port|=(1<<cd_clk); _delay_ms(del); reg_port&=~(1<<cd_clk); //_delay_ms(del); } int main(void) { DDRD=0xff; unsigned char c[8]={0b00000000,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111,0b10111111,0b00000000}; unsigned char d[8]={0b00000000,0b11111101,0b11111011,0b11110111,0b11110111,0b11111011,0b11111101,0b00000000}; counter_init(); while(1) { //TODO:: Please write your application code for(unsigned char k=0;k<48;k++) for(unsigned char j=0;j<8;j++) { reg_write(c[j]); counter(); //_delay_ms(1); } for(unsigned char k=0;k<48;k++) for(unsigned char j=0;j<8;j++) { reg_write(d[j]); counter(); //_delay_ms(1); } } }
In the attachments, I've printed N and M.