Wednesday, August 19, 2020

ATMega32 SN74HC164 Three-Digit Multiplexing Display

Multiplexing Display could be driven form controller digital output pins without any additional memory chips. However it needs at least one digital output port. In this example, I use two SN74HC164 shift register chip to store seven-segment display data, and drive each commons. It makes a multiplexing 7-Segment display that use only three micro-controller digital output pins.

For more example of using SN74HC164 chip you can check these links:

  1. ATMega32 Interfaces To SN74HC164 Shift Registers
  2. ATMega32 SPI Interfaces To SN74HC164 And LED 
  3. ATMega32 SPI Interfaces To SN74HC164 And LCD Using 3 Pins
  4. ATMega32 SN74HC164 Seven Segments Display And Switch Interfacing
  5. ATMega32 And SN74HC164 Serial Seven Segment Display

There's an input button to count the number of input pulse. It's active low input. Optionally, I use a signal source with the frequency around 5Hz as an input signal instead of push button.

ATMega32 SN74HC164 Three-Digit Multiplexing Display

Simulating Program

Controller's clock frequency is 4Mhz. It's the internal RC oscillator without additional components.

The program activate each digits before it reset the registers to refresh display data without conflicting the display output.

  1. /*
  2.  * SN74HC164MUX.c
  3.  *
  4.  * Created: 7/10/2023 2:01:24 PM
  5.  * Author : Admin
  6.  */
  7.  
  8. #include <avr/io.h>
  9.  
  10. #define F_CPU 4000000UL
  11. #include <util/delay.h>
  12.  
  13. #define SW4 4
  14. #define nRST 5
  15. #define SDAT 7
  16. #define SCLK 6
  17.  
  18. void send74hc164(unsigned char data){
  19. for(int i=0; i<8;i++){
  20. if ((data&(1<<7))==0)
  21. {
  22. PORTC&=~(1<<SDAT);
  23. }
  24. else PORTC|=(1<<SDAT);
  25. PORTC|=(1<<SCLK);
  26. for(int i=0;i<=25;i++);
  27. PORTC&=~(1<<SCLK);
  28. for(int i=0;i<=25;i++);
  29. data<<=1;
  30. }
  31. }
  32.  
  33. void nMr(void){
  34. PORTC&=~(1<<nRST);
  35. //for(int i=0;i<10;i++);
  36. PORTC|=(1<<nRST);
  37. //for(int i=0;i<10;i++);
  38. }
  39.  
  40. unsigned char cCathode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
  41. 0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  42. //unsigned char cAnode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
  43. //0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  44.  
  45. int main(void)
  46. {
  47. unsigned char count = 0;
  48. DDRC|=(1<<SDAT)|(1<<SCLK)|(1<<nRST);
  49. DDRC&=~(1<<SW4);
  50. PORTC|=(1<<nRST)|(1<<SW4);
  51. while (1)
  52. {
  53. if ((PINC&(1<<SW4))==0)
  54. {
  55. _delay_ms(50);
  56. count++;
  57. }
  58. send74hc164(0b11111110);
  59. send74hc164(cCathode[count/100]);
  60. _delay_ms(10);
  61. nMr();
  62.  
  63. send74hc164(0b11111101);
  64. send74hc164(cCathode[(count%100)/10]);
  65. _delay_ms(10);
  66. nMr();
  67.  
  68. send74hc164(0b11111011);
  69. send74hc164(cCathode[count%10]);
  70. _delay_ms(10);
  71. nMr();
  72. }
  73. }
  74.  
  75.  

 Click here to download its source file.



No comments:

Post a Comment