Wednesday, August 19, 2020

ATMega32 And SN74HC164 Serial Seven Segment Display

We can cascade the SN74HC164 chip to make a serial display with any numbers of digit. There are some more example of using this type of shift registers chip,

  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.

In this example, I use three registers connecting with individual seven-segment display. I use an input connects to PC5 to count external pulse.

ATMega32 And SN74HC164 Serial Seven Segment Display
Simulating Program

 I wrote a C program to make software bit-banging that send serial data to shift registers. 

  1. /*
  2.  * SN74HC164SerialSD.c
  3.  *
  4.  * Created: 7/9/2023 1:20:09 PM
  5.  * Author : Admin
  6.  */
  7.  
  8. #include <avr/io.h>
  9.  
  10. #define SW1 5
  11. #define SDAT 7
  12. #define SCLK 6
  13.  
  14. void send74hc164(unsigned char data){
  15. for(int i=0; i<8;i++){
  16. if ((data&(1<<7))==0)
  17. {
  18. PORTC&=~(1<<SDAT);
  19. }
  20. else PORTC|=(1<<SDAT);
  21. PORTC|=(1<<SCLK);
  22. for(int i=0;i<=50;i++);
  23. PORTC&=~(1<<SCLK);
  24. for(int i=0;i<=50;i++);
  25. data<<=1;
  26. }
  27. }
  28.  
  29. const unsigned char cCathode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
  30. 0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  31. /*
  32. unsigned char cAnode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,
  33. 0x83,0xC6,0xA1,0x86,0x8E};
  34. */
  35. int main(void)
  36. {
  37. unsigned int newData = 0, oldData = 0xFF;
  38. /*SW1 For Input Button*/
  39. DDRC&=~(1<<SW1);
  40. /*Set SW1 Pin High*/
  41. PORTC|=(1<<SW1);
  42. /*Serial Data And Serial Clock Output To SN74HC164*/
  43. DDRC|=(1<<SDAT)|(1<<SCLK);
  44. while (1)
  45. {
  46. if((PINC&(1<<SW1)) == 0){
  47. newData++;
  48. //while((PINC&(1<<SW1))==0);
  49. for(int i = 0; i <= 150; i++)
  50. for(int i = 0; i <= 1000; i++);
  51. if(newData > 999) newData = 0;
  52. }
  53.  
  54. if (newData != oldData)
  55. {
  56. send74hc164(cCathode[newData%10]);
  57. send74hc164(cCathode[(newData%100)/10]);
  58. send74hc164(cCathode[newData/100]);
  59. oldData = newData;
  60. }
  61. }
  62. }
  63.  
  64.   

Click here to download zip file of this example.



No comments:

Post a Comment