9B. পার্শ্ব সহযোগী সংযুক্তিকরণ (Explore interfacing peripherals – Shift Register 74hc595 – eeprom)


8051 Interfacing – Shift Register – eeprom

9.4 8051 ও সিফ্‌ট রেজিস্টারের সংযোগ (8051 Interfacing Shift Register):

ডিজিটাল ইলেক্ট্রনিক্সে সিফ্‌ট রেজিস্টার হল পরস্পর সংযুক্ত কতকগুলি ফ্লিপ-ফ্লপ যেগুলি একই ক্লক পালসে যুক্ত। ফ্লিপ-ফ্লপ গুলির একটির আউটপুট অপরটির ইনপুটের সাথে যুক্ত থাকে। এর ফলে আমরা যে ডাটা বা তথ্য( অবশ্যই 0 বা 1 রূপে) ইনপুটে প্রেরণ করি তা সিফ্‌ট রেজিস্টারের শেষ বিটে প্রকাশ পায় এবং যে সিরিয়াল ডাটা বা তথ্য আমরা প্রেরণ করি তা বিট অ্যারে(array) রূপে ঐ সিফ্‌ট রেজিস্টারের বিভিন্ন পিনের মাধ্যমে আমরা পাই।

আমরা বর্তমান প্রেক্ষাপটে 74HC595 ও 8051 এর সংযোগ সম্বন্ধে আলোচনা করব।

9.4.1 সিফ্‌ট রেজিস্টার 74HC595

Figure 82
  • সিফ্‌ট রেজিস্টার 74HC595 গঠিত একটি 8 বিটের সিরিয়াল ইন, প্যারালাল আউট সিফ্‌ট রেজিস্টার ও একটি 8 বিটের D-টাইপ স্টোরাজ রেজিস্টারের সমন্বয়ে। সিফ্‌ট রেজিস্টারটি 74HC595 এর অন্তর্গত D-টাইপ স্টোরেজ রেজিস্টারকে তথ্য সরবরাহ করে।
  • 74HC595 এর সিফ্‌ট ও স্টোরেজ রেজিস্টার উভয়ের জন্যই পৃথক পৃথক ক্লক পালস সরবরাহ করতে হয়।
  • ডাটা ভা তথ্য সিরিয়ালি 74HC595 এর নির্দিষ্ট পিনের মাধ্যমে সরবরাহ করতে হয় এবং আটটি নির্দিষ্ট পিনের মাধ্যমে ঐ 8 বিটের তথ্য আমরা পেতে পারি।
  • আমরা একাধিক 74HC595 কে ক্রমান্বয়ে ( Cascading) যুক্ত করতে পারি। সিরিয়ালি যে তথ্য ইনপুট করা হয় তা 8 বিট তথ্য রূপে একাধিক 74HC595 মাধ্যমে আমরা ক্রমান্বয়ে পেতে পারি।

Get crazy deals on smartwatches

9.4.2 IC 74HC595 এর পিন ডায়াগ্রামঃ

  • IC 74HC595 হল 16 পিনের একটি সিফট রেজিস্টার IC
  • এর 12 ও 14 নং পিন দুটি যথাক্রমে ক্লক পিন ও ডাটা পিন
  • 8 ও 16 নং পিন দুটি যথাক্রমে গ্রাউন্ড পিন ও পাওয়ার পিন।
  • একাধিক 74HC595 কে পস্পর যুক্ত করার জন্য (Cascading) প্রথম রেজিস্টারের 9 নং পিনটি পরবর্তী রেজিস্টারের 14  নং পিনের সাথে যুক্ত করা হয়।
