{"id":14253,"date":"2018-08-05T22:32:11","date_gmt":"2018-08-06T02:32:11","guid":{"rendered":"http:\/\/embedded-lab.com\/blog\/?p=14253"},"modified":"2019-12-16T10:34:50","modified_gmt":"2019-12-16T15:34:50","slug":"getting-started-nuvoton-8-bit-microcontrollers-coding-part-1","status":"publish","type":"post","link":"https:\/\/embedded-lab.com\/blog\/getting-started-nuvoton-8-bit-microcontrollers-coding-part-1\/","title":{"rendered":"Getting Started with Nuvoton 8-bit Microcontrollers &#8211; Coding Part 1"},"content":{"rendered":"<p>This post is a continuation of the first post on Nuvoton N76E003 microcontroller <a href=\"http:\/\/embedded-lab.com\/blog\/getting-started-nuvoton-8-bit-microcontrollers\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l1600.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14270\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l1600-580x397.jpg\" alt=\"s-l1600\" width=\"580\" height=\"397\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l1600-580x397.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/s-l1600.jpg 639w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">About the N76E006 Test Board<\/h1>\n<p style=\"text-align: justify\">Shown below are the actual photo, the PCB layout and the schematic of the unofficial cheap N76E003 test\/development board. This is the board I will be using in this tutorial series.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/board.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14254\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/board.png\" alt=\"board\" width=\"575\" height=\"415\" \/><\/a><\/p>\n<p style=\"text-align: justify\">There is nothing much about the 30mm x 43.5mm board. Everything is visible and neat. However, having the schematic alongside the board layout in possession is a great advantage. There are two sidewise header that bring out the GPIO pins and positive supply rails. There is another header opposite to the USB port. This header is for connecting a Nulink programmer-debugger interface and it also has a serial port interface brought out straight from the N76E003 chip. This serial port is useful for quickly debugging\/testing stuffs with a serial port monitor. There is an LED connected with P15 pin via a computer jumper. The only thing that is wrong in this board is the crystal resonator part. N76E003 has an external clock input pin but it is meant to be used with active oscillators\/crystal modules. In the official, SDK there is no such points to connect an external crystal resonator.\u00a0 The internal high frequency oscillator is accurate enough for most cases.<\/p>\n<p style=\"text-align: justify\">At this point, I would like to thank Electro Dragon for these images because they are the only ones who shared these resources online.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2018-02-12_235823.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14255\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2018-02-12_235823-580x356.png\" alt=\"2018-02-12_235823\" width=\"580\" height=\"356\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2018-02-12_235823-580x356.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2018-02-12_235823-1024x628.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2018-02-12_235823.png 1314w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Shown below is the official SDK board\u2019s schematic:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Official-SDK-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14256\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Official-SDK-Schematic-580x362.png\" alt=\"Official SDK Schematic\" width=\"580\" height=\"362\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Official-SDK-Schematic-580x362.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Official-SDK-Schematic.png 894w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Coding Nuvoton N76E003<\/h1>\n<p style=\"text-align: justify\">When entering a new environment, things are not very easy at first. It takes times to get acquainted with new the new environment, new tools and new stuffs. New means everything different from the ones that you have been using prior to its introduction. In many occasions, I had trouble playing with new microcontrollers due to this. However, after some decent play offs things unfolded themselves.<\/p>\n<p style=\"text-align: justify\">President JFK\u2019s speech on lunar landing should be an inspirational note for everyone who is trying to do something new or something that he\/she has never done before:<\/p>\n<blockquote>\n<p style=\"text-align: justify\"><em><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard; because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one we intend to win, and the others, too.<\/span><\/em><\/p>\n<\/blockquote>\n<p style=\"text-align: justify\">Both Keil and IAR are excellent tools for coding Nuvoton MCUs. I have used both and everything is same in both cases. Literally there is no difference at all. I won\u2019t recommend which one to use and I leave the choice to the readers. However, there are some areas where you may find difficulty porting codes of one compiler to the other. The table below summarizes some of these differences.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/keil-vs-iar.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14259\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/keil-vs-iar-580x403.png\" alt=\"keil vs iar\" width=\"580\" height=\"403\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/keil-vs-iar-580x403.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/keil-vs-iar.png 610w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Two more things I would like to highlight here. Firstly, both Keil and IAR compiler can throw some errors during code compilations. Most of these errors are due to BSP definitions. One such error is in the line below:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/error.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14260\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/error-580x37.png\" alt=\"error\" width=\"580\" height=\"37\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/error-580x37.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/error.png 848w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">If you try to use <strong><em>set_P0S_6<\/em><\/strong> definition, IAR sometimes throws an error because it can\u2019t find <strong><em>BIT_TMP<\/em><\/strong>. However, there are other similar definitions that don\u2019t throw such error and in Keil you won\u2019t notice something like this. Such things are nasty illogical surprises. We have to understand that the BSPs are still in development. Always remember that the datasheet is your friend. I suggest that when you try out the examples I have shown here, you read the relevant parts of the datasheet to enhance learning and understanding.<\/p>\n<p style=\"text-align: justify\">The other thing to note is the fact that not always we have the luxury to avoid register-level coding and so when needed we must have the right knowledge to use them. We can also use bit-level manipulations as shown below:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14261\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding-580x193.png\" alt=\"Coding\" width=\"580\" height=\"193\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding-580x193.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding-420x140.png 420w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding.png 729w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Sometimes but not always, we have to code things the old ways. Sometimes mixing assembly code with C code becomes a necessity. For instance, the software delay library uses this concept.<\/p>\n<p style=\"text-align: justify\">There are other aspects to consider too like case sensitivity and coding conventions. It is wise to choose interrupt-driven methods over polling-based ones. Codes should be included in hierarchical orders. Like such there are tons of stuffs to make your code smart and error-free. The best source of knowledge of such things and much more are app notes of various manufacturers.<\/p>\n<p style=\"text-align: justify\">Whenever making a new library, add the followings in your library\u2019s source code along with other header files of your choice to avoid errors and nasty surprises:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Common-Headers.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14262\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Common-Headers-580x70.png\" alt=\"Common Headers\" width=\"580\" height=\"70\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Common-Headers-580x70.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Common-Headers.png 793w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Additionally, I have made a set of files called \u201c<strong><em>Extended_Functions<\/em><\/strong>\u201d. Here I added all the functions that we will need almost every time when we deal with common internal hardware like timers, ADC, etc. These files are like repositories of all the additional functions that I made for some internal hardware \u2013 something that Nuvoton didn\u2019t provide and something that makes coding lot easier. I&#8217;ll share these and all the codes with the PDF of the tutorials after Part 2 of this tutorial series.<\/p>\n<p style=\"text-align: justify\">Here I&#8217;m sharing two videos to demonstrate how to code and add custom-made library files in both Keil C51 and IAR Embedded-Workbench compliers.<\/p>\n<p style=\"text-align: justify\"><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/m1roxhCM6T8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/p_dvXF4zmqI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><br \/>\n<!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">General Purpose Input-Output (GPIO)<\/h1>\n<p style=\"text-align: justify\">GPIOs are the most common hardware that we use in a microcontroller. Since N76E003 is based on 8051 architecture, we should be getting some similarities with the old school 8051s. Shown below is the hardware schematic of N76E003\u2019s GPIO block:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-Structure.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14263\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-Structure.png\" alt=\"GPIO Structure\" width=\"541\" height=\"256\" \/><\/a><\/p>\n<p style=\"text-align: justify\">On close inspection, we can realize that this structure has striking resemblance with the GPIO structure of a typical 8051 microcontroller as shown below:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/8051-GPIO.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14265\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/8051-GPIO-580x323.png\" alt=\"8051 GPIO\" width=\"580\" height=\"323\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/8051-GPIO-580x323.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/8051-GPIO.png 654w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Thus, we can expect similar behaviour.<\/p>\n<p style=\"text-align: justify\">There are four GPIO modes and these are as follows:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-types.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14264\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-types-580x195.png\" alt=\"GPIO types\" width=\"580\" height=\"195\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-types-580x195.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-types-420x140.png 420w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-types.png 609w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\"><em><strong>PxM1.n<\/strong><\/em> and <strong><em>PxM2.n<\/em><\/strong> bits decide these modes. For most cases, we can stick to push-pull and input modes as they are the most commonly used ones.<\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"N76E003_iar.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void setup(void);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0setup();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 while(1)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(P05 != 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 Timer0_Delay1ms(900);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 set_P15;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(100);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 clr_P15;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(100);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void setup(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 P15_PushPull_Mode;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 P05_Input_Mode;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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\/GPIO_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14266\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Schematic-580x299.png\" alt=\"GPIO_Schematic\" width=\"580\" height=\"299\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Schematic-580x299.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Schematic.png 1006w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">The <strong><em>Function_define <\/em><\/strong>BSP header file states GPIO modes as follows:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14268\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def-580x221.png\" alt=\"GPIO_Def\" width=\"580\" height=\"221\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def-580x221.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def.png 783w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Similarly, <strong><em>SFR_Macro<\/em><\/strong> BSP header file defines the bit-level setting of all N76E003 registers. To set the logic level of GPIO pins we can use the following definitions:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14267\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def2-580x94.png\" alt=\"GPIO_Def2\" width=\"580\" height=\"94\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def2-580x94.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO_Def2.png 785w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">However, these don\u2019t restrict us from using classical register-level coding. <strong><em>N76E003<\/em><\/strong> header file states all the registers present in it.<\/p>\n<p style=\"text-align: justify\">For port\/pin reading I didn\u2019t see any function definition as like one I already discussed. Thus, there are two ways to do it on your own. The following as two examples of such:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14269\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding-2-580x235.png\" alt=\"Coding 2\" width=\"580\" height=\"235\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding-2-580x235.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Coding-2.png 789w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The demo here is a simple one. The onboard LED connected to P15 pin is toggled at a fixed interval. When a button connected to P05 is pressed the off time of the LED is increased, affecting toggle rate.<\/p>\n<h2 style=\"margin-top: 0cm\">Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14271\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-580x586.jpg\" alt=\"GPIO\" width=\"580\" height=\"586\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-580x586.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO-90x90.jpg 90w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/GPIO.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\/Y215BXukqBk?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Driving 2&#215;16 LCD<\/h1>\n<p style=\"text-align: justify\">Driving alphanumeric\/text LCDs requires no special hardware as simple manipulation of GPIO pins and understanding of their working principle are all that are needed.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14273\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD.png\" alt=\"LCD\" width=\"416\" height=\"222\" \/><\/a><\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\n<h3>lcd.h<\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_GPIO_init()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do{P00_PushPull_Mode; P01_PushPull_Mode; P10_PushPull_Mode; P11_PushPull_Mode; P12_PushPull_Mode; P13_PushPull_Mode;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_RS_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_P00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_RS_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 clr_P00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_EN_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_P01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_EN_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 clr_P01<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_DB4_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_P10<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_DB4_LOW\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P10<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_DB5_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_P11<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_DB5_LOW\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 LCD_DB6_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_P12<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_DB6_LOW\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P12<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_DB7_HIGH\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_P13<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_DB7_LOW\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P13<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define clear_display\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 goto_home\u00a0\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><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_direction_inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_direction_dec\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_shift\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x01)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_no_shift\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0(0x08 | 0x04)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define blink_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x01)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define blink_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _8_pin_interface\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x10)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _4_pin_interface\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _2_row_display\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x08)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _1_row_display\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0(0x20 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _5x10_dots\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x40)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _5x7_dots\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DAT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define 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 0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_send(unsigned char value, unsigned char mode);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_4bit_send(unsigned char lcd_data);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_putstr(char *lcd_string);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_putchar(char char_data);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_clear_home(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_goto(unsigned char x_pos, unsigned char y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void toggle_EN_pin(void);<\/span><\/pre>\n<h3 style=\"margin-top: 0cm\">lcd.c<\/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 \"lcd.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_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\u00a0Timer0_Delay1ms(10);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_GPIO_init();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0Timer0_Delay1ms(100);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0toggle_EN_pin();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_RS_LOW;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB7_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB6_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB5_HIGH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB4_HIGH;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0toggle_EN_pin();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB7_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB6_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB5_HIGH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB4_HIGH;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0toggle_EN_pin();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB7_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB6_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB5_HIGH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB4_HIGH;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0toggle_EN_pin();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB7_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB6_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB5_HIGH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_DB4_LOW;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0toggle_EN_pin();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_send((_4_pin_interface | _2_row_display | _5x7_dots), CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_send((display_on | cursor_off | blink_off), CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_send(clear_display, CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_send((cursor_direction_inc | display_no_shift), 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_send(unsigned char value, unsigned char 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\u00a0switch(mode)<\/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 DAT:<\/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\u00a0LCD_RS_HIGH;<\/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\u00a0case CMD:<\/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\u00a0LCD_RS_LOW;<\/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\u00a0LCD_4bit_send(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 LCD_4bit_send(unsigned char lcd_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 temp = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0temp = ((lcd_data &amp; 0x80) &gt;&gt; 7);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB7_HIGH;<\/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\u00a0LCD_DB7_LOW;<\/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\u00a0temp = ((lcd_data &amp; 0x40) &gt;&gt; 6);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB6_HIGH;<\/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\u00a0LCD_DB6_LOW;<\/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\u00a0temp = ((lcd_data &amp; 0x20) &gt;&gt; 5);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB5_HIGH;<\/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\u00a0LCD_DB5_LOW;<\/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\u00a0temp = ((lcd_data &amp; 0x10) &gt;&gt; 4);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB4_HIGH;<\/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\u00a0LCD_DB4_LOW;<\/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\u00a0toggle_EN_pin();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0temp = ((lcd_data &amp; 0x08) &gt;&gt; 3);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB7_HIGH;<\/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\u00a0LCD_DB7_LOW;<\/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\u00a0temp = ((lcd_data &amp; 0x04) &gt;&gt; 2);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB6_HIGH;<\/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\u00a0LCD_DB6_LOW;<\/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\u00a0temp = ((lcd_data &amp; 0x02) &gt;&gt; 1);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB5_HIGH;<\/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\u00a0LCD_DB5_LOW;<\/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\u00a0temp = ((lcd_data &amp; 0x01));<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0switch(temp)<\/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 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=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_DB4_HIGH;<\/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\u00a0LCD_DB4_LOW;<\/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\u00a0toggle_EN_pin();<\/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_putstr(char *lcd_string)<\/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\u00a0do<\/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\u00a0LCD_send(*lcd_string++, DAT);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0}while(*lcd_string != '\\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=\"\">void LCD_putchar(char char_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\u00a0LCD_send(char_data, DAT);<\/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_clear_home(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\u00a0LCD_send(clear_display, CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_send(goto_home, 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_goto(unsigned char x_pos, unsigned char y_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\u00a0\u00a0\u00a0if(y_pos == 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\u00a0LCD_send((0x80 | x_pos), CMD);<\/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\u00a0LCD_send((0x80 | 0x40 | x_pos), CMD);<\/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 toggle_EN_pin(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\u00a0LCD_EN_HIGH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0Timer0_Delay1ms(4);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_EN_LOW;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0Timer0_Delay1ms(4);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3 style=\"margin-top: 0cm\">main.c<\/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 \"lcd.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void show_value(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=\"\">{\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0unsigned char s = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0const char txt1[] = {\"MICROARENA\"};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0const char txt2[] = {\"SShahryiar\"};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0const char txt3[] = {\"Nuvoton 8-bit uC\"};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0const char txt4[] = {\"N76E003\"};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_init();<\/span><\/pre>\n<pre><\/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(3, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putstr(txt1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_goto(3, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0LCD_putstr(txt2);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0Timer3_Delay100ms(30);<\/span><\/pre>\n<pre><\/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\u00a0for(s = 0; s &lt; 16; 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\u00a0LCD_goto(s, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_putchar(txt3[s]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Timer0_Delay1ms(90);<\/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\u00a0Timer3_Delay100ms(20);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0for(s = 0; s &lt; 7; 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\u00a0LCD_goto((4 + s), 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0LCD_putchar(txt4[s]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Timer0_Delay1ms(90);<\/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\u00a0Timer3_Delay100ms(30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0s = 0;<\/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(3, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0LCD_putstr(txt1);<\/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\u00a0show_value(s);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0s++;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Timer3_Delay100ms(4);<\/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 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 unsigned char ch = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 ch = ((value \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_goto(6, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 ch = (((value \/ 10) % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_goto(7, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 ch = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_goto(8, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_putchar(ch);<\/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\/LCD-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14274\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Schematic-580x309.png\" alt=\"LCD Schematic\" width=\"580\" height=\"309\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Schematic-580x309.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Schematic-1024x546.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Schematic.png 1285w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">There is nothing to explain here. The LCD driver is based on simple manipulation of GPIO pins. The codes for the LCD are coded using all available info on LCD datasheet &#8211; just initialization and working principle. If you need to change GPIO pins just edit the following lines in the LCD header file:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Coding.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14275\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Coding-580x332.png\" alt=\"LCD Coding\" width=\"580\" height=\"332\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Coding-580x332.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LCD-Coding.png 785w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2 style=\"margin-top: 0cm\">Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2x16-LCD.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14276\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2x16-LCD.jpg\" alt=\"2x16 LCD\" width=\"476\" height=\"590\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/RsetFrAffok?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Driving 2&#215;16 LCD with Software SPI<\/h1>\n<p style=\"text-align: justify\">One problem with alphanumeric LCDs and GLCDs is the number of GPIOs needed to connect so with host micros. For a small micro like N76E003, each GPIO pin is like a gem and we can&#8217;t afford to use too many GPIO pins for an LCD. The solution to this problem is to use SPI\/I2C-based LCD drivers that significantly reduce GPIO pin requirement. Implementing software-based SPI\/I2C for such LCD drivers is also both easy and universal since these solutions don&#8217;t need hardware SPI\/I2C ports. Since the SPI\/I2C functionality is software emulated, any set of GPIO pins can be used \u2013 another advantage.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-LCD.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14278\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-LCD.png\" alt=\"SPI-LCD\" width=\"447\" height=\"218\" \/><\/a><\/p>\n<p style=\"text-align: justify\">In this segment, we will be driving a 2&#215;16 LCD with CD4094B Serial-In-Parallel-Out (SIPO) shift register using software SPI. The same idea can be used for other similar shift registers like 74HC595. There are other ways of using SPI-based LCDs but the aforementioned are the cheapest ways.<\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\n<h3>LCD_3_Wire.h<\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_GPIO_init()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0do{P02_PushPull_Mode; P03_PushPull_Mode; P04_PushPull_Mode;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SDO_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 \u00a0set_P00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SDO_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\u00a0clr_P00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SCK_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 \u00a0set_P01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SCK_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 \u00a0clr_P01<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_STB_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 \u00a0set_P02<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_STB_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 \u00a0clr_P02<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define DAT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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 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 \u00a00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define clear_display\u00a0\u00a0\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 goto_home\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_direction_inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_direction_dec\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_shift\u00a0\u00a0\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 | 0x01)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_no_shift\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x04)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define display_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define cursor_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define blink_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x01)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define blink_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _8_pin_interface\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x10)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _4_pin_interface\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _2_row_display\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(0x20 | 0x08)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _1_row_display\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _5x10_dots\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x40)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define _5x7_dots\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">extern unsigned char data_value;<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void SIPO(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_init(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_toggle_EN(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_send(unsigned char value, unsigned char mode);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_4bit_send(unsigned char lcd_data);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_putstr(char *lcd_string);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_putchar(char char_data);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_clear_home(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_goto(unsigned char x_pos, unsigned char y_pos);<\/span><\/pre>\n<h3 style=\"margin-top: 0cm\">LCD_3_Wire.c<\/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 \"LCD_3_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char data_value;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void SIPO(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 bit_value = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char clk = 0x08;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char temp = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 temp = data_value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_STB_LOW();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 while(clk &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\u00a0 bit_value = ((temp &amp; 0x80) &gt;&gt; 0x07);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit_value &amp;= 0x01;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch(bit_value)<\/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 case 0:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 LCD_SDO_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 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 default:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 LCD_SDO_HIGH();<\/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 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_HIGH();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp &lt;&lt;= 0x01;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clk--;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_LOW();<\/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_STB_HIGH();<\/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_init(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<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(10);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_GPIO_init();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(10);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 data_value = 0x08;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SIPO();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(10);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send(0x33, CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send(0x32, CMD);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send((_4_pin_interface | _2_row_display | _5x7_dots), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send((display_on | cursor_off | blink_off), CMD);\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send((clear_display), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send((cursor_direction_inc | display_no_shift), CMD);\u00a0\u00a0\u00a0\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=\"\">void LCD_toggle_EN(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 data_value |= 0x08;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SIPO();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(2);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 data_value &amp;= 0xF7;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SIPO();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(2);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_send(unsigned char value, unsigned char mode)<\/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<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 switch(mode)<\/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 case DAT:<\/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 data_value |= 0x04;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 }<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/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 data_value &amp;= 0xFB;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 }<\/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 SIPO();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_4bit_send(value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_4bit_send(unsigned char lcd_data)\u00a0\u00a0\u00a0\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=\"\">\u00a0\u00a0\u00a0 unsigned char temp = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 temp = (lcd_data &amp; 0xF0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 data_value &amp;= 0x0F;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 data_value |= temp;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SIPO();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_toggle_EN();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 temp = (lcd_data &amp; 0x0F);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 temp &lt;&lt;= 0x04;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 data_value &amp;= 0x0F;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 data_value |= temp;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SIPO();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_toggle_EN();<\/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=\"\">void LCD_putstr(char *lcd_string)<\/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 while(*lcd_string != '\\0')\u00a0<\/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_putchar(*lcd_string++);<\/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<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_putchar(char char_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 if((char_data &gt;= 0x20) &amp;&amp; (char_data &lt;= 0x7F))<\/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_send(char_data, DAT);<\/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<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void LCD_clear_home(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 LCD_send(clear_display, CMD);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send(goto_home, 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_goto(unsigned char x_pos,unsigned char y_pos)<\/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<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(y_pos == 0)\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<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_send((0x80 | x_pos), CMD);<\/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 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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 LCD_send((0x80 | 0x40 | x_pos), CMD);<\/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<h3 style=\"margin-top: 0cm\">main.c<\/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 \"LCD_3_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void show_value(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=\"\">{\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char s = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt1[] = {\"MICROARENA\"};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt2[] = {\"SShahryiar\"};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt3[] = {\"Nuvoton 8-bit uC\"};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt4[] = {\"N76E003\"};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_init();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><\/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(txt1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(3, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(txt2);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay100ms(30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt; 16; 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 LCD_goto(s, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putchar(txt3[s]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(90);<\/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 Timer3_Delay100ms(20);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt; 7; 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 LCD_goto((4 + s), 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putchar(txt4[s]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(90);<\/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 Timer3_Delay100ms(30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 s = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><\/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(txt1);<\/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 show_value(s);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 s++;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay100ms(4);<\/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 show_value(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 unsigned char ch = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 ch = ((value \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_goto(6, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 ch = (((value \/ 10) % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_goto(7, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 ch = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_goto(8, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2 style=\"margin-top: 0cm\">Schematic<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14518\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2019\/12\/SPI-LCD-580x162.png\" alt=\"\" width=\"580\" height=\"162\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2019\/12\/SPI-LCD-580x162.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2019\/12\/SPI-LCD-600x168.png 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2019\/12\/SPI-LCD.png 602w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/p>\n<h2 style=\"margin-top: 0cm\">Explanation<\/h2>\n<p style=\"text-align: justify\">The code demoed here is same as the last LCD code and so there is not much to explain. The GPIO operations of the LCD are handled using a CD4094B <strong><em>Serial-In-Parallel-Out (SIPO) <\/em><\/strong>shift register. This shift register here acts like an output expander. With just three GPIOs we are able to interface a 4-bit LCD that needs at least six GPIOs to work.<\/p>\n<p style=\"text-align: justify\">The <strong><em>SIPO<\/em><\/strong> function shown below simulates software-based SPI:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void SIPO(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 bit_value = 0x00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char clk = 0x08;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char temp = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 temp = data_value;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_STB_LOW();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 while(clk &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\u00a0 bit_value = ((temp &amp; 0x80) &gt;&gt; 0x07);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit_value &amp;= 0x01;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch(bit_value)<\/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 case 0:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 LCD_SDO_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 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 \u00a0default:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 LCD_SDO_HIGH();<\/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 break;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_HIGH();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp &lt;&lt;= 0x01;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clk--;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_LOW();<\/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_STB_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p>To change pins, change the following the lines in the <strong><em>LCD_3_Wire<\/em><\/strong> header file:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_GPIO_init()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0do{P02_PushPull_Mode; P03_PushPull_Mode; P04_PushPull_Mode;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SDO_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 \u00a0set_P00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SDO_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\u00a0clr_P00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SCK_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 \u00a0set_P01<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_SCK_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 \u00a0clr_P01<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_STB_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 \u00a0set_P02<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LCD_STB_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 \u00a0clr_P02<\/span><\/pre>\n<p style=\"text-align: justify\">Lastly, I have code two versions of this LCD library \u2013 one with BSP-based delays and the other with software delays. Technically there\u2019s no big change. The software-based one frees up a hardware timer or two.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-LCD.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14280\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-LCD-580x357.jpg\" alt=\"SPI LCD\" width=\"580\" height=\"357\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-LCD-580x357.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/SPI-LCD.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\/F0-aeRM5VE4?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1>Driving 2&#215;16 LCD with Software I2C<\/h1>\n<p style=\"text-align: justify\">We have already seen in the last segment how to use software SPI with a shift register to drive a 2&#215;16 LCD. In this segment, we will explore the same concept with software I2C and PCF8574 I2C port expander IC. There is a popular readymade module for such task and I used it here. The advantage of I2C-based LCD over SPI-based LCD driver is the lesser number of GPIOs required compared to SPI-based LCD. However, it is slower than SPI-based drivers.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2-Wire-LCD.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14281\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2-Wire-LCD.png\" alt=\"2-Wire LCD\" width=\"451\" height=\"428\" \/><\/a><\/p>\n<h2>Code<\/h2>\n<h3 style=\"margin-top: 0cm\">SW_I2C.h<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_DIR_OUT()\u00a0\u00a0 P03_PushPull_Mode<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_DIR_IN()\u00a0\u00a0\u00a0 P03_Input_Mode<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_DIR_OUT()\u00a0\u00a0 P04_PushPull_Mode<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_DIR_IN()\u00a0\u00a0\u00a0 P04_Input_Mode<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_HIGH()\u00a0 \u00a0\u00a0\u00a0\u00a0set_P03<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P03<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_HIGH()\u00a0\u00a0\u00a0\u00a0\u00a0 set_P04<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P04<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_IN()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P03<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define I2C_ACK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xFF<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define I2C_NACK\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define I2C_timeout\u00a0\u00a0\u00a0\u00a0 1000<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_init(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_start(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_stop(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">unsigned char SW_I2C_read(unsigned char ack);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_write(unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_ACK_NACK(unsigned char mode);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">unsigned char SW_I2C_wait_ACK(void);\n<\/span><\/pre>\n<h3 style=\"margin-top: 0cm\">SW_I2C.c<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"N76E003_iar.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SW_I2C.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_init(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_DIR_OUT();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_DIR_OUT();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay100us(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_start(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_DIR_OUT();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(4);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(4);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_stop(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_DIR_OUT();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(4);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(4);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">unsigned char SW_I2C_read(unsigned char ack)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char i = 8;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char j = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_DIR_IN();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 while(i &gt; 0)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Timer3_Delay10us(2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SCL_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Timer3_Delay10us(2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 j &lt;&lt;= 1;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(SDA_IN() != 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 j++;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Timer3_Delay10us(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i--;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 };<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 switch(ack)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case I2C_ACK:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SW_I2C_ACK_NACK(I2C_ACK);;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SW_I2C_ACK_NACK(I2C_NACK);;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 return j;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_write(unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char i = 8;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_DIR_OUT();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 while(i &gt; 0)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(((value &amp; 0x80) &gt;&gt; 7) != 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SDA_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SDA_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value &lt;&lt;= 1;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Timer3_Delay10us(2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SCL_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Timer3_Delay10us(2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Timer3_Delay10us(2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i--;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void SW_I2C_ACK_NACK(unsigned char mode)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_DIR_OUT();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 switch(mode)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case I2C_ACK:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SDA_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SDA_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">unsigned char SW_I2C_wait_ACK(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 signed int timeout = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_DIR_IN();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SDA_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay10us(1);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 while(SDA_IN() != 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 timeout++;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(timeout &gt; I2C_timeout)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SW_I2C_stop();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 1;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 };<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCL_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0return 0;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3 style=\"margin-top: 0cm\">PCF8574.h<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SW_I2C.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define PCF8574_address\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x4E<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define PCF8574_write_cmd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PCF8574_address<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define PCF8574_read_cmd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (PCF8574_address | 1)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void PCF8574_init(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">unsigned char PCF8574_read(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void PCF8574_write(unsigned char data_byte);<\/span><\/pre>\n<h3 style=\"margin-top: 0cm\">PCF8574.c<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"N76E003_iar.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"PCF8574.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void PCF8574_init(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_init();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(20);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">unsigned char PCF8574_read(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char port_byte = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_start();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_write(PCF8574_read_cmd);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 port_byte = SW_I2C_read(I2C_NACK);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_stop();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 return port_byte;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void PCF8574_write(unsigned char data_byte)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_start();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_write(PCF8574_write_cmd);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_ACK_NACK(I2C_ACK);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_write(data_byte);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_ACK_NACK(I2C_ACK);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SW_I2C_stop();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3>LCD_2_Wire.h<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"PCF8574.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define clear_display\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\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: #3366ff\" data-darkreader-inline-color=\"\">#define goto_home\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define cursor_direction_inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x04 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define cursor_direction_dec\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define display_shift \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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 | 0x01)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define display_no_shift\u00a0\u00a0\u00a0\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 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define display_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x08 | 0x04)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define display_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define cursor_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define cursor_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define blink_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x01)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define blink_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define _8_pin_interface\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x20 | 0x10)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define _4_pin_interface\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define _2_row_display\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x20 | 0x08)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define _1_row_display\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define _5x10_dots\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x20 | 0x40)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define _5x7_dots\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define BL_ON\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define BL_OFF\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define dly\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 2<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define DAT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define 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 0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_init(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_toggle_EN(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_send(unsigned char value, unsigned char mode);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_4bit_send(unsigned char lcd_data);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_putstr(char *lcd_string);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_putchar(char char_data);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_clear_home(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_goto(unsigned char x_pos, unsigned char y_pos);<\/span><\/pre>\n<h3>LCD_2_Wire.c<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"N76E003_iar.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"LCD_2_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">static unsigned char bl_state;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">static unsigned char data_value;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_init(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 PCF8574_init();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer0_Delay1ms(10);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 bl_state = BL_ON;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 data_value = 0x04;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 PCF8574_write(data_value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer0_Delay1ms(10);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(0x33, CMD);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(0x32, CMD);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send((_4_pin_interface | _2_row_display | _5x7_dots), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send((display_on | cursor_off | blink_off), CMD);\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send((clear_display), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send((cursor_direction_inc | display_no_shift), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_toggle_EN(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 data_value |= 0x04;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 PCF8574_write(data_value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer0_Delay1ms(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 data_value &amp;= 0xF9;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 PCF8574_write(data_value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer0_Delay1ms(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_send(unsigned char value, unsigned char mode)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 switch(mode)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 case CMD:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data_value &amp;= 0xF4;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 case DAT:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data_value |= 0x01;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 switch(bl_state)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 case BL_ON:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data_value |= 0x08;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 case BL_OFF:<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data_value &amp;= 0xF7;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 PCF8574_write(data_value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_4bit_send(value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer0_Delay1ms(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_4bit_send(unsigned char lcd_data)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char temp = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 temp = (lcd_data &amp; 0xF0);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 data_value &amp;= 0x0F;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 data_value |= temp;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 PCF8574_write(data_value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_toggle_EN();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 temp = (lcd_data &amp; 0x0F);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 temp &lt;&lt;= 0x04;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 data_value &amp;= 0x0F;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 data_value |= temp;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 PCF8574_write(data_value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_toggle_EN();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_putstr(char *lcd_string)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 do<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putchar(*lcd_string++);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }while(*lcd_string != '\\0') ;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_putchar(char char_data)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 if((char_data &gt;= 0x20) &amp;&amp; (char_data &lt;= 0x7F))<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send(char_data, DAT);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_clear_home(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(clear_display, CMD);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_send(goto_home, CMD);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void LCD_goto(unsigned char x_pos,unsigned char y_pos)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 if(y_pos == 0)\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send((0x80 | x_pos), CMD);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_send((0x80 | 0x40 | x_pos), CMD);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h3>main.c<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"N76E003_iar.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"LCD_2_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void show_value(unsigned char value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char s = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt1[] = {\"MICROARENA\"};<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt2[] = {\"SShahryiar\"};<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt3[] = {\"Nuvoton 8-bit uC\"};<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 static char txt4[] = {\"N76E003\"};<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_init();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(3, 0);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(txt1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(3, 1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(txt2);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay100ms(30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt; 16; s++)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_goto(s, 0);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putchar(txt3[s]);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(90);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay100ms(20);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt; 7; s++)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_goto((4 + s), 1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_putchar(txt4[s]);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(90);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay100ms(30);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 s = 0;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_clear_home();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(3, 0);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(txt1);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 while(1)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 show_value(s);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 s++;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay100ms(4);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void show_value(unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char ch = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 ch = ((value \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(6, 1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 ch = (((value \/ 10) % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(7, 1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 ch = ((value % 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(8, 1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar(ch);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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\/I2C-LCD-Driver-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14282\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-LCD-Driver-Schematic-580x302.png\" alt=\"I2C LCD Driver Schematic\" width=\"580\" height=\"302\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-LCD-Driver-Schematic-580x302.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-LCD-Driver-Schematic.png 624w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2-Wire-LCD_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14283\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2-Wire-LCD_Schematic-580x257.png\" alt=\"2 Wire LCD_Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2-Wire-LCD_Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/2-Wire-LCD_Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">Just like the last example, software method is used to emulate I2C protocol using ordinary GPIOs. There are three parts of the code \u2013 first the software I2C driver, second the driver library for PCF8574 I2C 8-bit port expander and lastly the LCD driver itself. The LCD driver is same as the other LCD drivers in this document. I kept the code modular so that it is easy to understand the role of each piece of code. The I2C driver (<strong><em>SW_I2C<\/em><\/strong>) implements software I2C which is used by the PCF8574 driver. Thus, the port expander driver is dependent on the <strong><em>SW_I2C<\/em><\/strong> driver and the LCD driver is dependent on the port expander driver, and in cases like such we must find add libraries according to the order of dependency.<\/p>\n<p style=\"text-align: justify\">The advantage of keeping things modular is to easily modify things in a fast and trouble-free manner while keeping things ready for other deployments. In my codes I try to avoid repetitive and meaningless stuffs with meaningful definitions. For instance, just change the following lines to change pin configurations without going through the whole code:<\/p>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_DIR_OUT()\u00a0\u00a0 P03_PushPull_Mode<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_DIR_IN()\u00a0\u00a0\u00a0 P03_Input_Mode<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_DIR_OUT()\u00a0\u00a0 P04_PushPull_Mode<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_DIR_IN()\u00a0\u00a0\u00a0 P04_Input_Mode<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_HIGH()\u00a0\u00a0\u00a0\u00a0\u00a0 set_P03<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P03<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_HIGH()\u00a0\u00a0\u00a0\u00a0\u00a0 set_P04<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCL_LOW()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P04<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SDA_IN()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P03<\/span><\/pre>\n<p style=\"text-align: justify\">Likewise, the <strong><em>SW_I2C<\/em><\/strong> functions are not implemented inside the LCD or port expander driver files so that they can be used for other I2C devices.<\/p>\n<p style=\"text-align: justify\">I have code two versions of this LCD library just like the SPI-based ones \u2013 one with BSP-based delays and the other with software delays.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-LCD.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14284\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-LCD-580x344.jpg\" alt=\"I2C LCD\" width=\"580\" height=\"344\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-LCD-580x344.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/I2C-LCD.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\/vIr6JuSGRxg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1>Driving seven Segments by Bit-banging TM1640<\/h1>\n<p style=\"text-align: justify\">Seven segment displays take up lot of GPIO pins when they are required to be interfaced with a host micro. There are several driver ICs like MAX7219, TM1640, 74HC594, etc to overcome this issue. TM1640 from Titan Micro Electronics does not support standard I2C or SPI communication protocol unlike most other driver ICs. Thus, to interface it with our host N76E003 micro, we need to apply bit-banging method just like the LCD examples.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14285\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640.png\" alt=\"TM1640\" width=\"512\" height=\"254\" \/><\/a><\/p>\n<h2>Code<\/h2>\n<h3>fonts.h<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">const unsigned char fonts[11] =<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x00, \/\/ (32) \u00a0\u00a0&lt;space&gt;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x3F, \/\/ (48)\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x06, \/\/ (49)\u00a0\u00a0\u00a01<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x5B, \/\/ (50)\u00a0\u00a0\u00a02<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x4F, \/\/ (51)\u00a0\u00a0\u00a03<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x66, \/\/ (52)\u00a0\u00a0\u00a04\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x6D, \/\/ (53)\u00a0\u00a0\u00a05\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x7D, \/\/ (54)\u00a0\u00a0\u00a06\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x27, \/\/ (55)\u00a0\u00a0\u00a07<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x7F, \/\/ (56)\u00a0\u00a0\u00a08\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 0x6F, \/\/ (57)\u00a0\u00a0\u00a09\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">};\u00a0\u00a0<\/span><\/pre>\n<h3 style=\"margin-top: 0cm\">TM1640.h<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define TM1640_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\u00a0\u00a0\u00a0 do{P03_PushPull_Mode; P04_PushPull_Mode;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define DIN_pin_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\u00a0\u00a0\u00a0\u00a0\u00a0 set_P03<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define DIN_pin_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\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P03<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCLK_pin_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\u00a0\u00a0\u00a0\u00a0 set_P04<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCLK_pin_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\u00a0\u00a0\u00a0\u00a0 clr_P04<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define no_of_segments\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 16<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define auto_address\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x40<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define fixed_address\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x44<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define normal_mode\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x40<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define test_mode\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x48<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define start_address\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_5_pc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x88<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_10_pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x89<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_25_pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x8A<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_60_pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x8B<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_70_pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x8C<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_75_pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x8D<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_80_pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x8E<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define brightness_100_pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x8F<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define display_off\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x80<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define display_on\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x8F<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_init(unsigned char brightness_level);\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_start(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_stop(void);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_write(unsigned char value);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_send_command(unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_send_data(unsigned char address, unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_clear_display(void);<\/span><\/pre>\n<h3>TM1640.c<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"TM1640.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_init(unsigned char brightness_level)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_GPIO_init();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer0_Delay1ms(10);\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 DIN_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 SCLK_pin_HIGH();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_send_command(auto_address);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_send_command(brightness_level);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_clear_display();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_start(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 DIN_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 SCLK_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay10us(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 DIN_pin_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay10us(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 SCLK_pin_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_stop(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 DIN_pin_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 SCLK_pin_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay10us(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 SCLK_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 Timer3_Delay10us(1);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 DIN_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_write(unsigned char value)\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char s = 0x08;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 while(s &gt; 0)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCLK_pin_LOW();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if((value &amp; 0x01) == 0x01)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 DIN_pin_HIGH();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0 DIN_pin_LOW();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 SCLK_pin_HIGH();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 value &gt;&gt;= 0x01;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 s--;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_send_command(unsigned char value)\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_start();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_write(value);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_stop();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_send_data(unsigned char address, unsigned char value)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_send_command(fixed_address);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_start();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_write((0xC0 | (0x0F &amp; address)));<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_write(value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 TM1640_stop();<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void TM1640_clear_display(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char s = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0x00; s &lt; no_of_segments; s++)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TM1640_send_data(s, 0);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 };<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p><strong>\u00a0<\/strong><\/p>\n<h3>main.c<\/h3>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"N76E003.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"SFR_Macro.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Function_define.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Common.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"Delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"font.h\"<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#include \"TM1640.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void display_data(unsigned char segment, signed int value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void main(void)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{\u00a0<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0unsigned int i = 0;<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0unsigned int j = 999;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0TM1640_init(brightness_75_pc);;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0while(1)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0display_data(0, i++);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 display_data(4, j--);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer3_Delay100ms(4);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0};<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">void display_data(unsigned char segment, signed int value)<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">{<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char ch = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 ch = (value \/ 100);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data((2 + segment), fonts[1 + ch]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0\u00a0\u00a0ch = ((value \/ 10) % 10);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data((1 + segment), fonts[1 + ch]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 ch = (value % 10);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data(segment, fonts[1 + ch]);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else if((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data((2 + segment), 0);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 ch = (value \/ 10);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data((1 + segment), fonts[1 + ch]);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 ch = (value % 10);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data(segment, fonts[1 + ch]);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 else<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 {<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data((2 + segment), 0);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data((1 + segment), 0);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 ch = (value % 10);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 TM1640_send_data(segment, fonts[1 + ch]);<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 }<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" 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\/TM1640_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14286\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640_Schematic-580x257.png\" alt=\"TM1640_Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640_Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640_Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">Like the LCD libraries demoed previously, TM1640 is driven with GPIO bit-banging. Please read the <a href=\"https:\/\/cdn.solarbotics.com\/products\/datasheets\/tm1640.pdf\">datasheet<\/a> of TM1640 to fully understand how the codes are implemented. It uses two pins just like I2C but don\u2019t be fooled as it doesn\u2019t support I2C protocol. It uses a protocol of its own. To change pin configuration, just change the following lines of code:<\/p>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define TM1640_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\u00a0\u00a0\u00a0 do{P03_PushPull_Mode; P04_PushPull_Mode;}while(0)<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define DIN_pin_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\u00a0\u00a0\u00a0\u00a0\u00a0 set_P03<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define DIN_pin_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\u00a0\u00a0\u00a0\u00a0\u00a0clr_P03<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCLK_pin_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\u00a0\u00a0\u00a0\u00a0 set_P04<\/span><\/pre>\n<pre><span style=\"color: #3366ff\" data-darkreader-inline-color=\"\">#define SCLK_pin_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\u00a0\u00a0\u00a0\u00a0 clr_P04<\/span><\/pre>\n<h2>Demo<\/h2>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14287 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640-580x314.jpg\" alt=\"TM1640\" width=\"580\" height=\"314\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640-580x314.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/TM1640.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><br \/>\n<iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/2ufeAQkt5Jk?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">External Interrupt (EXTI)<\/h1>\n<p style=\"text-align: justify\">External interrupt is a key GPIO feature in input mode. It momentarily interrupts regular program flow just like other interrupts and does some tasks before resuming interrupted task. In traditional 8051s, there are two external interrupts with dedicated and separate interrupt vector addresses. The same applies to N76E003. Highlighted below in the N76E003&#8217;s interrupt vector table are the interrupt vector addresses\/numbers of these two external interrupts:<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Interrupt-Vector1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14290 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Interrupt-Vector1-580x238.png\" alt=\"Interrupt Vector\" width=\"580\" height=\"238\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Interrupt-Vector1-580x238.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Interrupt-Vector1-600x247.png 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Interrupt-Vector1.png 602w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>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><\/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 EXT_INT0(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 set_P00;<\/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 EXT_INT1(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">interrupt 2<\/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 set_P01;<\/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\u00a0setup();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0while(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 Timer0_Delay1ms(1000);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0clr_P00;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0clr_P01;<\/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<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\u00a0P00_PushPull_Mode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0P01_PushPull_Mode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0P17_Input_Mode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0P30_Input_Mode;\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_P1S_7;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_P3S_0;<\/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_IT1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_EX0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0set_EX1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_EA;\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\/EXTI-schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14292\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI-schematic-580x297.png\" alt=\"EXTI schematic\" width=\"580\" height=\"297\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI-schematic-580x297.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI-schematic-1024x525.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI-schematic.png 1149w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">The setup for this demo is simple. There are two LEDs and two buttons connected with a N76E003 chip as per schematic. The buttons are connected with external interrupt pins. Obviously, these pins are declared as input pins. Additionally, internal input Schmitt triggers of these pins are used to ensure noise cancellation. Both interrupts are enabled along with their respective interrupt hardware. Finally, global interrupt is set. Optionally interrupt priority can be applied.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">P17_Input_Mode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">P30_Input_Mode;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_P1S_7;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_P3S_0;<\/span><\/pre>\n<pre><\/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_IT1;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EX0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EX1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EA;\u00a0\u00a0\u00a0<\/span><\/pre>\n<p style=\"text-align: justify\">Since we enabled two interrupts with different interrupt vectors, there will be two interrupt subroutine functions. Each of these functions will briefly turn on LEDs assigned to them. The LEDs are turned off in the main function. Thus, the LEDs mark which interrupt occurred.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void EXT_INT0(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 set_P00;<\/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 EXT_INT1(void)<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">interrupt 2<\/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 set_P01;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<h2>Demo<\/h2>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14291 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI-580x433.jpg\" alt=\"EXTI\" width=\"580\" height=\"433\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI-580x433.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EXTI.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><br \/>\n<iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/fFpBpoNMNyI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Pin Interrupt \u2013 Interfacing Rotary Encoder<\/h1>\n<p style=\"text-align: justify\">Apart from dedicated external interrupts, N76E003 is equipped with pin interrupt facility &#8211; a feature that can be found in almost every microcontroller of modern times. With pin interrupt, any GPIO can be made to behave like external interrupt. However, unlike external interrupts, a single hardware interrupt channel and therefore one vector address is used for mapping a maximum of eight different GPIO pins. These pins need not to be on the same GPIO port. When interrupt occurs, we need to assert from which pin it originated. This feature becomes very useful when interfacing keypads and buttons.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Pin-Interrupt-Structure.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14293\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Pin-Interrupt-Structure.png\" alt=\"Pin Interrupt Structure\" width=\"573\" height=\"473\" \/><\/a><\/p>\n<h2>Code<\/h2>\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 \"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=\"\">signed char encoder_value = 0;<\/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_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#pragma vector = 0x3B<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">__interrupt void PIN_INT(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 clr_EA;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 if(PIF == 0x01)<\/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 if((P1 &amp; 0x03) == 0x02)<\/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 encoder_value++;<\/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(encoder_value &gt; 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 encoder_value = 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 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 if(PIF == 0x02)<\/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 \u00a0if((P1 &amp; 0x03) == 0x01)<\/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 encoder_value--;<\/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(encoder_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 encoder_value = 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 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 PIF = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P15 = ~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 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 set_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print(14, 0, encoder_value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 delay_ms(40);<\/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\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P10_Input_Mode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P11_Input_Mode;\u00a0<\/span><\/pre>\n<pre><\/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 Enable_BIT0_LowLevel_Trig;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 Enable_BIT1_LowLevel_Trig;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 Enable_INT_Port1;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_EPI;\u00a0\u00a0<\/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_goto(0, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"ENC Count:\");<\/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 int 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 \/ 10) + 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) + 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\/pin-int-schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14294\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/pin-int-schematic-580x323.png\" alt=\"pin int schematic\" width=\"580\" height=\"323\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/pin-int-schematic-580x323.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/pin-int-schematic.png 856w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">Pin interrupt is not same as dedicated external interrupt but still it is very useful in a number of cases. In this demo, two pin interrupts are used to decode a rotary encoder. Probably this is the simplest method of decoding a rotary encoder.<\/p>\n<p style=\"text-align: justify\">Setting up pin interrupt is very easy. We need to set the pin interrupt pins are inputs. We can optionally use the internal Schmitt triggers. Then we decide the edge to detect and which ports to check for pin interrupt. Finally, we set the pin interrupt hardware.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">P10_Input_Mode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">P11_Input_Mode;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">Enable_BIT0_LowLevel_Trig;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">Enable_BIT1_LowLevel_Trig;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">Enable_INT_Port1;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EPI;\u00a0\u00a0<\/span><\/pre>\n<p style=\"text-align: justify\">Inside the pin interrupt function, we need to check which pin shot the interrupt by checking respective flags. Encoder count is incremented\/decremented based on which flag got shot first and the logic state of the other pin. Since here a rotary encoder is interfaced with pin interrupt facility of N76E003, we have to ensure that the micro doesn\u2019t detect any further or false interrupts while already processing one interrupt condition. This is why the global interrupt is disabled every time the code enters the pin interrupt function. This is restarted in the main. Similarly, to ensure proper working we have clear the interrupt flags before exiting the function. P15 is toggled with interrupt to visually indicate the rotation of the encoder.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#pragma vector = 0x3B<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">__interrupt void PIN_INT(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 clr_EA;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 if(PIF == 0x01)<\/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 if((P1 &amp; 0x03) == 0x02)<\/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 encoder_value++;<\/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(encoder_value &gt; 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 encoder_value = 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 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 if(PIF == 0x02)<\/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 if((P1 &amp; 0x03) == 0x01)<\/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 encoder_value--;<\/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(encoder_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 encoder_value = 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 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 PIF = 0x00;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P15 = ~P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p style=\"text-align: justify\">The main code just shows the encoder count. When the encoder is rotated in one direction, the count increases while rotating it in the opposite direction causes the encoder count to decrease.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Pin-Int.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14295\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Pin-Int-580x491.jpg\" alt=\"Pin Int\" width=\"580\" height=\"491\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Pin-Int-580x491.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Pin-Int.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\/nPEzTYj70ys?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Clock System<\/h1>\n<p style=\"text-align: justify\">The clock system of N76E003 is very straight forward and very flexible. To begin with, there are three clock sources, a clock selector and a common clock divider block apart from other blocks. Shown below is the block diagram of N76E003\u2019s clock system:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14296\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System-580x230.png\" alt=\"Clock System\" width=\"580\" height=\"230\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System-580x230.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System-1024x406.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System.png 1077w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>The three sources are as follows:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-Sources.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14299\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-Sources-580x390.png\" alt=\"Clock Sources\" width=\"580\" height=\"390\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-Sources-580x390.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-Sources.png 610w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Once a given clock source is set, it becomes the clock for all systems. The only exception here is the watchdog timer and the self-wake-up timer which are only run by the LIRC.<\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\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><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define HIRC\u00a0\u00a0\u00a0\u00a00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LIRC\u00a0\u00a0\u00a0 1<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define ECLK\u00a0\u00a0\u00a0\u00a02<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_clock_source(unsigned char clock_source);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void disable_clock_source(unsigned char clock_source);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_clock_division_factor(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 signed char i = 30;\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 P11_PushPull_Mode;\u00a0<\/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 set_clock_division_factor(0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_clock_source(HIRC);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_CLOEN;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while(i &gt; 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\u00a0\u00a0\u00a0\u00a0\u00a0<\/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 clr_P15;\u00a0\u00a0\u00a0\u00a0\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 Timer0_Delay1ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 \u00a0\u00a0set_P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 i--;<\/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 set_clock_source(ECLK);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 disable_clock_source(HIRC);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 i = 30;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while(i &gt; 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\u00a0\u00a0\u00a0\u00a0\u00a0<\/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 clr_P15;\u00a0\u00a0\u00a0\u00a0\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 Timer0_Delay1ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 set_P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(100);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 i--;<\/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 set_clock_source(LIRC);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 disable_clock_source(HIRC);<\/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 clr_P15;\u00a0\u00a0\u00a0\u00a0\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 Timer0_Delay1ms(1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 set_P15;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(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=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_clock_source(unsigned char clock_source)<\/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(clock_source)<\/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 case LIRC:<\/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 set_OSC1;\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 clr_OSC0;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/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 case ECLK:<\/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 set_EXTEN1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 set_EXTEN0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 while((CKSWT &amp; SET_BIT3) == 0);\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_OSC1;\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 set_OSC0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/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 default:<\/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 set_HIRCEN;\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 while((CKSWT &amp; SET_BIT5) == 0);\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_OSC1;\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 clr_OSC0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/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 }<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 while((CKEN &amp; SET_BIT0) == 1);\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 disable_clock_source(unsigned char clock_source)<\/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(clock_source)<\/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 case HIRC:<\/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 clr_HIRCEN;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/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 default:<\/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 clr_EXTEN1;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_EXTEN0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/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 }<\/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_clock_division_factor(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 CKDIV = value;<\/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\/CLK_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14298\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/CLK_Schematic-580x286.png\" alt=\"CLK_Schematic\" width=\"580\" height=\"286\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/CLK_Schematic-580x286.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/CLK_Schematic-1024x505.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/CLK_Schematic.png 1036w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">The very first thing to note is the absence of two <strong><em>OSC<\/em><\/strong> pins unlike other micros and yet a crystal resonator is connected with P30 and P17. This configuration is not correct. There is only <strong><em>OSCIN<\/em><\/strong> pin. This is because N76E003 can only be driven with active clock sources like crystal modules, external electronic circuitry, etc. The HIRC clock source is accurate enough for most purposes and there is literally no need for external clock. I have done most of the experiments with HIRC and I\u2019m satisfied with it.<\/p>\n<p style=\"text-align: justify\">Many people don\u2019t understand the difference between a crystal oscillator module and a crystal resonator. Both are based on quartz crystals but the oscillator one has internal electronics to generate clock pulses precisely while the resonator just contains the quartz crystal. Crystal modules are accurate compared to resonators because the internal electronics in them take care of the effects of temperature. Resonators are therefore called passive clock crystals while the clock modules are termed active clocks.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/crystal.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14297\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/crystal-580x565.png\" alt=\"crystal\" width=\"580\" height=\"565\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/crystal-580x565.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/crystal.png 791w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Here to test all three clock sources, I used two things \u2013 first the onboard LED and second the clock output pin. Different clock sources are enabled briefly one after another and the onboard LED is blinked. The blinking rate of the LED is an indirect indicator of clock speed. The clock output too is monitored with an oscilloscope\/signal analyser for clock speeds. HIRC is turned on first, then ECLK and finally LIRC. By default, both HIRC and LIRC are turned on during power on. When switching between clock sources, we should poll if the new clock source is stable prior to using it and disable the one that we don\u2019t need.<\/p>\n<p style=\"text-align: justify\">I have coded the following three for setting up the clock system. Their names suggest their purposes.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_clock_source(unsigned char clock_source);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void disable_clock_source(unsigned char clock_source);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_clock_division_factor(unsigned char value);<\/span><\/pre>\n<p style=\"text-align: justify\">These three functions will be all that you\u2019ll ever need to configure the clock system without any hassle. The first two are most important as they select clock source and disabled the one that is not need. If you are still confused about setting the system clock then you can avoid the clock division function and straight use the following function:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_clock_frequency(unsigned long F_osc, unsigned long F_sys)<\/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 F_osc = (F_osc \/ (2 * F_sys));<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 if((F_osc &gt;= 0x00) &amp;&amp; (F_osc &lt;= 0xFF))<\/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 CKDIV = ((unsigned char)F_osc);<\/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<p style=\"text-align: justify\">This function takes two parameters \u2013 the frequency of the clock source and the frequency of the system after clock division.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14300\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System-580x470.jpg\" alt=\"Clock System\" width=\"580\" height=\"470\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System-580x470.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Clock-System.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\/C_01oeoqAVE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">12-Bit ADC \u2013 LM35 Thermometer<\/h1>\n<p style=\"text-align: justify\">Most 8051s don\u2019t have any embedded ADC but N76E003 comes with a 12-bit SAR ADC. This is also one area where N76E003 differs a lot from STM8S003. The 12-bit resolution is the factor. N76E003 has eight single-ended ADC inputs along with a bandgap voltage generator and a built-in comparator. The ADC can be triggered internally with software or by external hardware pins\/PWM. Everything is same as the ADCs of other microcontrollers and there\u2019s not much difference.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_Structure.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14301\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_Structure.png\" alt=\"ADC_Structure\" width=\"483\" height=\"475\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_Structure.png 483w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_Structure-90x90.png 90w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LM35.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14304\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LM35.png\" alt=\"LM35\" width=\"413\" height=\"307\" \/><\/a><\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\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 \"LCD_3_Wire.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define scalar\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0.12412<\/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=\"\">unsigned int ADC_read(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_i(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_f(unsigned char x_pos, unsigned char y_pos, unsigned int 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 int temp = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned int adc_count = 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 adc_count = ADC_read();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 temp = ((unsigned int)(((float)adc_count) \/ scalar));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_i(12, 0, adc_count);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_f(11, 1, temp);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 Timer0_Delay1ms(600);<\/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 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_goto(0, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"ADC Count:\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"Tmp\/deg C:\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 Enable_ADC_AIN0;<\/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 ADC_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 register unsigned int value = 0x0000;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 clr_ADCF;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_ADCS;\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 while(ADCF == 0);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value = ADCRH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value &lt;&lt;= 4;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value |= ADCRL;<\/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 lcd_print_i(unsigned char x_pos, unsigned char y_pos, unsigned int 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 \/ 1000) + 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 % 1000) \/ 100) + 0x30);\u00a0<\/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 % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 3), 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<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_f(unsigned char x_pos, unsigned char y_pos, unsigned int 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 \/ 1000) + 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 % 1000) \/ 100) + 0x30);\u00a0<\/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('.');<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 3), y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar(((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 4), 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\/ADC_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14302\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_Schematic-580x257.png\" alt=\"ADC_Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">In this demo, one ADC channel (<strong><em>AIN0<\/em><\/strong>) is used to read a LM35 temperature sensor. Polling method is used to read the ADC.<\/p>\n<p style=\"text-align: justify\">Enabling the ADC is simply done by coding the following line:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">Enable_ADC_AIN0;<\/span><\/pre>\n<p style=\"text-align: justify\">In the background of this, ADC channel selection and other parameters are set. If you want more control over the ADC then you must set the ADC registers on your own. Most of the times that can be avoided.<\/p>\n<p style=\"text-align: justify\">Reading the ADC needs some attention because the ADC data registers are not aligned like other registers and we just need 12-bits, not 8\/16-bits.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_data_register.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14305\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_data_register-580x159.png\" alt=\"ADC_data_register\" width=\"580\" height=\"159\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_data_register-580x159.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_data_register.png 663w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Notice that the we must extract ADC from <strong><em>ADCCRH<\/em><\/strong> and from the low four bits of <strong><em>ADCCRL<\/em><\/strong>. To handle this issue the follow function is devised:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int ADC_read(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 register unsigned int value = 0x0000;<\/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 clr_ADCF;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_ADCS;\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 while(ADCF == 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 value = ADCRH;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value &lt;&lt;= 4;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value |= ADCRL;<\/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 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\">When this function is called, the ADC conversion completion flag is cleared and the ADC is software-triggered. The conversion completion flag is polled. When this flag status is changed, the ADC data registers are read. Finally, the value is returned.<\/p>\n<p style=\"text-align: justify\">LM35 gives 10mV output for each degree of temperature. Therefore, for 26\u00b0C the sensor is supposed to give 260mV output. At 3.3V the ADC count will 4095 while at 0V the ADC count will be 0 count. Thus, 0.806mV equals one count and so 260mV should give:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Counts.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14306\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Counts.png\" alt=\"Counts\" width=\"186\" height=\"67\" \/><\/a><\/p>\n<p style=\"text-align: justify\">In the display, we have to show 26.00\u00b0C i.e. 2600 considering no decimal point and fully integer value. Thus, to transform 322 to 2600, we have to divide the result with a scalar (0.12412). The main code just does that after reading the ADC. The ADC count and temperature are then both shown in the LCD.<\/p>\n<h2>Demo<\/h2>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14303 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-580x375.jpg\" alt=\"ADC\" width=\"580\" height=\"375\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-580x375.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><br \/>\n<iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/j-8qGBzRxAQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">ADC Interrupt \u2013 LDR-based Light Sensor<\/h1>\n<p style=\"text-align: justify\">Like any other interrupts, ADC interrupt is a very interrupt. In the last example we saw polling-based ADC readout. In this segment, we will see how to use interrupt-based method to extract ADC data. The concept of ADC interrupt is simply to notify that an ADC data has been made ready for reading once triggered.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LDR.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14309\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/LDR.png\" alt=\"LDR\" width=\"299\" height=\"235\" \/><\/a><\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\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 \"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=\"\">\/\/LDR Definitions\/\/<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define LDR_constant\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0100000.0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define R_fixed\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 10000.0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define VDD\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4095<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int adc_value = 0x0000;<\/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=\"\">unsigned int ADC_read(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_i(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int measure_light_intensity(void);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#pragma vector = 0x5B<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">__interrupt void ADC_ISR(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 adc_value = ADC_read();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 clr_ADCF;<\/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 int lux = 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 set_ADCS;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lux = measure_light_intensity();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_i(12, 0, adc_value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_i(12, 1, lux);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 delay_ms(400);<\/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 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_goto(0, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"ADC Count:\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"Lux Value:\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 Enable_ADC_AIN4;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_EADC;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_EA;<\/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 ADC_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 register unsigned int value = 0x0000;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value = ADCRH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value &lt;&lt;= 4;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value |= ADCRL;<\/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 lcd_print_i(unsigned char x_pos, unsigned char y_pos, unsigned int 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 \/ 1000) + 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 % 1000) \/ 100) + 0x30);\u00a0<\/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 % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 3), 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<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int measure_light_intensity(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 float lux = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 lux = adc_value;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 lux = (LDR_constant * ((VDD \/ (R_fixed * lux))) - 0.1);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 if((lux &gt;= 0) &amp;&amp; (lux &lt;= 9999))<\/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 return ((unsigned int)lux);<\/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 else<\/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 return 0;<\/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>Schematic<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_INT_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14308\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_INT_Schematic-580x257.png\" alt=\"ADC_INT_Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_INT_Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_INT_Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">Setting the ADC in interrupt is not much different from the previous example except for the interrupt parts.<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">Enable_ADC_AIN4;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_EADC;<\/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\">We have to enable both the ADC and global interrupts.<\/p>\n<p style=\"text-align: justify\">The reading process is also same:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned int ADC_read(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 register unsigned int value = 0x0000;\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 value = ADCRH;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value &lt;&lt;= 4;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value |= ADCRL;<\/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 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\">The ADC is triggered in the main with the following line of code since we are using software-based triggering:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_ADCS;<\/span><\/pre>\n<p style=\"text-align: justify\">Now instead of reading the ADC in the main by polling, the ADC is read in the interrupt.<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#pragma vector = 0x5B<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">__interrupt void ADC_ISR(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 adc_value = ADC_read();<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 clr_ADCF;<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<p style=\"text-align: justify\">When ADC interrupt occurs, we must clear ADC interrupt flag and read the ADC data registers. In this way, the main code is made free from polling and free for other tasks.<\/p>\n<p style=\"text-align: justify\">The demo here is a rudimentary LDR-based light intensity meter. Light falling on the LDR changes its resistance. Using voltage divider method, we can back calculate the resistance of the LDR and use this info to measure light intensity.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Int.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14315\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Int-580x601.jpg\" alt=\"ADC Int\" width=\"580\" height=\"601\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Int-580x601.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Int.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\/3TcjGDZ4koE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">ADC Comparator<\/h1>\n<p style=\"text-align: justify\">Many micros are equipped with on-chip analogue comparator. N76E003 has an embedded ADC comparator. The main feature of this comparator is the range it offers. Unlike comparators of other micros in which only a few selectable set points can set, the ADC comparator of N76E003 can be set in any range from 0 count to the max ADC count of 4095. This allows us to easily implement it for many applications like low battery alarm, SMPSs, over voltage sense, overload detection, etc. It must be noted however, it is not a true comparator because a true comparator has nothing to do with ADC.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/adc_comparator_block.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14313\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/adc_comparator_block-580x143.png\" alt=\"adc_comparator_block\" width=\"580\" height=\"143\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/adc_comparator_block-580x143.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/adc_comparator_block.png 735w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The comparator block is situated at the output of the ADC and so it is just a single block like the ADC but all eight channels share it. Thus, when it is needed to compare multiple channels, it should be reset and reconfigured.<\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\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 \"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 int adc_value = 0x0000;<\/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=\"\">unsigned int ADC_read(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_ADC_comparator_value(unsigned int value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_i(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#pragma vector = 0x5B<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">__interrupt void ADC_ISR(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 adc_value = ADC_read();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 clr_ADCF;<\/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 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 set_ADCS;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_i(12, 0, adc_value);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 LCD_goto(12, 1);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if((ADCCON2 &amp; 0x10) != 0x00)<\/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\u00a0LCD_putstr(\"HIGH\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 set_P15;<\/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 LCD_putstr(\" LOW\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 clr_P15;<\/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(400);<\/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_goto(0, 0);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"ADC Count:\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"Cmp State:\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 Enable_ADC_BandGap;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 Enable_ADC_AIN4;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_ADC_comparator_value(1023);\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_ADCMPEN;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_EADC;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_EA;<\/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 ADC_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 register unsigned int value = 0x0000;\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value = ADCRH;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value &lt;&lt;= 4;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 value |= ADCRL;<\/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 set_ADC_comparator_value(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 ADCMPH = ((value &amp; 0x0FF0) &gt;&gt; 4);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 ADCMPL = (value &amp; 0x000F);<\/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_i(unsigned char x_pos, unsigned char y_pos, unsigned int 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 \/ 1000) + 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 % 1000) \/ 100) + 0x30);\u00a0<\/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 % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 3), 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\/ADC_comparator_Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14314\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_comparator_Schematic-580x257.png\" alt=\"ADC_comparator_Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_comparator_Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC_comparator_Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">To configure the ADC comparator block, we just need to specify two things \u2013 the reference value with which the comparison should to be done and the polarity of comparison. After setting these up, we have to enable the comparator block. These are done as follows:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_ADC_comparator_value(1023);\u00a0<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">set_ADCMPEN;<\/span><\/pre>\n<p style=\"text-align: justify\">Note in the code snippet above, I didn\u2019t code anything regarding polarity because by default the polarity is set as such that the comparator\u2019s output will change state when the input voltage is greater than or equal to the set ADC count level of 1023.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14312\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator.png\" alt=\"ADC Comparator\" width=\"500\" height=\"329\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Just like ADC reading, we have to take care of the bit positions for the comparator set point. It is coded as follows.<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void set_ADC_comparator_value(unsigned int 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 ADCMPH = ((value &amp; 0x0FF0) &gt;&gt; 4);<\/span><\/pre>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 ADCMPL = (value &amp; 0x000F);<\/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 this demo, I also used the bandgap voltage as reference source:<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">Enable_ADC_BandGap;<\/span><\/pre>\n<p style=\"text-align: justify\">The rest of the code is similar to the ADC interrupt code.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14310\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-1-580x346.jpg\" alt=\"ADC Comparator (1)\" width=\"580\" height=\"346\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-1-580x346.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-1.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14311\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-2-580x357.jpg\" alt=\"ADC Comparator (2)\" width=\"580\" height=\"357\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-2-580x357.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/ADC-Comparator-2.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\/Nn--zrezoqc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<p><!--more--><\/p>\n<h1 style=\"margin-top: 0cm\">Data Flash \u2013 Using APROM as EEPROM<\/h1>\n<p style=\"text-align: justify\">In most standard 8051s, there is no dedicated memory space as EEPROM. This is unlike other microcontrollers of modern era. EEPROM memory is needed for the storage of critical data that need to be retained even in power down state. In N76E003, there are two types of ROM memory. EEPROM-like storage can be achieved by using <strong><em>APROM (Application ROM)<\/em><\/strong>. APROM is the actual flash memory where store our application codes. <strong><em>User Code Loader ROM<\/em><\/strong> or <strong><em>LDROM <\/em><\/strong>of N76E003 microcontroller, is another ROM where we can keep a bootloader and configuration codes. Sizes of these ROMs can be varied according to configuration bits.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Memory-Block.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14316\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/Memory-Block.png\" alt=\"Memory Block\" width=\"401\" height=\"388\" \/><\/a><\/p>\n<h2 style=\"margin-top: 0cm\">Code<\/h2>\n<h3>Flash.h<\/h3>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 CID_READ\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0B<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 DID_READ\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0C<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 PAGE_ERASE_AP\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x22<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 BYTE_READ_AP\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 BYTE_PROGRAM_AP\u00a0\u00a0\u00a0\u00a0 0x21<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 PAGE_SIZE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 128u<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 ERASE_FAIL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x70<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 PROGRAM_FAIL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x71<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 IAPFF_FAIL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x72<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define\u00a0 IAP_PASS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void enable_IAP_mode(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void disable_IAP_mode(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void trigger_IAP(void);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char write_data_to_one_page(unsigned int u16_addr, const unsigned char *pDat, unsigned char num);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void write_data_flash(unsigned int u16_addr, unsigned char *pDat, unsigned int num);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void read_data_flash(unsigned int u16_addr, unsigned char *pDat, unsigned int num);<\/span><\/pre>\n<h3>Flash.c<\/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 \"soft_delay.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Flash.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">static unsigned char EA_Save_bit;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void enable_IAP_mode(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 EA_Save_bit = EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 clr_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0xAA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0x55;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 CHPCON |= 0x01 ;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0xAA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0x55;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 IAPUEN |= 0x01;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 EA = EA_Save_bit;<\/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 disable_IAP_mode(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 EA_Save_bit = EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 clr_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0xAA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0x55;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 IAPUEN &amp;= ~0x01;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0xAA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0x55;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 CHPCON &amp;=~ 0x01;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 EA = EA_Save_bit;<\/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 trigger_IAP(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 EA_Save_bit = EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 clr_EA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0xAA;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 TA = 0x55;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 IAPTRG |= 0x01;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 EA = EA_Save_bit;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">unsigned char write_data_to_one_page(unsigned int u16_addr, const unsigned char *pDat, unsigned char num)<\/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 i = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char offset = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char __code *pCode;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned char __xdata *xd_tmp;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 enable_IAP_mode();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 offset = (u16_addr &amp; 0x007F);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 i = (PAGE_SIZE - offset);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 if(num &gt; i)<\/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 num = i;<\/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 pCode = (unsigned char __code *)u16_addr;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 for(i = 0; i &lt; num; i++)<\/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 if(pCode[i] != 0xFF)<\/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 break;<\/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 if(i == num)<\/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 IAPCN = BYTE_PROGRAM_AP;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPAL = u16_addr;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPAH = (u16_addr &gt;&gt; 8);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(i = 0; i &lt; num; i++)<\/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 IAPFD = pDat[i];<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 trigger_IAP();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPAL++;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 for(i = 0; i &lt; num; i++)<\/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 if(pCode[i] != pDat[i])<\/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\u00a0\u00a0\u00a0\u00a0\u00a0 break;\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<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\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 if(i != num)<\/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 goto WriteDataToPage20;<\/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 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 WriteDataToPage20:<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 pCode = (unsigned char __code *)(u16_addr &amp; 0xFF80);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 for(i = 0; i &lt; 128; i++)<\/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\u00a0 xd_tmp[i] = pCode[i];<\/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 for(i = 0; i &lt; num; i++)<\/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\u00a0 xd_tmp[offset + i] = pDat[i];<\/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 do<\/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\u00a0 IAPAL = (u16_addr &amp; 0xFF80);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPAH = (u16_addr &gt;&gt; 8);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPCN = PAGE_ERASE_AP;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPFD = 0xFF;\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 trigger_IAP();<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPCN =BYTE_PROGRAM_AP;<\/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 for(i = 0; i &lt; 128; i++)<\/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\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IAPFD = xd_tmp[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\u00a0\u00a0\u00a0 trigger_IAP();<\/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 IAPAL++;<\/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><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(i = 0; i &lt; 128; i++)<\/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\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(pCode[i] != xd_tmp[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\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\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 }<\/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 }while(i != 128);<\/span><\/pre>\n<pre><\/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 disable_IAP_mode();<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 return num;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void write_data_flash(unsigned int u16_addr, unsigned char *pDat,unsigned int num)<\/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 int CPageAddr = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned int EPageAddr = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 unsigned int cnt = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 CPageAddr = (u16_addr &gt;&gt; 7);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 EPageAddr = ((u16_addr + num) &gt;&gt; 7);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 while(CPageAddr != EPageAddr)<\/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 cnt = write_data_to_one_page(u16_addr, pDat, 128);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 u16_addr += cnt;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 pDat += cnt;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 num -= cnt;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0\u00a0\u00a0 CPageAddr = (u16_addr &gt;&gt; 7);<\/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(num)<\/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 write_data_to_one_page(u16_addr, pDat, num);<\/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<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void read_data_flash(unsigned int u16_addr, unsigned char *pDat, unsigned int num)<\/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 int i = 0;<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 for(i = 0; i &lt; num; i++)<\/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 pDat[i] = *(unsigned char __code *)(u16_addr+i);<\/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<h3>main.c<\/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 \"soft_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 \"LCD_2_Wire.h\"<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#include \"Flash.h\"<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">#define BASE_ADDRESS\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a03700<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_c(unsigned char x_pos, unsigned char y_pos, unsigned char value);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_i(unsigned char x_pos, unsigned char y_pos, unsigned int 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 s = 0;<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char val[1] = {0};<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 unsigned char ret_val[1] = {0};<\/span><\/pre>\n<pre><\/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><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 clr_P15;\u00a0\u00a0<\/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(\"R Addr:\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"R Data:\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt;= 9; 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 read_data_flash((s + BASE_ADDRESS), ret_val, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 delay_ms(10);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_i(11, 0, (s + BASE_ADDRESS));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_c(13, 1, ret_val[0]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 delay_ms(600);<\/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 delay_ms(2000);<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 set_P15;\u00a0\u00a0<\/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(\"W Addr:\");<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto(0, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putstr(\"W Data:\");<\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 for(s = 0; s &lt;= 9; 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 val[0] = s;\u00a0\u00a0\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 write_data_flash((s + BASE_ADDRESS), val, 1);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 delay_ms(10);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_i(11, 0, (s + BASE_ADDRESS));<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 lcd_print_c(13, 1, val[0]);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0\u00a0\u00a0 delay_ms(600);<\/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 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 };<\/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_c(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<pre><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void lcd_print_i(unsigned char x_pos, unsigned char y_pos, unsigned int 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 \/ 10000) + 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 % 10000) \/ 1000) + 0x30);\u00a0<\/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 % 1000) \/ 100) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 3), y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_putchar(((value % 100) \/ 10) + 0x30);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0 LCD_goto((x_pos + 4), 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\/EEPROM-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14317\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EEPROM-Schematic-580x257.png\" alt=\"EEPROM Schematic\" width=\"580\" height=\"257\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EEPROM-Schematic-580x257.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EEPROM-Schematic.png 843w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">To write and read data from flash we can use the following functions:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void write_data_flash(unsigned int u16_addr, unsigned char *pDat, unsigned int num);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">void read_data_flash(unsigned int u16_addr, unsigned char *pDat, unsigned int num);<\/span><\/pre>\n<p style=\"text-align: justify\">Both of these functions are pointer-based functions. The first parameter of these function is the physical location of data, the second argument is the data pointer itself and the last argument is the number of bytes to read\/write. Try to use the upper addresses of the flash where application code usually doesn\u2019t reside. Reading the flash doesn\u2019t require any involvement of IAP while writing does require IAP. The functions are self-explanatory and can be used readily without any changes since they are provided in the BSP examples.<\/p>\n<p style=\"text-align: justify\">In the demo, ten data bytes are saved in ten separate locations starting from location 3700 to 3709. Prior to that these locations are read. On first start up, these locations have no saved data and so they show up garbage values (205\/255 usually). When a valid user data is saved, the location is updated with it. When reset or powered down, the newly written data bytes are retained and reread when powered up again.<\/p>\n<p style=\"text-align: justify\">Try not to frequently write on the flash since flash memories wear on frequent writes. Use a RAM-based buffer and try to write one page of flash when the buffer is full. In this way, flash memory wear-and-tear is slightly reduced.<\/p>\n<p style=\"text-align: justify\">Be careful about saving locations. Don\u2019t use locations that hold application code. Try to use unoccupied empty flash locations or upper flash addresses. Use the <strong><em>NuMicro ISP Programming Tool<\/em><\/strong> for finding empty locations.<\/p>\n<h2>Demo<\/h2>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EEPROM.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14318\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EEPROM-580x456.jpg\" alt=\"EEPROM\" width=\"580\" height=\"456\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EEPROM-580x456.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/08\/EEPROM.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\/b2iH-DCTfqU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is a continuation of the first post on Nuvoton N76E003 microcontroller here.<\/p>\n","protected":false},"author":5,"featured_media":14254,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1723],"tags":[1646,1722,1729,1728,1721,1720],"class_list":["post-14253","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nuvoton","tag-8-bit-microcontroller","tag-1722","tag-iar","tag-keil","tag-n76e003","tag-nuvoton"],"_links":{"self":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/14253","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=14253"}],"version-history":[{"count":7,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/14253\/revisions"}],"predecessor-version":[{"id":14520,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/14253\/revisions\/14520"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media\/14254"}],"wp:attachment":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=14253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=14253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=14253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}