{"id":14383,"date":"2018-08-06T12:01:34","date_gmt":"2018-08-06T16:01:34","guid":{"rendered":"http:\/\/embedded-lab.com\/blog\/?p=14383"},"modified":"2023-09-06T02:56:18","modified_gmt":"2023-09-06T06:56:18","slug":"getting-started-nuvoton-8-bit-microcontrollers-coding-part-3","status":"publish","type":"post","link":"https:\/\/embedded-lab.com\/blog\/getting-started-nuvoton-8-bit-microcontrollers-coding-part-3\/","title":{"rendered":"Getting Started with Nuvoton 8-bit Microcontrollers \u2013 Coding Part 3"},"content":{"rendered":"<p>This post is a continuation of the previous post on Nuvoton N76E003 microcontroller\u00a0<a href=\"http:\/\/embedded-lab.com\/blog\/getting-started-nuvoton-8-bit-microcontrollers-coding-part-2\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l16001.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14384 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l16001-580x397.jpg\" alt=\"s-l1600\" width=\"580\" height=\"397\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l16001-580x397.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l16001.jpg 639w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h1><span lang=\"EN-GB\">Communication Peripheral Overview <\/span><\/h1>\n<p style=\"text-align: justify\">N76E003 packs basic serial communication peripherals for I2C, SPI and UART. These interfaces enable us to interface external EEPROM and flash memories, real-time clocks (RTC), sensors, etc.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Comm-types.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14385\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Comm-types-580x189.png\" alt=\"Comm types\" width=\"580\" height=\"189\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Comm-types-580x189.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Comm-types.png 818w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">N76E003 has two hardware UARTs, one SPI and one I2C peripheral. The UART interfaces can be further expanded to implement RS-485 and RS-422 communication protocols. With ordinary GPIOs and optionally with hardware timers we can implement software-based UART, SPI and I2C too. However, software methods are slow and resource-hungry. Software-based approach is, on the other hand, needed when we have to interface devices that don\u2019t use any of these communication topologies. For example, the one-wire protocol used by DHT series relative humidity and temperature sensors needs to be implemented by using an ordinary GPIO pin. Same goes for typical text and graphical LCDs.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/N76E003-Comms.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14386\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/N76E003-Comms-580x189.png\" alt=\"N76E003 Comms\" width=\"580\" height=\"189\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/N76E003-Comms-580x189.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/N76E003-Comms.png 818w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Note that there is a conflict between UART1 and alternative I2C pins. There are also similar conflicts with other hardware peripherals like PWMs, ADCs, etc since N76E003 packs lots of stuff in such a small form-factor. Every single GPIO pin is precious. Try to keep things with default GPIO pins in order to reduce conflicts with other hardware peripherals, coding and to maximize effective use of GPIOs. Likewise bear in mind that timers have also such conflicts as they are used to implement both hardware-based delays and the UART peripherals. You have to know for sure what you are doing, what do you want and with which stuffs you wish to accomplish your task.<\/p>\n<p style=\"text-align: justify\"><!--more--><\/p>\n<h1 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Serial Communication &#8211; UART<\/span><\/h1>\n<p style=\"text-align: justify\">To date serial communication (UART) is perhaps the simplest and widely used form of communication in use. UART block is only block available in most microcontrollers that can be easily interfaced with a computer or a phone. Most communication modules like Bluetooth, Wi-Fi, GSM modems, GPS modules, etc are interfaced using UART. It has incredible range and is also the backbone of other communication methods like RS-485, RS-422, etc.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14387\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022.jpg\" alt=\"HMC1022\" width=\"358\" height=\"329\" \/><\/a><\/p>\n<p>To learn more about UART visit the following link:<\/p>\n<p><a href=\"https:\/\/learn.mikroe.com\/uart-serial-communication\">https:\/\/learn.mikroe.com\/uart-serial-communication<\/a><\/p>\n<h2 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Code<\/span><\/h2>\n<h3><strong>HMC1022.h<\/strong><\/h3>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define Get_Angular_Measurement\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x31<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define Start_Calibration\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xC0\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define End_Calibration\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a00xC1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define Set_Magnetic_Declination_High_Byte\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x03\u00a0\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define Set_Magnetic_Declination_Low_Byte\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x04<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define no_of_data_bytes_returned\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a00x08<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define calibration_LED\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0P15<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void read_heading(void);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void calibrate_compass(void);\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void factory_reset(void);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_declination_angle(unsigned long angle);<\/span><\/pre>\n<h3><strong>HMC1022.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"HMC1022.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char done = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char data_bytes[no_of_data_bytes_returned] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void read_heading(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned char s = 0;\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned long CRC = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 Send_Data_To_UART1(Get_Angular_Measurement);\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 for(s = 0; s &lt; no_of_data_bytes_returned; s++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data_bytes[s] = Receive_Data_From_UART1();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(s &lt; (no_of_data_bytes_returned - 1))\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CRC += data_bytes[s];<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 CRC = (CRC &amp; 0xFF);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 if(CRC == data_bytes[7])<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 done = 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void calibrate_compass(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0unsigned char s = 0x00;\u00a0\u00a0 \u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(Start_Calibration);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0for(s = 0; s &lt; 60; s++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 calibration_LED = 1;\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 calibration_LED = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_ms(900);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0}\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0for(s = 0; s &lt; 60; s++)\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 \u00a0\u00a0calibration_LED = 1;\u00a0 \u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_ms(400);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 calibration_LED = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_ms(600);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(End_Calibration);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void factory_reset(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(0xA0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(0xAA);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(0xA5);\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(0xC5);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_declination_angle(unsigned long angle)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0unsigned long hb = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0unsigned char lb = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0lb = (angle &amp; 0x00FF);\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0hb = (angle &amp; 0xFF00);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0hb &gt;&gt;= 8;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(Set_Magnetic_Declination_High_Byte);\u00a0\u00a0 \u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(hb);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(Set_Magnetic_Declination_Low_Byte);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0Send_Data_To_UART1(lb);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>main.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"LCD_2_Wire.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"HMC1022.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">const unsigned char symbol[8] =<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 0x00, 0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">extern unsigned char done;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">extern unsigned char data_bytes[no_of_data_bytes_returned];<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_symbol(void);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 setup();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while(1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 read_heading();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(done)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(6, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(data_bytes[2]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(7, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(data_bytes[3]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(8, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(data_bytes[4]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(9, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar('.');<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(10, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(data_bytes[6]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 done = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 P15 = ~P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_ms(200);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P15_PushPull_Mode;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 lcd_symbol();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(3, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"Heading\u00a0 N\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(11, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(0, DAT);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 InitialUART1_Timer3(9600);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_symbol(void)\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char s = 0;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(0x40, CMD);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt; 8; s++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_send(symbol[s], DAT);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(0x80, CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2><span lang=\"EN-GB\">Schematic<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14388\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-Schematic-580x257.png\" alt=\"UART Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2><span lang=\"EN-GB\">Explanation<\/span><\/h2>\n<p style=\"text-align: justify\">The following are the commands that HMC1022 acknowledges when sent via UART:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022-Commands.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14389\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022-Commands.png\" alt=\"HMC1022 Commands\" width=\"571\" height=\"202\" \/><\/a><\/p>\n<p style=\"text-align: justify\">HMC1022 gives heading data when it is requested. The highlighted command is that command.<\/p>\n<p style=\"text-align: justify\">Once requested it sends out a string of characters that carry heading information. The followings are the response package and its details:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022-Response.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14390\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022-Response-580x237.png\" alt=\"HMC1022 Response\" width=\"580\" height=\"237\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022-Response-580x237.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/HMC1022-Response.png 860w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">From the above info, it is clear that HMC1022 will return 8 bytes when requested for heading. Out of these we need bytes 2, 3,4 and 6. The rest can be ignored for simplicity.<\/p>\n<p style=\"text-align: justify\">Data from HM1022 is received by the following function:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void read_heading(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned char s = 0;\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned long CRC = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 Send_Data_To_UART1(Get_Angular_Measurement);\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 for(s = 0; s &lt; no_of_data_bytes_returned; s++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data_bytes[s] = Receive_Data_From_UART1();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(s &lt; (no_of_data_bytes_returned - 1))\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CRC += data_bytes[s];<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 CRC = (CRC &amp; 0xFF);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 if(CRC == data_bytes[7])<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 done = 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p>Note that the function <strong><em>Send_Data_To_UART1<\/em><\/strong> and <strong><em>Receive_Data_From_UART1<\/em><\/strong> are BSP functions. Likewise, <strong><em>InitialUART1_Timer3(9600)<\/em><\/strong> function is also a BSP function that initiates UART1 with Timer 3. As with ADC, BSP functions for UART are enough for basic setup. Try to use Timer 3 as it remains mostly free. If you need more control over the UART, you can manually configure the registers.<\/p>\n<p>In the main, the received bytes containing heading info are displayed.<\/p>\n<h2><span lang=\"EN-GB\">Demo<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14391\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-580x466.jpg\" alt=\"UART\" width=\"580\" height=\"466\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-580x466.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/Y0jehv58ugE?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0in\"><span lang=\"EN-GB\">UART Interrupt<\/span><\/h1>\n<p style=\"text-align: justify\">UART, as we saw in the last example, can be used in polling mode but it is wise to use it in interrupt mode. This feature becomes especially important and therefore, a must-have requirement when it come to that fact that the host micro may not always know when to receive data. Unlike SPI\/I2C, UART doesn\u2019t always follow known data transactions. Take the example of a GSM modem. We and so does our tiny host N76E003 micro don\u2019t know for sure when a message would arrive. Thus, when an interrupt due to reception is triggered, it is known to mark the beginning of data reception process. The host micro can relax idle until data is received fully.<\/p>\n<p style=\"text-align: justify\">Here, we will see how to use UART interrupt to read a LV-Max EZ0 SONAR module.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LV-Max-Ez0.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14392\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LV-Max-Ez0.jpg\" alt=\"LV-Max Ez0\" width=\"435\" height=\"435\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LV-Max-Ez0.jpg 435w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LV-Max-Ez0-150x150.jpg 150w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LV-Max-Ez0-90x90.jpg 90w\" sizes=\"auto, (max-width: 435px) 100vw, 435px\" \/><\/a><\/p>\n<h2 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Code<\/span><\/h2>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"LCD_2_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char received = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char count = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char buffer[5] = {0x00, 0x00, 0x00, 0x00, 0x00};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void UART0_ISR(void)\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">interrupt 4\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0if(RI == 1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0buffer[count] = SBUF;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count++;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(count &gt;= 4)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_ES;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0received = 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_RI;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0P15 = ~P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char i = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0setup();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0while(1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Send_Data_To_UART0('S');<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_ms(40);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_ES;\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(received)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for(i = 1; i &lt; 4; i++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_goto((12 + i), 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(buffer[i]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0received\u00a0 = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_ES;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_ms(40);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0P15_PushPull_Mode;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_clear_home();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(1, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putstr(\"UART Interrupt\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putstr(\"Range\/Inch:\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0InitialUART0_Timer3(9600);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0set_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2><span lang=\"EN-GB\">Schematic<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-INT-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14393\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-INT-Schematic-580x257.png\" alt=\"UART INT Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-INT-Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/UART-INT-Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h6><em>*Note the LV-Max EZ0 SONAR sensor is not directly connected with the N76E003 as shown in the schematic but rather it is connected via a 74HC04 hex inverter. Two of these inverters are used \u2013 one for the TX side and the other for the RX side.<\/em><\/h6>\n<h2><span lang=\"EN-GB\">Explanation<\/span><\/h2>\n<p style=\"text-align: justify\">This time UART0 is used and is setup using BSP built-in function. The only exception is the interrupt part. The global interrupt is enabled but not the UART interrupt.<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">InitialUART0_Timer3(9600);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EA;<\/span><\/pre>\n<p style=\"text-align: justify\">The UART interrupt is only enabled after commanding the SONAR sensor:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">Send_Data_To_UART0('S');<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">delay_ms(40);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_ES;\u00a0\u00a0<\/span><\/pre>\n<p style=\"text-align: justify\">This is done to avoid unnecessary reads.<\/p>\n<p style=\"text-align: justify\">The sensor is read inside the interrupt routine. The sensor outputs data as <strong><em>Rxxx&lt;CR&gt;<\/em><\/strong>. So, there are 5 bytes to read. The <strong><em>\u201cR\u201d <\/em><\/strong>in the readout works as a preamble or sync byte. The <strong><em>\u201cxxx\u201d<\/em><\/strong> part contains range info in inches. Finally, <strong><em>&lt;CR&gt;<\/em><\/strong> is a carriage return character. Therefore, every time a character is received an interrupt is triggered and the character is saved in an array. When all 5 bytes have been received, the display is updated. On exiting the interrupt, the interrupt flag is cleared. P15 is also toggled to visually indicate that an UART interrupt has been triggered.<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void UART0_ISR(void)\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">interrupt 4\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0if(RI == 1)<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 buffer[count] = SBUF;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 count++;<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 if(count &gt;= 4)<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0clr_ES;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 received = 1;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 clr_RI;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0P15 = ~P15;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2><span lang=\"EN-GB\">Demo<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Lv-Max-Ez0.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14394\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Lv-Max-Ez0-580x373.jpg\" alt=\"Lv-Max Ez0\" width=\"580\" height=\"373\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Lv-Max-Ez0-580x373.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Lv-Max-Ez0.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/SCsPt88HFVk?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Inter-Integrated Circuit (I2C) \u2013 Interfacing DS1307 I2C RTC<\/span><\/h1>\n<p style=\"text-align: justify\">Developed by Philips nearly three decades ago, I2C communication (<strong><em>Inter-Integrated Circuit<\/em><\/strong>) is widely used in a number of devices and is comparatively easier than SPI. For I2C communication only two wires \u2013 <em>serial data (SDA)<\/em> and <em>serial clock (SCK)<\/em> are needed and these two wires form a bus in which we can connect up to 127 devices.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14398\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C.png\" alt=\"I2C\" width=\"489\" height=\"192\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Everything you need to know about I2C can be found in these pages:<\/p>\n<ul style=\"text-align: justify\">\n<li><a href=\"https:\/\/learn.mikroe.com\/i2c-everything-need-know\">https:\/\/learn.mikroe.com\/i2c-everything-need-know<\/a><\/li>\n<li><a href=\"https:\/\/learn.sparkfun.com\/tutorials\/i2c\">https:\/\/learn.sparkfun.com\/tutorials\/i2c<\/a><\/li>\n<li><a href=\"http:\/\/www.ti.com\/lsds\/ti\/interface\/i2c-overview.page\">http:\/\/www.ti.com\/lsds\/ti\/interface\/i2c-overview.page<\/a><\/li>\n<li><a href=\"http:\/\/www.robot-electronics.co.uk\/i2c-tutorial\">http:\/\/www.robot-electronics.co.uk\/i2c-tutorial<\/a><\/li>\n<li><a href=\"https:\/\/www.i2c-bus.org\/i2c-bus\">https:\/\/www.i2c-bus.org\/i2c-bus<\/a><\/li>\n<li><a href=\"http:\/\/i2c.info\">http:\/\/i2c.info<\/a><\/li>\n<\/ul>\n<p style=\"text-align: justify\">Apart from these N76E003\u2019s datasheet explains I2C communication in high detail.<\/p>\n<h2 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Code<\/span><\/h2>\n<h3><strong>I2C.h<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define regular_I2C_pins\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define alternate_I2C_pins\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define regular_I2C_GPIOs()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0do{P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define alternative_I2C_GPIOs()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0do{P02_OpenDrain_Mode; P16_OpenDrain_Mode; set_I2CPX;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define I2C_GPIO_Init(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0do{if(mode != 0){alternative_I2C_GPIOs();}else{regular_I2C_GPIOs();}}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define I2C_CLOCK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x27 \/\/Fclk = Fsys \/ (4*(prescalar + 1))<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define I2C_ACK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define I2C_NACK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define timeout_count\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01000<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_start(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_stop(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char I2C_read(unsigned char ack_mode);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_write(unsigned char value);<\/span><\/pre>\n<h3><strong>I2C.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"I2C.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_init(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_GPIO_Init(regular_I2C_pins);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2CLK = I2C_CLOCK;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0set_I2CEN;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_start(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 signed int t = timeout_count;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 set_STA;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0clr_SI;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0while((SI == 0) &amp;&amp; (t &gt; 0))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 \u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 t--;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 };\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_stop(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0signed int t = timeout_count;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0clr_SI;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0set_STO;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0while((STO == 1) &amp;&amp; (t &gt; 0))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t--;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0};\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char I2C_read(unsigned char ack_mode)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0signed int t = timeout_count;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char value = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0set_AA;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0clr_SI;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0while((SI == 0) &amp;&amp; (t &gt; 0))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t--;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0};\u00a0\u00a0 \u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0value = I2DAT;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0if(ack_mode == I2C_NACK)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t = timeout_count;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_AA;\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_SI;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while((SI == 0) &amp;&amp; (t &gt; 0))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t--;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0};\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0return value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_write(unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0signed int t = timeout_count;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2DAT = value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0clr_STA;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0clr_SI;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0while((SI == 0) &amp;&amp; (t &gt; 0))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t--;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0};\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>DS1307.h<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define I2C_W\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define I2C_R\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define sec_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define min_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define hr_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x02<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define day_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x03<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define date_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x04<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define month_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x05<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define year_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x06<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define control_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x07<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DS1307_addr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xD0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DS1307_WR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (DS1307_addr + I2C_W)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DS1307_RD\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (DS1307_addr + I2C_R)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DS1307_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char DS1307_read(unsigned char address);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DS1307_write(unsigned char address, unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char bcd_to_decimal(unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char decimal_to_bcd(unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void get_time(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_time(void);<\/span><\/pre>\n<h3><strong>DS1307.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"DS1307.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"I2C.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">struct<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char s;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char m;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char h;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char dy;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char dt;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char mt;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char yr;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}time;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DS1307_init(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 DS1307_write(control_reg, 0x00);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char DS1307_read(unsigned char address)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char value = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_start();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_write(DS1307_WR);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_write(address);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_start();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_write(DS1307_RD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0value = I2C_read(I2C_NACK);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_stop();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0return value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DS1307_write(unsigned char address, unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_start();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_write(DS1307_WR);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_write(address);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_write(value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0I2C_stop();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char bcd_to_decimal(unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0return ((value &amp; 0x0F) + (((value &amp; 0xF0) &gt;&gt; 0x04) * 0x0A));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char decimal_to_bcd(unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0return (((value \/ 0x0A) &lt;&lt; 0x04) &amp; 0xF0) | ((value % 0x0A) &amp; 0x0F);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void get_time(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.s = DS1307_read(sec_reg);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.s = bcd_to_decimal(time.s);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.m = DS1307_read(min_reg);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.m = bcd_to_decimal(time.m);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.h = DS1307_read(hr_reg);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.h = bcd_to_decimal(time.h);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.dy = DS1307_read(day_reg);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.dy = bcd_to_decimal(time.dy);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.dt = DS1307_read(date_reg);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.dt = bcd_to_decimal(time.dt);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.mt = DS1307_read(month_reg);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.mt = bcd_to_decimal(time.mt);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.yr = DS1307_read(year_reg);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.yr = bcd_to_decimal(time.yr);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_time(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.s = decimal_to_bcd(time.s);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_write(sec_reg, time.s);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.m = decimal_to_bcd(time.m);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_write(min_reg, time.m);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.h = decimal_to_bcd(time.h);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_write(hr_reg, time.h);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.dy = decimal_to_bcd(time.dy);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_write(day_reg, time.dy);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.dt = decimal_to_bcd(time.dt);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_write(date_reg, time.dt);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.mt = decimal_to_bcd(time.mt);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_write(month_reg, time.mt);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.yr = decimal_to_bcd(time.yr);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_write(year_reg, time.yr);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>main.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"LCD_3_Wire.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"I2C.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"DS1307.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">extern struct<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char s;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char m;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char h;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char dy;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char dt;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char mt;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char yr;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}time;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void show_value(unsigned char x_pos, unsigned char y_pos, unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void display_time(void);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0time.s = 30;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0time.m = 58;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0time.h = 23;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0P15_PushPull_Mode;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_clear_home();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(0, 0);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putstr(\"N76E003 I2C RTCC\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS1307_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0set_time();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0while(1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0get_time();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0display_time();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void show_value(unsigned char x_pos, unsigned char y_pos, unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char chr = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0chr = ((value \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putchar(chr);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0chr = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto((x_pos + 1), y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putchar(chr);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void display_time(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0P15 ^= 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(6, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putchar(' ');<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(9, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putchar(' ');<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0delay_ms(400);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0show_value(4, 1, time.h);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0show_value(7, 1, time.m);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0show_value(10, 1, time.s);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(6, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putchar(':');<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(9, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putchar(':');<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0delay_ms(400);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2><span lang=\"EN-GB\">Schematic<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14396\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_Schematic-580x257.png\" alt=\"I2C_Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h6><em>*Note that the pin naming of the chip in the schematic above is wrong. P13 and P14 are both SDA pins according to this naming when actually P13 is SCL and P14 is SDA pin.\u00a0 <\/em><\/h6>\n<h2><span lang=\"EN-GB\">Explanation<\/span><\/h2>\n<p style=\"text-align: justify\">I have coded two files for I2C easy and quick I2C implementation. These are I2C header and source file. These files describe I2C hardware functionality as well as provide higher level functions under the hood of which I2C hardware is manipulated. I have only coded these files for master mode only since barely we would ever need N76E003 slaves. I also didn\u2019t implement interrupt-based I2C functionalities as this, in my experience, is also not needed in most of the cases.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_start(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_stop(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char I2C_read(unsigned char ack_mode);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_write(unsigned char value);<\/span><\/pre>\n<p style=\"text-align: justify\">Using hardware I2C requires us to manipulate the following registers apart from clock and GPIO settings.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-Registers.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14397\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-Registers-580x99.png\" alt=\"I2C Registers\" width=\"580\" height=\"99\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-Registers-580x99.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-Registers-1024x174.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-Registers.png 1118w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">I2C GPIOs must be set as open-drain GPIOs as per I2C standard. I2C clock must be set according to the devices connected in the bus. Typically, I2C clock speed ranges from 20 \u2013 400kHz. This clock speed is dependent on system clock speed Fsys. Therefore, before setting I2C clock speed you have to set\/know Fsys. I2C clock is decided by the value of <strong><em>I2CLK<\/em><\/strong> register. It is basically a prescalar value in master mode.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14399\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C1.png\" alt=\"I2C\" width=\"226\" height=\"53\" \/><\/a><\/p>\n<p style=\"text-align: justify\">So, if Fsys = 16MHz and I<em>2CLK = 39 (0x27)<\/em>, the I2C bus clock rate is 100kHz.<\/p>\n<p style=\"text-align: justify\">Note that only in master I2C clock can be setup. In slave mode, the slave(s) synchronizes automatically with bus clock.<\/p>\n<p style=\"text-align: justify\"><strong><em>I2CON<\/em><\/strong> register is they key register for using I2C. It contains all the flags and condition-makers.<\/p>\n<p style=\"text-align: justify\">For instance, consider the I2C start condition. In order to make a start condition, we have to set the <strong><em>STA<\/em><\/strong> bit and clear I2C interrupt flag, <strong><em>SI<\/em><\/strong>. Since I used polling mode, <strong><em>SI<\/em><\/strong> is polled until it is cleared. This ensures that a start condition has been successfully made. I have also added a software-based timeout feature should there be an issue with the I2C bus. In N76E003, there is a hardware-based approach for timeout too. Note that I didn\u2019t care about the I2C status register states as again this is rarely needed. If you want more grip on the I2C you can follow the BSP examples.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void I2C_start(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 signed int t = timeout_count;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 set_STA;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0clr_SI;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0while((SI == 0) &amp;&amp; (t &gt; 0))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 \u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 t--;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 };\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p style=\"text-align: justify\">Finally, the last register that we will need is the I2C data register (<strong><em>I2DAT<\/em><\/strong>). It is through it we send and receive data from I2C bus.<\/p>\n<p style=\"text-align: justify\">The demo I have shown here is that of a DS1307 I2C-based real time clock. Perhaps this is the simplest device for learning about and understanding I2C.<\/p>\n<h2><span lang=\"EN-GB\">Demo<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_pic.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14400\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_pic-580x338.jpg\" alt=\"I2C_pic\" width=\"580\" height=\"338\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_pic-580x338.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C_pic.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/tsjbRC59m2I?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Serial Peripheral Interface (SPI) \u2013 Interfacing MAX7219 and MAX6675 <\/span><\/h1>\n<p style=\"text-align: justify\">SPI just like I2C is another highly popular form of onboard serial communication. Compared to I2C it is fast and robust. However, it requires more GPIO pins than other communication forms. These make it ideal communication interface for TFT displays, OLED displays, flash memories, DACs, etc.<\/p>\n<p style=\"text-align: justify\">SPI is best realized as a shift register that shifts data in and out with clock pulses. In a SPI bus, there is always one master device which generates clock and selects slave(s). Master sends commands to slave(s). Slave(s) responds to commands sent by the master. The number of slaves in a SPI bus is virtually unlimited. Except the chip selection pin, all SPI devices in a bus can share the same clock and data pins.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Block-Diagram.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14401\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Block-Diagram-580x543.png\" alt=\"SPI Block Diagram\" width=\"580\" height=\"543\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Block-Diagram-580x543.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Block-Diagram.png 599w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">In general, if you wish to know more about SPI bus here are some cool links:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\"><a href=\"https:\/\/learn.mikroe.com\/spi-bus\">https:\/\/learn.mikroe.com\/spi-bus<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\"><a href=\"https:\/\/learn.sparkfun.com\/tutorials\/serial-peripheral-interface-spi\">https:\/\/learn.sparkfun.com\/tutorials\/serial-peripheral-interface-spi<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\"><a href=\"http:\/\/ww1.microchip.com\/downloads\/en\/devicedoc\/spi.pdf\">http:\/\/ww1.microchip.com\/downloads\/en\/devicedoc\/spi.pdf<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\"><a href=\"http:\/\/tronixstuff.com\/2011\/05\/13\/tutorial-arduino-and-the-spi-bus\">http:\/\/tronixstuff.com\/2011\/05\/13\/tutorial-arduino-and-the-spi-bus<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"text-align: justify\"><a href=\"https:\/\/embeddedmicro.com\/tutorials\/mojo\/serial-peripheral-interface-spi\">https:\/\/embeddedmicro.com\/tutorials\/mojo\/serial-peripheral-interface-spi<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"text-align: justify\"><a href=\"http:\/\/www.circuitbasics.com\/basics-of-the-spi-communication-protocol\">http:\/\/www.circuitbasics.com\/basics-of-the-spi-communication-protocol<\/a><\/li>\n<\/ul>\n<h2 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Code<\/span><\/h2>\n<h3><strong>MAX72xx.h<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define MAX72xx_SPI_GPIO_init()\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0do{P00_PushPull_Mode; P10_PushPull_Mode; P11_PushPull_Mode;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define MAX72xx_CS_OUT_HIGH()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_P11<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define MAX72xx_CS_OUT_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 clr_P11<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define NOP\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x02<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x03<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x04<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x05<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x06<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG6\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x07<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DIG7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x08<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define decode_mode_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x09<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define intensity_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a00x0A<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define scan_limit_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a00x0B<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define shutdown_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a00x0C<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_test_reg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a00x0F<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define shutdown_cmd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a00x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define run_cmd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a00x01<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define no_test_cmd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define test_cmd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x01<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_only\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_to_1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_to_2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x02<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_to_3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x03<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_to_4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x04<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_to_5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x05<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_to_6\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x06<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define digit_0_to_7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x07<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define No_decode_for_all\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define Code_B_decode_digit_0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define Code_B_decode_digit_0_to_3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0x0F\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define Code_B_decode_for_all\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 0xFF<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX72xx_SPI_HW_Init(unsigned char clk_value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX72xx_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX72xx_write(unsigned char address, unsigned char value);<\/span><\/pre>\n<h3><strong>MAX72xx.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003_IAR.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"MAX72xx.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX72xx_SPI_HW_Init(unsigned char clk_value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 switch(clk_value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0case 1:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 set_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0case 2:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0case 3:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 set_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0default:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_DISMODF;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_MSTR;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0clr_CPOL;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0clr_CPHA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_SPIEN;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX72xx_init(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_SPI_GPIO_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_SPI_HW_Init(0);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_write(shutdown_reg, run_cmd);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_write(decode_mode_reg, Code_B_decode_digit_0_to_3);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_write(scan_limit_reg, digit_0_to_3);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_write(intensity_reg, 0x19);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX72xx_write(unsigned char address, unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_CS_OUT_LOW();\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0SPDR = address;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0while(!(SPSR &amp; SET_BIT7));\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0clr_SPIF;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0SPDR = value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0while(!(SPSR &amp; SET_BIT7));\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0clr_SPIF;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0MAX72xx_CS_OUT_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>MAX6675.h<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define MAX6675_SPI_GPIO_init() \u00a0\u00a0\u00a0\u00a0do{P01_Input_Mode; P10_PushPull_Mode; P12_PushPull_Mode;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define MAX6675_CS_OUT_HIGH()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_P12<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define MAX6675_CS_OUT_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_P12<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define T_min\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define T_max\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01024<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define count_max\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a04096<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define no_of_pulses\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a016<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define deg_C\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define deg_F\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define tmp_K\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define open_contact\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x04<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define close_contact\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define scalar_deg_C\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00.25<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define scalar_deg_F_1\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01.8<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define scalar_deg_F_2\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a032.0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define scalar_tmp_K\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0273.0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define no_of_samples\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a016<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX6675_SPI_HW_Init(unsigned char clk_value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX6675_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char MAX6675_get_ADC(unsigned int *ADC_data);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">float MAX6675_get_T(unsigned int ADC_value, unsigned char T_unit);<\/span><\/pre>\n<h3><strong>MAX6675.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003_IAR.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"MAX6675.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX6675_SPI_HW_Init(unsigned char clk_value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 switch(clk_value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0case 1:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 set_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0case 2:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0case 3:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 set_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0default:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_SPR1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_SPR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_DISMODF;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_MSTR;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0clr_CPOL;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_CPHA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_SPIEN;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void MAX6675_init(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0MAX6675_SPI_GPIO_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0MAX6675_SPI_HW_Init(0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char MAX6675_get_ADC(unsigned int *ADC_data)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char lb = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char hb = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char samples = no_of_samples;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned int temp_data = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned long avg_value = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0while(samples &gt; 0)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MAX6675_CS_OUT_LOW();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPDR = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(!(SPSR &amp; SET_BIT7));\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 hb = SPDR;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_SPIF;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPDR = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(!(SPSR &amp; SET_BIT7));\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lb = SPDR;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_SPIF;\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MAX6675_CS_OUT_HIGH();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data = hb;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data &lt;&lt;= 8;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data |= lb;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data &amp;= 0x7FFF;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 avg_value += (unsigned long)temp_data;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 samples--;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Timer0_Delay1ms(10);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0temp_data = (avg_value &gt;&gt; 4);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0if((temp_data &amp; 0x04) == close_contact)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*ADC_data = (temp_data &gt;&gt; 3);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return close_contact;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0*ADC_data = (count_max + 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return open_contact;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">float MAX6675_get_T(unsigned int ADC_value, unsigned char T_unit)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0float tmp = 0.0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0tmp = (((float)ADC_value) * scalar_deg_C);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(T_unit)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case deg_F:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp *= scalar_deg_F_1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp += scalar_deg_F_2;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case tmp_K:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tmp += scalar_tmp_K;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0default:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0return tmp;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>main.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003_IAR.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"MAX72xx.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"MAX6675.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned int ti = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned int t = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P15_PushPull_Mode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 MAX6675_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 MAX72xx_init();\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while(1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 P15 = 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_CPOL;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 set_CPHA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 MAX6675_get_ADC(&amp;ti);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 t = ((unsigned int)MAX6675_get_T(ti, tmp_K));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(100);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 P15 = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_CPOL;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_CPHA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 MAX72xx_write(DIG3, ((t \/ 1000) % 10));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 MAX72xx_write(DIG2, ((t \/ 100) % 10));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 MAX72xx_write(DIG1, ((t \/ 10) % 10));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 MAX72xx_write(DIG0, (t % 10));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2><span lang=\"EN-GB\">Schematic<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14403\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Schematic-580x243.png\" alt=\"SPI Schematic\" width=\"580\" height=\"243\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Schematic-580x243.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Schematic.png 890w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2><span lang=\"EN-GB\">Explanation<\/span><\/h2>\n<p style=\"text-align: justify\">With SPI we have to deal with two things \u2013 first, the initialization and second, the data transfer process. Configuring SPI needs a few things to be set up. These are:<\/p>\n<ul style=\"text-align: justify\">\n<li>SPI communication bus speed or simply clock speed<\/li>\n<li>Clock polarity<\/li>\n<li>Clock phase<\/li>\n<li>Orientation of data, i.e. MSB first or LSB first<\/li>\n<li>Master\/slave status<\/li>\n<li>Optionally hardware slave selection pin use<\/li>\n<\/ul>\n<p style=\"text-align: justify\">Most of these can be done by manipulating the following registers:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Registers.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14402\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Registers-580x161.png\" alt=\"SPI Registers\" width=\"580\" height=\"161\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Registers-580x161.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Registers.png 769w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\"><strong><em>SPCR<\/em><\/strong> configures the hardware SPI peripheral of N76E003 while <strong><em>SPDR<\/em><\/strong> is used for transferring data.<\/p>\n<p style=\"text-align: justify\">To aid in all these I have coded the following functions. Though I didn\u2019t use these code snippets in the actual demo code for demonstration purposes, these will most certainly work and reduce coding effort.<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void SPI_init(unsigned char clk_speed, unsigned char mode)<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_SPI_clock_rate(clk_speed);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_SPI_mode(mode);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_DISMODF;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_MSTR;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_SPIEN;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\n\n\n\n<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char SPI_transfer(unsigned char write_value)<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 signed int t = timeout_count;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 register unsigned char read_value = 0x00;<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 SPDR = write_value;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while((!(SPSR &amp; SET_BIT7)) &amp;&amp; (t &gt; 0))<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 t--;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 };\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 read_value = SPDR;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 clr_SPIF;\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 return read_value;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p style=\"text-align: justify\"><strong><em>SPI_init <\/em><\/strong>function sets up the SPI peripheral using two information \u2013 the bus clock speed and SPI data transfer mode. It initializes the SPI hardware as a SPI master device and without hardware salve selection pin. This configuration is mostly used in common interfacings. Only mode and clock speed are the variables. In the demo, it is visible that MAX7219 and MAX6675 work with different SPI modes. I also didn\u2019t use the hardware slave selection because there are two devices and one slave pin. Certainly, both external devices are not driven at the same time although both share the same bus lines.<\/p>\n<p style=\"text-align: justify\"><strong><em>SPI_transfer<\/em><\/strong> reads and writes on the SPI bus. Here the master writes to the slave first, waits for successful transmission and reads from the slave later. It is best realized by the following figure:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Loop.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14405\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Loop-580x221.png\" alt=\"SPI-Loop\" width=\"580\" height=\"221\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Loop-580x221.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-Loop.png 673w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">To demo SPI, MAX6675 and MAX7219 were used because one lacked read feature while the other lacked write feature. In the demo, MAX6675 is read to measure the temperature sensed by the K-type thermocouple attached with it and display the measured temperature in Kelvin on MAX7219-based seven segment display arrays.<\/p>\n<h2><span lang=\"EN-GB\">Demo<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14406\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-580x442.jpg\" alt=\"SPI\" width=\"580\" height=\"442\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-580x442.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/0E-nOCFYh54?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0in\"><span lang=\"EN-GB\">One Wire (OW) Communication \u2013 Interfacing DHT11<\/span><\/h1>\n<p style=\"text-align: justify\">One protocol is not a standard protocol like I2C or SPI. It is just a mere method of communicating with a device that uses just one wire. There are a few devices that uses such principle for communication. DHT series sensors, DS18B20s, digital serial number chips, etc. are a few to mention. As I stated before, since one wire communication doesn\u2019t belong to a dedicated format of communication, there is no dedicated hardware for it. With just a bidirectional GPIO pin we can implement one wire communication. Optionally we can also use a timer for measuring response pulse widths since the method of sending ones and zeroes over one wire requires the measurement of pulse durations. This way of encoding ones and zeros as a function of pulse width is called time-slotting.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DHT11-Timing-Diagram.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14408\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DHT11-Timing-Diagram.jpg\" alt=\"DHT11 Timing Diagram\" width=\"569\" height=\"185\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Shown above is the timing diagram for DHT11\u2019s time slots. Check the length of pulse high time for one and zero. This is the technique applied in time-slotting mechanism. We have to time pulse lengths in order to identify the logic states.<\/p>\n<h2 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Code<\/span><\/h2>\n<h3><strong>DHT11.h<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define HIGH\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LOW \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DHT11_pin_init()\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0P05_Quasi_Mode\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DHT11_pin_HIGH()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_P05<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DHT11_pin_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P05<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DHT11_pin_IN()\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0P05\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DHT11_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char get_byte(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char get_data(void);<\/span><\/pre>\n<h3><strong>DHT11.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"DHT11.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">extern unsigned char values[5];<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DHT11_init(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 DHT11_pin_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 delay_ms(1000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char get_byte(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char s = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char value = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 for(s = 0; s &lt; 8; s++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 value &lt;&lt;= 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 while(DHT11_pin_IN() == LOW);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 if(DHT11_pin_IN() == HIGH)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value |= 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 while(DHT11_pin_IN() == HIGH);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 return value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char get_data(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 short chk = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char s = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char check_sum = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 DHT11_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 DHT11_pin_LOW();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 delay_ms(18);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 DHT11_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 delay_us(26);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 chk = DHT11_pin_IN();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 if(chk)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 return 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 delay_us(80);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 chk = DHT11_pin_IN();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 if(!chk)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 return 2;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 delay_us(80);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 for(s = 0; s &lt;= 4; s += 1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 values[s] = get_byte();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 DHT11_pin_HIGH();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 for(s = 0; s &lt; 4; s += 1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 check_sum += values[s];<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 if(check_sum != values[4])<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 return 3;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>main.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"LCD_2_Wire.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"DHT11.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char values[5];<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">const unsigned char symbol[8] =<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 0x00, 0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_symbol(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned char value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char state = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 setup();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while(1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 state = get_data();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 switch(state)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 1:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 2:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"No Sensor Found!\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 3:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"Checksum Error!\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0default:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"R.H\/ %:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(14, 0, values[0]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"Tmp\/\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(4, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_send(0, DAT);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(5, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"C:\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((values[2] &amp; 0x80) == 1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(13, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"-\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(13, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\" \");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(14, 1, values[2]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 delay_ms(1000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 DHT11_init();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0LCD_init();\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 lcd_symbol();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_symbol(void)\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char s = 0;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(0x40, CMD);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt; 8; s++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_send(symbol[s], DAT);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(0x80, CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0unsigned char chr = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0chr = ((value \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0LCD_putchar(chr);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0chr = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0LCD_goto((x_pos + 1), y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0LCD_putchar(chr);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2><span lang=\"EN-GB\">Schematic<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DH11-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14407\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DH11-Schematic-580x257.png\" alt=\"DH11 Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DH11-Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DH11-Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2><span lang=\"EN-GB\">Explanation<\/span><\/h2>\n<p style=\"text-align: justify\">As stated earlier, OW basically needs two things \u2013 first, the control of a single GPIO pin and second, the measurement of time. I would like to highlight the most important part of the whole code here:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char get_byte(void)<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char s = 0;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 unsigned char value = 0;<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 for(s = 0; s &lt; 8; s++)<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 value &lt;&lt;= 1;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 while(DHT11_pin_IN() == LOW);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(30);<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 if(DHT11_pin_IN() == HIGH)<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value |= 1;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 while(DHT11_pin_IN() == HIGH);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 return value;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p style=\"text-align: justify\">From DHT11\u2019s timing diagram, we know that a zero is define by a pulse of 26 &#8211; 28\u03bcs and a logic one is defined by a pulse of 70\u03bcs. It is here in the <strong><em>get_byte<\/em><\/strong> function we check the pulse coming from DHT11. The DHT11\u2019s pin is polled as an input and after 30\u03bcs if the result of this polling is high then it is considered as a logic one or else it is considered otherwise. Once triggered, DHT11 will provide a 5-byte output. All of the bits in these 5 bytes are checked this way. Though it is not the best method to do so, it is easy and simple.<\/p>\n<h2><span lang=\"EN-GB\">Demo<\/span><\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DHT11.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14409\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DHT11-580x279.jpg\" alt=\"DHT11\" width=\"580\" height=\"279\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DHT11-580x279.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DHT11.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/1Zetmad3fLU?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0in\"><span lang=\"EN-GB\">One Wire (OW) Communication \u2013 Interfacing DS18B20<\/span><\/h1>\n<p style=\"text-align: justify\">One wire communication, as stated previously, doesn\u2019t have a defined protocol. Except for the time-slotting mechanism part, there is nothing in common across the devices using this form of communication. We have seen how to interface a DHT11 relative humidity and temperature sensor previously. In this segment, we will see how to interface a DS18B20 one-wire digital temperature sensor with N76E003. DS18B20 follows and uses a completely different set of rules for communication.<\/p>\n<h2 style=\"margin-top: 0in\"><span lang=\"EN-GB\">Code<\/span><\/h2>\n<h3><strong>one_wire.h<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DS18B20_GPIO_init()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0P06_OpenDrain_Mode<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DS18B20_IN()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0P06<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DS18B20_OUT_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0clr_P06<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DS18B20_OUT_HIGH()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0set_P06<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define TRUE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define FALSE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char onewire_reset(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void onewire_write_bit(unsigned char bit_value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char onewire_read_bit(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void onewire_write(unsigned char value);\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char onewire_read(void);<\/span><\/pre>\n<h3><strong>one_wire.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"one_wire.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char onewire_reset(void)\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned char res = FALSE;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 DS18B20_GPIO_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_LOW();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_us(480);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_us(60);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 res = DS18B20_IN();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 delay_us(480);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 return res;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void onewire_write_bit(unsigned char bit_value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS18B20_OUT_LOW();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0if(bit_value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_us(104);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DS18B20_OUT_HIGH();\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char onewire_read_bit(void)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS18B20_OUT_LOW();\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS18B20_OUT_HIGH();\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 delay_us(15);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0return(DS18B20_IN());\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void onewire_write(unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned char s = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 while(s &lt; 8)\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((value &amp; (1 &lt;&lt; s)))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_LOW();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0nop;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_HIGH();\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(60);\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_LOW();\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(60);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_HIGH();\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nop;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s++;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char onewire_read(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned char s = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 unsigned char value = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 while(s &lt; 8)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_LOW();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nop;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DS18B20_OUT_HIGH();\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(DS18B20_IN())\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value |=\u00a0 (1 &lt;&lt; s);\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(60);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s++;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 return value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>DS18B20.h<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"one_wire.h\"\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define convert_T\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x44<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define read_scratchpad\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00xBE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define write_scratchpad\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x4E<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define copy_scratchpad\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x48\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define recall_E2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00xB8<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define read_power_supply\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00xB4\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define skip_ROM\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00xCC<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define resolution\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a012<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DS18B20_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">float DS18B20_get_temperature(void);\u00a0<\/span><\/pre>\n<h3><strong>DS18B20.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"DS18B20.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void DS18B20_init(void)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0onewire_reset();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0delay_ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">float DS18B20_get_temperature(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char msb = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char lsb = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0register float temp = 0.0;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0onewire_reset();\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0onewire_write(skip_ROM);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0onewire_write(convert_T);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(resolution)\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 12:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_ms(750);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 11:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_ms(375);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 10:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_ms(188);\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 9:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_ms(94);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0onewire_reset();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0onewire_write(skip_ROM);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0onewire_write(read_scratchpad);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0lsb = onewire_read();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0msb = onewire_read();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0temp = msb;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0temp *= 256.0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0temp += lsb;<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(resolution)\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 12:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0temp *= 0.0625;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 11:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0temp *= 0.125;\u00a0\u00a0\u00a0 \u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 10:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0temp *= 0.25;\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case 9:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0temp *= 0.5;\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0} \u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0delay_ms(40);\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0return (temp);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3><strong>main.c<\/strong><\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"DS18B20.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"LCD_3_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">const unsigned char symbol[8] =<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 0x00, 0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_symbol(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_C(unsigned char x_pos, unsigned char y_pos, signed int value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_I(unsigned char x_pos, unsigned char y_pos, signed long value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_D(unsigned char x_pos, unsigned char y_pos, signed int value, unsigned char points);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_F(unsigned char x_pos, unsigned char y_pos, float value, unsigned char points);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0float t = 0.0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0DS18B20_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0lcd_symbol();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(0, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putstr(\"N76E003 DS18B20\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putstr(\"T\/ C\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(2, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_send(0, DAT);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0while(1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t = DS18B20_get_temperature();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print_F(9, 1, t, 3);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0delay_ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_symbol(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char s = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_send(0x40, CMD);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 for(s = 0; s &lt; 8; s++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_send(symbol[s], DAT);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_send(0x80, CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_C(unsigned char x_pos, unsigned char y_pos, signed int value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 char ch[5] = {0x20, 0x20, 0x20, 0x20, '\\0'};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 if(value &lt; 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x2D;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 if((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 else if((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 else if((value &gt;= 0) &amp;&amp; (value &lt;= 9))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 LCD_putstr(ch);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_I(unsigned char x_pos, unsigned char y_pos, signed long value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 char ch[7] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, '\\0'};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(value &lt; 0)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x2D;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(value &gt; 9999)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value \/ 10000) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 10000)\/ 1000) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = (((value % 1000) \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = (((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if((value &gt; 999) &amp;&amp; (value &lt;= 9999))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 10000)\/ 1000) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 1000) \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = (((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 1000) \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putstr(ch);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_D(unsigned char x_pos, unsigned char y_pos, signed int value, unsigned char points)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 char ch[5] = {0x2E, 0x20, 0x20, '\\0'};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 ch[1] = ((value \/ 100) + 0x30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(points &gt; 1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value \/ 10) % 10) + 0x30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(points &gt; 1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putstr(ch);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void print_F(unsigned char x_pos, unsigned char y_pos, float value, unsigned char points)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 signed long tmp = 0x0000;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 tmp = value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 print_I(x_pos, y_pos, tmp);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 tmp = ((value - tmp) * 1000);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(tmp &lt; 0)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp = -tmp;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(value &lt; 0)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(0x2D);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(0x20);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if((value &gt;= 10000) &amp;&amp; (value &lt; 100000))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_D((x_pos + 6), y_pos, tmp, points);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if((value &gt;= 1000) &amp;&amp; (value &lt; 10000))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_D((x_pos + 5), y_pos, tmp, points);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if((value &gt;= 100) &amp;&amp; (value &lt; 1000))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_D((x_pos + 4), y_pos, tmp, points);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if((value &gt;= 10) &amp;&amp; (value &lt; 100))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_D((x_pos + 3), y_pos, tmp, points);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if(value &lt; 10)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_D((x_pos + 2), y_pos, tmp, points);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2>Schematic<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DS18B20-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14412\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DS18B20-Schematic-580x257.png\" alt=\"DS18B20 Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DS18B20-Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/DS18B20-Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">One wire communication is detailed in these application notes from Maxim:<\/p>\n<p style=\"text-align: justify\"><a href=\"https:\/\/www.maximintegrated.com\/en\/app-notes\/index.mvp\/id\/126\">https:\/\/www.maximintegrated.com\/en\/app-notes\/index.mvp\/id\/126<\/a><\/p>\n<p style=\"text-align: justify\"><a href=\"https:\/\/www.maximintegrated.com\/en\/app-notes\/index.mvp\/id\/162\">https:\/\/www.maximintegrated.com\/en\/app-notes\/index.mvp\/id\/162<\/a><\/p>\n<p style=\"text-align: justify\">These notes are all that are needed for implementing the one wire communication interface for DS18B20. Please go through these notes. The codes are self-explanatory and are implemented from the code examples in these app notes.<\/p>\n<h2><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ds18b20.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14432 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ds18b20-580x534.png\" alt=\"ds18b20\" width=\"580\" height=\"534\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ds18b20-580x534.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ds18b20-1024x942.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ds18b20.png 1149w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/span><\/h2>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/uOq7etfuqvg?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Decoding NEC IR Remote Protocol<\/h1>\n<p style=\"text-align: justify\">IR remote controllers are used in a number of devices for remotely controlling them. Examples of these devices include TV, stereo, smart switches, projectors, etc. IR communication as such is unidirectional and in a way one wire communication. Ideally there is one transmitter and one receiver only.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Remote.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14415\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Remote.jpg\" alt=\"IR Remote\" width=\"540\" height=\"540\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Remote.jpg 540w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Remote-150x150.jpg 150w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Remote-90x90.jpg 90w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Data to be sent from a remote transmitter is sent by modulating it with a carrier wave (usually between 36kHz to 40kHz). Modulation ensure safety from data corruption and long-distance transmission. An IR receiver at the receiving end receives and demodulates the sent out modulated data and outputs a stream of pulses. These pulses which vary in pulse widths\/timing\/position\/phase carry the data information that was originally sent by the remote transmitter. How the pulses should behave is governed closely by a protocol or defined set of rules. In most micros, there is no dedicated hardware for decoding IR remote protocols. A micro that needs to decode IR remote data also doesn\u2019t know when it will be receiving an IR data stream. Thus, a combination of external interrupt and timer is needed for decoding IR data.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14416\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC.png\" alt=\"NEC\" width=\"340\" height=\"200\" \/><\/a><\/p>\n<p style=\"text-align: justify\">In this segment, we will see how we can use an external interrupt and a timer to easily decode a NEC IR remote. This same method can be applied to any IR remote controller. At this stage, I recommend that you do a study of NEC IR protocol from <a href=\"https:\/\/www.sbprojects.net\/knowledge\/ir\/nec.php\">here<\/a>. SB-Project\u2019s website is an excellent page for info as such.<\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"LCD_2_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define sync_high\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 22000<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define sync_low\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 14000<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define one_high\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3600<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define one_low\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2400<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define zero_high\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1800<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define zero_low\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1200<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">bit received;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char bits = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int frames[33];<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_Timer_0(unsigned int value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int get_Timer_0(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void erase_frames(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char decode(unsigned char start_pos, unsigned char end_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void decode_NEC(unsigned char *addr, unsigned char *cmd);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned char value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void EXTI0_ISR(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">interrupt 0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0frames[bits] = get_Timer_0();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0bits++;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_TR0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0if(bits &gt;= 33)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 received = 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 clr_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 clr_TR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_Timer_0(0x0000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0P15 = ~P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char address = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char command = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0setup();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while(1)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 {\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 if(received)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 decode_NEC(&amp;address, &amp;command);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 0, address);\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 1, command);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 erase_frames();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void setup(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0erase_frames();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P15_PushPull_Mode;\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 TIMER0_MODE1_ENABLE;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_Timer_0(0x0000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_IT0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_EX0;\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_EA;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0LCD_init();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(0, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"Address:\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"Command:\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_Timer_0(unsigned int value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 TH0 = ((value &amp;&amp; 0xFF00) &gt;&gt; 8);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 TL0 = (value &amp; 0x00FF);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int get_Timer_0(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned int value = 0x0000;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value = TH0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value &lt;&lt;= 8;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value |= TL0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 return value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void erase_frames(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0for(bits = 0; bits &lt; 33; bits++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0frames[bits] = 0x0000;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_Timer_0(0x0000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0received = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0bits = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char decode(unsigned char start_pos, unsigned char end_pos)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0unsigned char value = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0for(bits = start_pos; bits &lt;= end_pos; bits++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0value &lt;&lt;= 1;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0if((frames[bits] &gt;= one_low) &amp;&amp; (frames[bits] &lt;= one_high))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value |= 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0else if((frames[bits] &gt;= zero_low) &amp;&amp; (frames[bits] &lt;= zero_high))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value |= 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0else if((frames[bits] &gt;= sync_low) &amp;&amp; (frames[bits] &lt;= sync_high))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return 0xFF;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0return value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void decode_NEC(unsigned char *addr, unsigned char *cmd)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0*addr = decode(2, 9);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0*cmd = decode(18, 25);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar((value \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 1), y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar(((value % 10) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 2), y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2>Schematic<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14417\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Schematic-580x257.png\" alt=\"IR Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">A NEC transmission sends out 33 pulses. The first one is a sync bit and the rest 32 contain address and command info. These 32 address and command bits can be divided into 4 groups \u2013 address, command, inverted address and inverted command. The first 16 bits contain address and inverted address while the rest contain command and inverted command. The inverted signals can be used against the non-inverted ones for checking signal integrity.<\/p>\n<p style=\"text-align: justify\">We already know that IR data is received as a steam of pulses. Pulses represent sync bit or other info, ones and zeros. In case of NEC IR protocol, the pulses have variable lengths. Sync bit represented by a pulse of 9ms high and 4.5ms low \u2013 total pulse time is 13.5ms. Check the timing diagram below. Please note that in this timing diagram the blue pulses are from the transmitter\u2019s output and the yellow ones are those received by the receiver. Clearly the pulses are inverted.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-Sync.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14418\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-Sync.png\" alt=\"NEC Sync\" width=\"375\" height=\"240\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Logic one is represented by a pulse of 560\u00b5s high time and 2.25ms of low time \u2013 total pulse time is 2.81ms. Likewise, logic zero is represented by a pulse of 560\u00b5s high time and 1.12ms of low time \u2013 total pulse time is 1.68ms.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-High-Low.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14419\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-High-Low-580x246.png\" alt=\"NEC High Low\" width=\"580\" height=\"246\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-High-Low-580x246.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-High-Low.png 730w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">These timings can vary slightly about 15 &#8211; 25% due to a number of factors like medium, temperature, etc. Therefore, we can assume the following timings:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14420\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-580x108.png\" alt=\"IR\" width=\"580\" height=\"108\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR-580x108.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/IR.png 820w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Now as per timing info and timing diagram we have to detect falling edges and time how long it takes to detect another falling edge. In this way, we can time the received pulses and use the pulse time info to decode a received signal.<\/p>\n<p style=\"text-align: justify\">In the demo, I used external interrupt channel EXTI0 and Timer 0. The system clock frequency is set to 16MHz with HIRC. Timer 0 is set in Mode 1 and its counter is rest to 0 count. EXTI0 is set to detect falling edges. Note that the timer is set but not started.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">TIMER0_MODE1_ENABLE;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_Timer_0(0x0000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_IT0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EX0;\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EA;<\/span><\/pre>\n<p>Also note that each tick of Timer 0 here is about:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14421\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC1.png\" alt=\"NEC\" width=\"519\" height=\"78\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Based on this tick info, we can deduce the maximum and minimum pulse durations as like:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define sync_high\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 22000 \/\/ 22000 \u00d7 0.75ms = 16.5ms<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define sync_low\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 14000 \/\/ 14000 \u00d7 0.75ms = 10.5ms<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define one_high\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3600 \/\/ 3600 \u00d7 0.75ms = 2.7ms<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define one_low\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2400 \/\/ 2400 \u00d7 0.75ms = 1.8ms<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define zero_high\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1800 \/\/ 1800 \u00d7 0.75ms = 1.35ms<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define zero_low\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1200 \/\/ 1200 \u00d7 0.75ms = 0.9ms<\/span><\/pre>\n<p style=\"text-align: justify\">Now when an IR transmission is received, an interrupt will be triggered. Therefore, in the ISR, we immediately capture the timer\u2019s tick count and reset it. When all 33 pulses have been received this way, we temporarily halt all interrupts by disabling the global interrupt and stop the timer in order to decode the received signal. P15 is also toggled to demonstrate reception.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void EXTI0_ISR(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">interrupt 0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0frames[bits] = get_Timer_0();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0bits++;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_TR0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0if(bits &gt;= 33)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 received = 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 clr_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 clr_TR0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_Timer_0(0x0000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0P15 = ~P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p style=\"text-align: justify\">Now the signal is decoded in the <strong><em>decode<\/em><\/strong> function. This function scans a fixed length of time frames for sync, ones and zeros and return the value obtained by scanning the time info of the pulses. In this way, a received signal is decoded.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char decode(unsigned char start_pos, unsigned char end_pos)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0unsigned char value = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0for(bits = start_pos; bits &lt;= end_pos; bits++)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0value &lt;&lt;= 1;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0if((frames[bits] &gt;= one_low) &amp;&amp; (frames[bits] &lt;= one_high))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value |= 1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0else if((frames[bits] &gt;= zero_low) &amp;&amp; (frames[bits] &lt;= zero_high))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value |= 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0else if((frames[bits] &gt;= sync_low) &amp;&amp; (frames[bits] &lt;= sync_high))<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return 0xFF;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0}<\/span><\/pre>\n<pre><\/pre>\n<p>\u00a0<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0return value;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p style=\"text-align: justify\">In the main loop, the decode info are displayed on a text LCD.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14422\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-580x552.jpg\" alt=\"NEC\" width=\"580\" height=\"552\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC-580x552.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/NEC.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/9xFYY9zVkFQ?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Epilogue<\/h1>\n<p style=\"text-align: justify\">After going through all these topics and exploring the N76E003 to the finest details, I have to say that just like flagship killer cell phones, this is a flagship killer 8-bit microcontroller. In terms of price vs feature ratio, it is a winner. I\u2019m truly impressed by its performance and hardware features. It offers something like an 8051 but with more advanced modern features. Old-school 8051 users will surely love to play with it.<\/p>\n<p style=\"text-align: justify\">Every day we talk about software piracy and hacking but little effort is done to prevent them. Students, hobbyists and low-profile business houses can\u2019t afford to use the expensive Keil\/IAR compiler. They often go for pirated versions of these software and this is a very wrong path to follow. Like I said in my first post on N76E003, Nuvoton has rooms for making its devices more popular by investing on a compiler of its own or at least start doing something with free Eclipse-IDE.<\/p>\n<p>All files and code examples can be downloaded from <a href=\"https:\/\/github.com\/sshahryiar\/Nuvoton-N76E003-Tutorial\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=xZ5gkk6WQpw&amp;list=PL-EErZRpDPIXmXL_Oo9v1j2PD8scq3VkW\" target=\"_blank\" rel=\"noopener noreferrer\">Youtube playlist.<\/a><\/p>\n<p style=\"text-align: justify\">Happy coding.<\/p>\n<p><em>Author: Shawon M. Shahryiar<\/em><\/p>\n<p><em><a href=\"https:\/\/www.youtube.com\/user\/sshahryiar\">https:\/\/www.youtube.com\/user\/sshahryiar<\/a><\/em><\/p>\n<p><em><a href=\"https:\/\/www.facebook.com\/groups\/microarena\/\">https:\/\/www.facebook.com\/groups\/microarena<\/a><\/em><\/p>\n<p><em><a href=\"https:\/\/www.facebook.com\/MicroArena?ref=hl\">https:\/\/www.facebook.com\/MicroArena<\/a><\/em><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/em><\/p>\n<p><em>06.08.2018<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is a continuation of the previous post on Nuvoton N76E003 microcontroller\u00a0here.<\/p>\n","protected":false},"author":5,"featured_media":14384,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1723],"tags":[1646,1722,1731,1729,1728,1721,1720],"class_list":["post-14383","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nuvoton","tag-8-bit-microcontroller","tag-1722","tag-communication","tag-iar","tag-keil","tag-n76e003","tag-nuvoton"],"_links":{"self":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/14383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/comments?post=14383"}],"version-history":[{"count":11,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/14383\/revisions"}],"predecessor-version":[{"id":15410,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/14383\/revisions\/15410"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media\/14384"}],"wp:attachment":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=14383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=14383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=14383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}