Figure 83
  • পিন Q0 থেকে Q7 অর্থাৎ পিন 15, 1,‌ 3, ৪, ৫, ৬ ও ৭ 74HC595 এর ডিজিটাল 8 বিট আউটপুটের আটটি পিন নির্দেশ করে।
  • Q7 হল MSB ও Q0 হল LSB
  • 7 সিগমেন্ট ডিসপ্লের a পিন Q7 এর সাথে যুক্ত হয়। অপর পিনগুলি ক্রমান্বয়ে যুক্ত হয়ে h পিনটি Q0 এর সাথে যুক্ত হয়।
  • যদিও 7 সিগমেন্ট ডিসপ্লের পিন a হল LSB এবং h হল MSB, তথাপি সিরিয়াল ইনপুটের সিফ্‌টিঙের জন্য 74HC595 এর MSB Q7 7 সিগমেন্টের a পিনের অনুরূপ হয়।
  • দ্রষ্টব্যঃ MSB – Most Significant Bit, LSB – Least Significant Bit
  • 7 সিগমেন্ট ডিসপ্লের a পিনকে Q0 এর সাথে যুক্ত হবে নাকি Q7 এর সাথে যুক্ত করতে হবে তা একান্তই নির্ভর করছে কিভাবে 74HC595 এ ডাটা প্রেরণ করা হচ্ছে তার উপর।
  • উদাহরণ স্বরূপ B00111111 বা 0x3F বা 0 কে 7 সিগমেন্ট ডিসপ্লেতে দেখানোর জন্য আমাদের এই আট বিটের তথ্যটিকে LSB থেকে শুরু করে 74HC595 তে পাঠাতে হবে।এক্ষেত্রে 74HC595 এর Q7 এ 7 সিগমেন্ট ডিসপ্লের a পিনের সাথে যুক্ত করতে হবে। অপর পিনগুলিও ক্রমান্বয়ে যুক্ত করতে হবে।

Get crazy deals on smartwatches

9.4.3 8051 Interfacing – Shift Register – eeprom 74HC595 এ সিরিয়াল ডাটা প্রেরণ করা এবং আটটি আউটপুট পিনে ক্রমান্বয়ে সেই ডাটা বা তথ্য প্রকাশ করার পদ্ধতিঃ

  1. 74HC595 এর পিন 14 এ তথা ডাটা পিনে তথ্য লেখা হল( 1 অথবা 0)।
  2. সিফ্‌ট পিন  SH_CP তে তথা 11 নং পিনে ক্লক পাল্‌স (1 থেকে 0) প্রয়োগ করা হল
  3. পুনরায় তথ্য লেখার জন্য 14 নং ডাটা পিনে তথ্য (1 বা 0) লেখা হল।
  4. পুনরায় 11 নং SH_CP পিনে ক্লক পাল্‌স প্রয়োগ করা হল।
  5. ক্রমান্বয়ে তথ্য বা ডাটা প্রেরণ করার জন্য বার বার 3 নং ও তৎপরবর্তী 4 নং ধাপের সাহায্য নেওয়া হল।
  6. 74HC595 এ সিরিয়ালি প্রেরিত তথ্য সিফ্‌ট রেজিস্টারের আটটি ডাটা পিনে মুক্ত করার জন্য স্টোরেজ পিন তথা 12 নং পিনে একটি ক্লক পালস প্রয়োগ করা হল।

IC 74HC595 এ প্রেরিত সমস্ত সিরিয়াল তথ্য সিফ্‌ট রেজিস্টারের এবং ঐ রেজিস্টার সংলগ্ন ঐ রেজিস্টারের সাথে যুক্ত অপর সিফ্‌ট রেজিস্টার গুলির ডাটা পিন গুলি 9 নং পিনের মাধ্যমে ক্রমান্বয়ে যুক্ত হয়।

Get crazy deals on smartwatches

9.4.4 8051 Interfacing – Shift Register – eepromনমুনা প্রকল্পঃ

9.4.4.1 8051 Interfacing – Shift Register – eepromআমরা এখন IC 74HC595 কে সেভেন সিগমেন্ট ডিসপ্লেতে 8051 মাইক্রোকন্ট্রোলার সহযোগে ব্যবহার করবঃ

