Monday, August 17, 2020

ATMega32 SN74HC164 Seven Segments Display And Switch Interfacing

In previous post I made some example of interfacing with the SN74HC164 parallel output shift registers chip. They are,

  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.

In this example, I will use this chip to drive a single common cathode seven-segment display. I will use an additional input button to increase counting variable. It will count up to 0x0F before it rolls down.

ATMega32 SN74HC164 Seven Segments Display And Switch Interfacing
Some 7-Segment Display

ATMega32 SN74HC164 Seven Segments Display And Switch Interfacing

Simulating Program

 

I use software bit-banging to make serial data transmission to the SN74HC164 chip.

  1. /*
  2.  * SN74HC164SD.c
  3.  *
  4.  * Created: 7/8/2023 6:44:00 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. unsigned char cCathode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  30. 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  31. //unsigned char cAnode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  32. //0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  33. int main(void)
  34. {
  35. unsigned char newData = 0, oldData = 0xFF;
  36. /*SW1 For Input Button*/
  37. DDRC&=~(1<<SW1);
  38. /*Set SW1 Pin High*/
  39. PORTC|=(1<<SW1);
  40. /*Serial Data And Serial Clock Output To SN74HC164*/
  41. DDRC|=(1<<SDAT)|(1<<SCLK);
  42. while (1)
  43. {
  44. if((PINC&(1<<SW1)) == 0){
  45. newData++;
  46. //while((PINC&(1<<SW1))==0);
  47. for(int i = 0; i <= 150; i++)
  48. for(int i = 0; i <= 1000; i++);
  49. if(newData > 0x0F) newData = 0;
  50. }
  51.  
  52. if (newData != oldData)
  53. {
  54. send74hc164(cCathode[newData]);
  55. oldData = newData;
  56. }
  57. }
  58. }
  59.  
  60.  

 

Click here to download zip file of this example.

No comments:

Post a Comment