9.4.4.2 উপকরণঃ

  1. AT89S51 মাইক্রোকন্ট্রোলার
  2. 74HC595 সিফ্‌ট রেজিষ্টার
  3. 7 সিগমেন্ট ডিসপ্লে
  4. 11.0592 MHz ক্রিস্টাল
  5. 33pf ক্যাপাসিটর (2 টি)
  6. 10 uf ক্যাপাসিটর
  7. 10K রোধ
  8. 330 ওহম রোধ
  9. কানেক্টিং ওয়্যার
  10. ব্রেড বোর্ড

9.4.4.3 প্রয়োজনীয় সার্কীটঃ

Figure 84

9.4.4.4 প্রয়োজনীয় C কোডঃ

MCU তে কোড আপলোড

Figure 84a

Get crazy deals on smartwatches

9.4.4.5 8051 Interfacing – Shift Register – eeprom- 74HC595 সিফ্‌ট রেজিস্টারে তথ্য পাঠানোর জন্য উপরের C কোডটিতে আমরা sendSerial() মেথডটি লক্ষ্য করব-

void sendSerial(unsigned char sdat){

     int i = 0;

     for(i = 0; i< 8; i++){

         if(sdat & 0x01) sd = 1;

         //if(0x80&sdat) sd = 1;

         else sd = 0;

         clock();

         sdat = sdat >> 1;

     }

     storage();

}

এখানে একটি for() লুপের মাধ্যমে sd তথা 14 নং পিনে বার বার 1 অথবা 0 লেখা হয়েছে। sd তথা 14 নং পিনে 1 বা 0 লেখার পরেই আমরা 11 নং পিনে ক্লক পালস clock() প্রয়োগ করেছি। for() লুপের শেষে অর্থাৎ সমস্ত তথ্য লেখা হয়ে গেলে আমরা সমস্ত তথ্যটিকে 74HC595 এর ডাটা পিনে মুক্ত করার জন্য আমরা স্টোরেজ পিনে (অর্থাৎ 12 নং পিনে) ক্লক পালস storage() প্রয়োগ করেছি।

  • Clock() এবং storage() মেথড দুটিও দ্রষ্টব্য।

9.5 8051 Interfacing – Shift Register – eeprom৮০৫১ – মাইক্রোকন্ট্রোলার ও EEPROM সংযোগ (Interfacing 8051 MCU with EEPROM)

বর্তমান অধ্যায়ে ৮০৫১ MCU ও EEPROM 24C04 এর সংযোগ স্থাপন করব। EEPROM (Electrically Erasable Programmable Read Only Memory) হল একটি IC চিপ যেটি তথ্য সঞ্চয় করে রাখতে পারে। প্রকারভেদে ধারন ক্ষমতা অনুযায়ী EEPROM বিভিন্ন প্রকারের হয়। Atmel কোম্পানির 24C04 হল এরকম একটি 4K ধারণ ক্ষমতা যুক্ত (512×8 বিট) EEPROM. একই সিরিজের 24C08, 24C016 হল যথাক্রমে 8K bit ও 16 K bit ধারন খমতা যুক্ত eeprom.

নোটঃ সাধারণত আমরা KB বলতে কিলো বাইট কথাটির সাথে পরিচিত। কিন্ত EEPROM ও আরও কয়েকটি ক্ষেত্রে KB কিলো বাইটের পরিবর্তে কিলো বিট বোঝায়। 4 K bit eeprom বলতে 4×1024 বিট মেমরি কে বোঝানো হয়েছে। 4×1024 = 512×8, সুতরাং 24C04 হল 512 টি বাইট (যেহেতু 8 টি বিট নিয়ে একটি বাইট গঠিত) ধারণ ক্ষমতা যুক্ত একটি EEPROM.

Get crazy deals on smartwatches

8051 Interfacing – Shift Register – eeprom

9.5.1 EEPROM 24C04 পিন আউটঃ

A1 এবং A2 হল ডিভাইস অ্যাড্রেস ইনপুট। 0 এবং 1 ব্যবহারের মাধ্যমে অর্থাৎ A1 এবং A2 কে উচ্চ ও নিম্ন বিভব যুক্ত করে আমরা সর্বোচ্চ চারটি 24C04 eeprom কে একটি মাত্র ডাটা বাসের সাথে যুক্ত করতে পারি।

WP – এই পিনটি উচ্চ বিভবে যুক্ত থাকলে আমরা eeprom এ কোন তথ্য সঞ্চয় করতে পারব না। সাধারণ ভাবে Read/Write অপারেশনের সময়ে বা তথ্য সঞ্চয়ের সময়ে এই পিনটিকে GND এর সাথে যুক্ত করা হয়।

SDA – সিরিয়াল ডাটা লাইন। উভয়মুখি তথ্য এই লাইনের মাধ্যমে সঞ্চালিত হয়। এই পিনটি একটি ওপেন ড্রেন আউটপুট। তাই পুল আপ রেজিস্টারের (4.7K) সাহায্যে VCC এর সাথে যুক্ত করতে হয়।

SCL – সিরিয়াল ক্লক ইনপুট। SDA লাইনে তথ্য সামঞ্জস্য পূর্ণ (  ) করতে এই ক্লক ইনপুট সাহায্য করে। এই ইনপুট ক্লক পালস SDA লাইনে তথ্য সঞ্চালনের শুরু (Start) , শেষ (Stop) এবং eeprom থেকে তথ্য আদান প্রদানে SDA লাইনকে সামঞ্জস্য বিধান করতে সাহায্য করে।

9.5.2 8051 Interfacing – Shift Register – eepromকিভাবে EEPROM MCUএর সাথে তথ্য আদান প্রদান করেঃ

9.5.2.1 I2C কমিউনিকেশনশঃ(I2C Communication):

I2C বা Inter Integrated Circuit Communications মূলত ব্যবহৃত হয় এমবেডেড সিস্টেমে মাইক্রোকন্ট্রোলার, eeprom, I/O ইন্টারফেস প্রভৃতির মধ্যে সংযোগ রক্ষা করার জন্য। I2C হলেমন একটি কমিউনিকেশন প্রোটোকল যেটি SPI, UART কমিউনিকেশনের সর্বোত্তম সমন্বয়ে গঠিত। I2C কমিউনিকেশন প্রোটোকলের মাধ্যমে এক বা একাধিক স্লেভ ডিভাইসকে একটি মাত্র মাস্টার ডিভাইসের সাথে সংযুক্ত করতে পারি। আবার একাধিক মাস্টার ডিভাইসকেও একটি মাত্র স্লেভ ডিভাইসের সাথে যুক্ত করতে পারি।

9.5.2.2 8051 Interfacing – Shift Register – eepromI2C কিভাবে কাজ করেঃ

I2C কমিউনিকেশনে তথ্য ম্যাসেজ ফ্রেম রূপে সঞ্চালিত হয়। প্রতিটি ম্যাসেজ ফ্রেম একটি বাইনারি স্লেভ অ্যাড্রেস ফ্রেম এবং এক বা একাধিক ডাটা ফ্রেম নিয়ে গঠিত।  তথ্য সঞ্চালনের শুরু এবং শেষ শর্ত, রিড/রাইট বিট এবং ACK(Acknowledge), NACK(Not Acknowledge) বিট গুলিও ম্যাসেজ ফ্রেমের সাথে যুক্ত থাকে।

Get crazy deals on smartwatches

9.5.2.3 8051 Interfacing – Shift Register – eeprom I2C কমিউনিকেশনস – ধাপঃ(I2C Communication – steps)

১। মাস্টার ডিভাইস তার সাথে যুক্ত প্রত্যেক স্লেভ ডিভাইসকে স্টার্ট কন্ডিশন প্রেরণ করে। এর জন্য SCL লাইনকে হাই থেকে লো ভোল্টেজে কনভার্ট করার পূর্বে SDA লাইনকে হাই থেকে লো ভোল্টেজে কনভার্ট করতে হবে।

START:

SETB SDA

SETB SCL

CLR SDA

NOP

CLR SCL

RET

২। এরপর মাস্টার ডিভাইস প্রতিটি স্লেভ ডিভাইসকে ৭ বা ১০ বিট যুক্ত স্লেভ অ্যাড্রেস প্রেরণ করে। এই স্লেভ অ্যাড্রেসটি হল কাঙ্ক্ষিত স্লেভ ডিভাইসের অ্যাড্রেস। স্লেভ অ্যাড্রেস এর সাথে একটি রিড/রাইট বিটও মাস্টার ডিভাইস যুক্ত করে থাকে।

SEND:

MOV R7,#08

SENDD:

RLC A

MOV SDA,C

SETB SCL

NOP

CLR SCL

DJNZ R7, SENDD

RET

৩। মাস্টারের সাথে যুক্ত প্রতিটি স্লেভ ঐ পাঠানো অ্যাড্রেস নিজের কিনা মিলিয়ে দেখে। যদি ঐ অ্যাড্রেস নিজের অ্যাড্রেসের সাথে মিলে যায় এটি সঙ্গে সঙ্গে এক বিটের জন্য SDA লাইনকে লো করে প্রাপ্তি স্বিকার (Acknowledge বা ACK বিট) করে। অ্যাড্রেস না মিললে স্লেভ SDA লাইনকে হাই রেখে দেয়।

৪। প্রতিটি ডাটা ফ্রেম সঞ্চালন শেষ হলে ডাটা গ্রহণকারী ডিভাইসটি একটি ACK বিটের মাধ্যমে তথ্য গ্রহণের প্রাপ্তি স্বিকার করে।

RECV:

MOV B, #08

SETB SDA

INLOOP:

CLR SCL

NOP

SETB SCL

MOV C, SDA

RLC A

DJNZ B, INLOOP

CLR SCL

RET

৫। তথ্য সঞ্চালন শেষ করার জন্য মাস্টার ডিভাইস স্লেভকে একটি স্টপ কন্ডিশন প্রেরণ করে। এর জন্য SCL লাইনকে SDA লাইনকে উচ্চ বিভবে পরিণত করার পূর্বেই উচ্চ বিভবে পরিণত করতে হবে।

STOP:

CLR SDA

SETB SCL

NOP

SETB SDA

NOP

CLR SCL

RET

Get crazy deals on smartwatches

9.5.3 8051 Interfacing – Shift Register – eeprom নমুনা প্রকল্পঃ

বর্তমান প্রকল্পে আমরা কি প্যাডের মাধ্যমে ও ৮০৫১ মাইক্রোকন্ট্রোলারের সাহায্যে আমাদের কাঙ্ক্ষিত সংখ্যাকে (দুই ডিজিট) সেভেন সিগমেন্টে ডিসপ্লে করব। প্রয়োজন আনুসারে সেই সংখ্যাকে EEPROM 24C04 এ স্টোর করব এবং প্রয়োজন আনুসারে আমরা সেই সংখ্যাকে পরবর্তী কোন সময়ে EEPROM 24C04 থেকে সংগ্রহ করব।

9.5.3.1 প্রয়োজনীয় পার্ট লিস্টঃ

১। AT80S51

২। 10uF Capacitor

৩। 10K resistor(1+2 = 3 Pieces)*

৪। 11.0592MHz Crystal

৫। 33pF Capacitor(2 piece)

৬। 3×4 KeyPad

৭। Seven Segment Display Unit – Common Anode (2 Pieces)

৮। BC548 Transistor (2 Pieces)

৯। Indicating LED (2 Pieces)

১০। EEPROM 24C04

১১। 4.8K Resistor (2 Piece)

*যেহেতু P0 পোর্টটি ওপেন ড্রেইন সেহেতু P0.1ও P0.2 পিন দুটিকে দুটি 10K পুল আপ রেজিষ্টারের সাহায্যে +5V (VCC) যুক্ত করা হয়েছে।

9.5.3.2 প্রয়োজনীয় সার্কিটঃ

Figure 88

9.5.3.3 প্রয়োজনীয় কোডঃ

ডাউনলোড কোড

MCU তে কোড আপলোড

org 0000h

WTCMD        EQU 10100000B                ;24C04 WRITE COMMAND

RDCMD        EQU 10100001B                ;24C04 READ COMMAND

ADDRS EQU 80H

X EQU 50H

Y EQU 60H

row1 bit P1.0

row2 bit P1.1

row3 bit P1.2

row4 bit P1.3

col1 bit P1.4

col2 bit P1.5

col3 bit P1.6

digit1 bit P0.1

digit2 bit P0.2

clr col1

clr col2

clr col3

setb row1

setb row2

setb row3

setb row4

blinker bit P3.7

indicator bit P3.2

SDA bit P3.3

SCL bit P3.4

MOV DPTR, #CODE7

mov a, #00h

mov b, #00h

MOV X,#00H

MOV Y, #00H

mov P2,#00000000b

mov r1, #00h

MOV R2, #00H

MOV R3,#00H

MOV ADDRS, #00000000B

setb blinker

clr indicator

up: lcall display

inc r0

mov r1, #0

up1:

lcall display

inc r1

cjne r1, #250, up1

acall scan_key

cjne r0, #250, up

cpl blinker

jmp up

scan_key:

         clr col1

         setb col2

         setb col3

         jnb     row1, cel1_scan_key

         jnb row2, cel2_scan_key

         jnb     row3, cel3_scan_keytemp

         jnb row4, cel4_scan_keytemp

         setb col1

         clr col2

         setb col3

         jnb     row1,cel5_scan_keytemp

         jnb row2,cel6_scan_keytemp

         jnb     row3, cel7_scan_keytemp

         jnb row4, cel8_scan_keytemp

         setb col1

         setb col2

         clr col3

         jnb     row1, cel9_scan_keytemp

         jnb     row2, cel10_scan_keytemp

         jnb     row3, cel11_scan_keytemp

         jnb row4, cel12_scan_keytemp

         setb col1

         setb col2

         setb col3

         ret

cel3_scan_keytemp: LJMP cel3_scan_key

RET

cel4_scan_keytemp: LJMP cel4_scan_key

ret

cel5_scan_keytemp: LJMP cel5_scan_key

ret

cel6_scan_keytemp: LJMP cel6_scan_key

ret

cel7_scan_keytemp: LJMP cel7_scan_key

ret

cel8_scan_keytemp: LJMP cel8_scan_key

ret

cel9_scan_keytemp: LJMP cel9_scan_key

ret

cel10_scan_keytemp: LJMP cel10_scan_key

ret

cel11_scan_keytemp: LJMP cel11_scan_key

ret

cel12_scan_keytemp: LJMP cel12_scan_key

RET

cel1_scan_key:

         mov r7,#00h

deb1_scan_key:

         setb indicator

         jb row1, err1_scan_key

         djnz r7, deb1_scan_key

         jnb row1,$                         ;wait till switch is released

         MOV Y,X

         MOV X, #01H          ;#1

         clr indicator

         setb col1

         ret

err1_scan_key:

setb col1       ;Error while debouncing so return

clr indicator

ret

cel2_scan_key:        //column 1, row2

mov r7,#00h 

deb2_scan_key:        ;debounce row 2 switch

setb indicator

jb row2,err2_scan_key

djnz r7,deb2_scan_key

jnb row2,$                              ;wait till switch is released  

MOV Y,X

MOV X, #04H                           ;#4    ;since switch pressed is 4, Acc =4

clr indicator                    ;Indicating switch has been pressed

setb col1       ;column1

ret    

err2_scan_key:

setb col1    ;Column1

ret                       ;Error while debouncing so return

cel3_scan_key:        //column 1, row3

mov r7,#00h 

deb3_scan_key:        ;debounce row 3 switch

setb indicator

jb row3,err3_scan_key

djnz r7,deb3_scan_key

jnb row3,$                                                                                           ;wait till switch is released

MOV Y,X

MOV X, #07H                                        ;#7                            ;since switch pressed is 7, Acc =7

clr indicator                                                            ;Indicating switch has been pressed

setb col1

ret

err3_scan_key:

setb col1                                             ;Error while debouncing so return

ret

cel4_scan_key:                                             //column 1, row4

mov r7,#00h

deb4_scan_key:                                       ;debounce row 4 switch

setb indicator

jb row4,err4_scan_key

djnz r7,deb4_scan_key

jnb row4,$                                               ;wait till switch is released

LCALL WRITEBYTE

MOV A,X

CALL MYSEND

MOV A,Y

CALL MYSEND

CALL MYSTOP

setb col1

clr indicator

ret

err4_scan_key:

setb col1                                      ;Error while debouncing so return

ret

cel5_scan_key:                                            //column 2, row 1

mov r7,#00h

deb5_scan_key:                                        ;debounce row 1 switch

setb indicator

jb row1,err5_scan_key

djnz r7,deb5_scan_key

jnb row1,$                     ;wait till switch is released

MOV Y,X

MOV X, #02H                                                        ;#2     ;since switch pressed is 2, Acc =2

clr indicator                                                       ;Indicating switch has been pressed

setb col2

ret

err5_scan_key:

setb col2                                         ;Error while debouncing so return

ret

cel6_scan_key:                                          //column 2, row2

mov r7,#00h

deb6_scan_key:                                    ;debounce row 2 switch

setb indicator

jb row2,err6_scan_key

djnz r7,deb6_scan_key

jnb row2,$                                            ;wait till switch is released

MOV Y,X

MOV X, #05H      ;#5                                             ;since switch pressed is 5, Acc =5

clr indicator                                                  ;Indicating switch has been pressed

setb col2

ret

err6_scan_key:

setb col2                                   ;Error while debouncing so return

ret

cel7_scan_key:                                   //column 2, row3

mov r7,#00h

deb7_scan_key:                              ;debounce row 3 switch

setb indicator

jb row3,err7_scan_key

djnz r7,deb7_scan_key

jnb row3,$                                          ;wait till switch is released

MOV Y,X

MOV X, #08H      ;#8                                           ;since switch pressed is 8, Acc =8

clr indicator                                                 ;Indicating switch has been pressed

setb col2

ret

err7_scan_key:

setb col2                                    ;Error while debouncing so return

ret

cel8_scan_key:                                     //column 2, row4

mov r7,#00h

deb8_scan_key:                                ;debounce row 4 switch

setb indicator

jb row4,err8_scan_key

djnz r7,deb8_scan_key

jnb row4,$                                          ;wait till switch is released

MOV Y,X

MOV X, #00H     ;#0                                 

clr indicator                                                 ;Indicating switch has been pressed

setb col2

ret

err8_scan_key:

setb col2                                    ;Error while debouncing so return

ret

cel9_scan_key:                                    //column 3, row 1

mov r7,#00h

deb9_scan_key:                              ;debounce row 1 switch

setb indicator

jb row1,err9_scan_key

djnz r7,deb9_scan_Key

jnb row1,$                                         ;wait till switch is released

MOV Y,X

MOV X, #03H                                          ;since switch pressed is 3, Acc =3

clr indicator                                                ;Indicating switch has been pressed

setb col3               ; coloumn 3

ret

err9_scan_key:

setb col3                                ;Error while debouncing so return

ret

cel10_scan_key:                                   //column 3, row2

mov r7,#00h

deb10_scan_key:                             ;debounce row 2 switch

setb indicator

jb row2,err10_scan_key

djnz r7,deb10_scan_key

jnb row2,$                                          ;wait till switch is released

MOV Y,X

MOV X,#06H                                       ;since switch pressed is 6, Acc =6

clr indicator

setb col3                           ;column3

ret

err10_scan_key:

setb col3                                ;Error while debouncing so return

ret

cel11_scan_key:                                   //column 3, row3

mov r7,#00h

deb11_scan_key:                             ;debounce row 3 switch

setb indicator

jb row3,err11_scan_key

djnz r7,deb11_scan_key

jnb row3,$                                          ;wait till switch is released

MOV Y,X

MOV X,#09H    ;#9                                           ;since switch pressed is 9, Acc =9

clr indicator

setb col3                           ;column3

ret

err11_scan_key:

setb col3                                ;Error while debouncing so return

ret

cel12_scan_key:                                   //column 3, row3

mov r7,#00h

deb12_scan_key:                             ;debounce row 3 switch

setb indicator

jb row4,err12_scan_key

djnz r7,deb12_scan_key

jnb row4,$                                          ;wait till switch is released

CALL READBYTE

CALL MYSTART

MOV A,#RDCMD

CALL MYSEND

CALL MYIN

CALL MYNAK

MOV X,A

CALL MYSTART

MOV A,#RDCMD

CALL MYSEND

CALL MYIN

CALL MYNAK

MOV Y,A

CALL MYSTOP                                        ;since switch pressed is 9, Acc =9

clr indicator

setb col3                          ;column3

ret

err12_scan_key:

setb col3                                ;Error while debouncing so return

ret

display:

clr indicator

mov P2, #11111111b

setb digit1

clr digit2

mov A,X

movc A, @A+DPTR

mov P2,A  

nop

nop

nop

nop

nop

mov P2, #11111111b

clr digit1

setb digit2

nop

MOV A,Y

MOVC A, @A+DPTR

mov P2,A 

ret

MYINIT:

SETB SDA

SETB SCL

NOP

RET

MYSTART:

SETB SDA

SETB SCL

NOP           

CLR SDA

NOP

CLR SCL

RET

MYCLOCK:

SETB SCL

NOP

CLR SCL

RET

MYACK:

CLR SDA

SETB SCL

NOP

CLR SCL

RET

MYNAK:

SETB SDA

SETB SCL

NOP

CLR SCL

RET

MYSTOP:

CLR SDA

NOP

SETB SCL

NOP

SETB SDA

LCALL DLAYms11

RET

MYSEND:

MOV B,#08

MYSEND1:

RLC A

MOV SDA,C

CALL MYCLOCK

DJNZ B, MYSEND1

NOP

CALL MYCLOCK

RET

MYIN:

MOV B,#8

SETB SDA

MIN:

CLR SCL

NOP

SETB SCL

MOV C,SDA

RLC A

DJNZ B,MIN

CLR SCL

RET

DLAYms11:

         MOV R6,#150

         MOV B,#00

MS11:  DJNZ B,$               ;((2*255)+(2*255)*150

         DJNZ B,$                        ;=153 MILLI SECONDS

         DJNZ R6,MS11

         RET

READBYTE:

CALL MYSTART

MOV A,#WTCMD

CALL MYSEND

MOV ADDRS,#00H

MOV A, ADDRS

ANL A,0xFF

CALL MYSEND             ;Send High Byte Address

MOV ADDRS,#00H

MOV A,#00H

ANL A,0xFF

CALL MYSEND                 ;Send Low Byte Address

RET

WRITEBYTE:

CALL MYSTART

MOV A,#WTCMD

CALL MYSEND

MOV ADDRS,#00H                    

MOV A,ADDRS

ANL A,0xFF

CALL MYSEND                         ;Send High Byte      Address

MOV A,#00H                  

ANL A,0xFF

CALL MYSEND                         ;Send Low Byte Address

RET

CODE7:

DB 11000000b,11111001b,10100100b, 10110000b, 10011001b,10010010b, 10000010b, 11111000b,10000000b,10010000b 

end