{"id":13976,"date":"2018-01-12T10:54:58","date_gmt":"2018-01-12T15:54:58","guid":{"rendered":"http:\/\/embedded-lab.com\/blog\/?p=13976"},"modified":"2018-07-02T09:57:15","modified_gmt":"2018-07-02T13:57:15","slug":"continuing-stm8-microcontroller-expedition","status":"publish","type":"post","link":"https:\/\/embedded-lab.com\/blog\/continuing-stm8-microcontroller-expedition\/","title":{"rendered":"Continuing the STM8 Expedition"},"content":{"rendered":"<p>This post is the continuation of the\u00a0first post on STM8 microcontrollers\u00a0<a href=\"http:\/\/embedded-lab.com\/blog\/starting-stm8-microcontrollers\">here<\/a>.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/STM8S105-Discovery.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13315 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/STM8S105-Discovery.jpg\" alt=\"STM8S105 Discovery\" width=\"566\" height=\"230\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h2>ADC Interrupt<\/h2>\n<p style=\"text-align: justify\">Instead of polling for ADC\u2019s end of conversion (EOC) state, it is wise to use ADC interrupt. Just as with any hardware peripheral, interrupt methods make a system highly responsive. Interrupts like these free up the CPU for other tasks. However, it is up to the coder to determine interrupt priorities and look out for situation that may cause too many interrupts to be processed in a short while.<\/p>\n<h4>Hardware Connection<\/h4>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/adc_isr.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13957 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/adc_isr.png\" alt=\"adc_isr\" width=\"388\" height=\"447\" \/><br \/>\n<\/a><\/p>\n<h4 style=\"margin-top: 0cm;text-align: justify\"><span lang=\"EN-US\">Code Example<\/span><\/h4>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\"><strong><em><u>stm8s_it.h (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#ifndef<\/strong> __STM8S_IT_H<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>__STM8S_IT_H<\/strong><\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">@far @interrupt <strong>void<\/strong> <strong>ADC_IRQHandler<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/* Includes ------------------------------------------------------------------*\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">....<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\"><strong><em><u>stm8s_it.c (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> adc_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC_IRQHandler<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 adc_value = <strong>ADC1_GetConversionValue<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ClearFlag<\/strong>(ADC1_FLAG_EOC);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">....<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\"><strong><em><u>stm8_interrupt_vector.c (shortened)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>typedef<\/strong> <strong>void<\/strong> @<strong>far<\/strong> (*interrupt_handler_t)(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> interrupt_instruction;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 interrupt_handler_t interrupt_handler;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/@far @interrupt void NonHandledInterrupt (void)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* in order to detect unexpected events during development,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 it is recommended to set a breakpoint on the following instruction<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/\u00a0\u00a0\u00a0\u00a0 return;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>void<\/strong> <strong>_stext<\/strong>();\u00a0\u00a0\u00a0\u00a0 \/* startup routine *\/<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> <strong>const<\/strong> _vectab[] = {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)<strong>_stext<\/strong>}, \/* reset *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* trap\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq0\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)ADC_IRQHandler}, \/* irq22 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq29 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\"><em><strong><u>main.c<br \/>\n<\/u><\/strong><\/em><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>int<\/strong> adc_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC1_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>float<\/strong> mv = 0x00000000;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_init<\/strong>();\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_clear_home<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(2, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"STM8 ADC ISR\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"A0\/mV\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_StartConversion<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mv = (adc_value * 5000.0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mv \/= 1023.0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(7, 1, mv);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(12, 1, adc_value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_WriteReverse<\/strong>(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(160);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSECmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_LSICmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSICmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_ADC, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOB);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOB, ((GPIO_Pin_TypeDef)(GPIO_PIN_0 | GPIO_PIN_1)),\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_MODE_IN_FL_NO_IT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_OD_HIZ_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_DeInit<\/strong>();\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Init<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_CHANNEL_0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_PRESSEL_FCPU_D18,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_EXTTRIG_GPIO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_ALIGN_RIGHT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_SCHMITTTRIG_CHANNEL0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ITConfig<\/strong>(ADC1_IT_EOCIE, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>enableInterrupts<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> chr = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value \/ 1000) + 0x30);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 100) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4 style=\"text-align: justify\">Explanation<\/h4>\n<p style=\"text-align: justify\">This example and the first ADC example is all same except for the interrupt part. Note the last three lines below.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_DeInit<\/strong>();\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Init<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_CHANNEL_0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_PRESSEL_FCPU_D18,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_EXTTRIG_GPIO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_ALIGN_RIGHT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_SCHMITTTRIG_CHANNEL0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ITConfig<\/strong>(ADC1_IT_EOCIE, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>enableInterrupts<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">As can be seen, <strong><em>End-of-Conversion (EOC)<\/em><\/strong> interrupt has been enabled along with global interrupt and the ADC itself.<\/p>\n<p style=\"text-align: justify\">In the vector mapping file, ADC interrupt is set.<\/p>\n<pre><em><span style=\"color: #0000ff\">{0x82, (interrupt_handler_t)ADC_IRQHandler}, \/* irq22 *\/<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">When ADC EOC interrupt triggers, the ADC data buffer is read and the EOC flag is cleared.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC_IRQHandler<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 adc_value = <strong>ADC1_GetConversionValue<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ClearFlag<\/strong>(ADC1_FLAG_EOC);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4><span lang=\"EN-US\">Demo<\/span><\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13958\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-2-580x359.jpg\" alt=\"ADC ISR (2)\" width=\"580\" height=\"359\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-2-580x359.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-2.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13959\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-1-580x355.jpg\" alt=\"ADC ISR (1)\" width=\"580\" height=\"355\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-1-580x355.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/ADC-ISR-1.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\/ULSZ4W7eEpU?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><\/p>\n<p><!--nextpage--><\/p>\n<h2>Multi-Channel ADC with Scan Mode<\/h2>\n<p style=\"text-align: justify\">When it is required to sense and measure multiple analog voltages, we need to use multiple ADC channels. For example, when we need to build, an electrical energy meter, we need to measure both voltage and current. However, STM8S003K3 has one ADC which is multiplexed over four channels. This does not limit it from acquiring multiple analog signals and the job is easily achieved using ADC scan mode conversion.<\/p>\n<p style=\"text-align: justify\">In scan mode, the ADC automatically scans a sequence of channels from channel 0 to channel n, keeping the results of AD conversion in data buffer registers. At the end of conversion, the results are ready to be read.<\/p>\n<h4>Hardware Connection<\/h4>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/adc_scan.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13984 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/adc_scan.png\" alt=\"adc_scan\" width=\"385\" height=\"446\" \/><br \/>\n<\/a><\/p>\n<h4>Code Example<\/h4>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC1_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>()<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>int<\/strong> A0 = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>int<\/strong> A1 = 0x0000;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_init<\/strong>();\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_clear_home<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(1, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"STM8 Multi-ADC\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"A0\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(9, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"A1\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ScanModeCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_StartConversion<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>ADC1_GetFlagStatus<\/strong>(ADC1_FLAG_EOC) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ClearFlag<\/strong>(ADC1_FLAG_EOC);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 A0 = <strong>ADC1_GetBufferValue<\/strong>(0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 A1 = <strong>ADC1_GetBufferValue<\/strong>(1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(3, 1, A0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(12, 1, A1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(90);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSECmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_LSICmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSICmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_ADC, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOB);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOB, ((GPIO_Pin_TypeDef)(GPIO_PIN_0 | GPIO_PIN_1)), GPIO_MODE_IN_FL_NO_IT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_OD_HIZ_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_DeInit<\/strong>();\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Init<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_CHANNEL_0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_PRESSEL_FCPU_D18,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_EXTTRIG_GPIO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_ALIGN_RIGHT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_SCHMITTTRIG_CHANNEL0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Init<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_CHANNEL_1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_PRESSEL_FCPU_D18,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_EXTTRIG_GPIO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 ADC1_ALIGN_RIGHT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 ADC1_SCHMITTTRIG_CHANNEL1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ConversionConfig<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ((ADC1_Channel_TypeDef)(ADC1_CHANNEL_0 | ADC1_CHANNEL_1)),<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ADC1_ALIGN_RIGHT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_DataBufferCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> chr = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value \/ 1000) + 0x30);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 100) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">The setup here is same as the setup for the other ADC examples. There are a few difference though. Firstly, the channel configuration. Note that here two channels are used and are independently configured. This is so because each channel may have different properties. Secondly, conversion mode and data alignments are set. Thirdly, data buffers are enabled to capture ADC data on different channels.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ADC1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_DeInit<\/strong>();\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Init<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_CHANNEL_0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_PRESSEL_FCPU_D18,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_EXTTRIG_GPIO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_ALIGN_RIGHT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_SCHMITTTRIG_CHANNEL0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Init<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_CHANNEL_1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_PRESSEL_FCPU_D18,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_EXTTRIG_GPIO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_ALIGN_RIGHT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 ADC1_SCHMITTTRIG_CHANNEL1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_ConversionConfig<\/strong>(ADC1_CONVERSIONMODE_CONTINUOUS,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ((ADC1_Channel_TypeDef)(ADC1_CHANNEL_0 | ADC1_CHANNEL_1)),<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ADC1_ALIGN_RIGHT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_DataBufferCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ADC1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Polling method is used to start and extract ADC data. Firstly, the ADC is told to do scan conversion. The conversion is then started. We, then, poll the end-of-conversion condition (EOC) status. EOC notifies that all ADC data have been captured and a scan has successfully completed. Finally, the EOC flag is cleared and the data are read from separate data buffers. Everytime a new scan is started the previous buffer data are cleared and are updated with new ones.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>ADC1_ScanModeCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>ADC1_StartConversion<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>while<\/strong>(<strong>ADC1_GetFlagStatus<\/strong>(ADC1_FLAG_EOC) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>ADC1_ClearFlag<\/strong>(ADC1_FLAG_EOC);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">A0 = <strong>ADC1_GetBufferValue<\/strong>(0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">A1 = <strong>ADC1_GetBufferValue<\/strong>(1);<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Demo<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13985\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-1-580x417.jpg\" alt=\"Scan Mode ADC (1)\" width=\"580\" height=\"417\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-1-580x417.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-1.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13986\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-2-580x427.jpg\" alt=\"Scan Mode ADC (2)\" width=\"580\" height=\"427\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-2-580x427.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Scan-Mode-ADC-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\/OJbVsiXAE78?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>Creating Delays using Basic Timer<\/h2>\n<p style=\"text-align: justify\">Rather than using loops of no operation instructions, it is wiser to use an unused or free timer to create software delays. It will be both accurate and precise. It can be done with any timer but using a basic timer will be a smart move because basic timers are usually for timebase generation purposes.<\/p>\n<h4>Hardware Connection<\/h4>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/CubeMX.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13368 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2017\/04\/CubeMX.png\" alt=\"CubeMX\" width=\"415\" height=\"537\" \/><br \/>\n<\/a><\/p>\n<h4>Code Example<\/h4>\n<pre><em><span style=\"color: #0000ff\">\u00a0<strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>delay_us<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> us);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>delay_ms<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> ms);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_WriteReverse<\/strong>(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(400);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSECmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_LSICmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSICmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_I2C, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_OD_HIZ_SLOW);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>delay_us<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> us)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_DeInit<\/strong>();\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>((us &lt;= 200) &amp;&amp; (us &gt;= 0))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_16, 200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((us &lt;= 400) &amp;&amp; (us &gt; 200))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 us &gt;&gt;= 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_32, 200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((us &lt;= 800) &amp;&amp; (us &gt; 400))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 us &gt;&gt;= 2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_64, 200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((us &lt;= 1600) &amp;&amp; (us &gt; 800))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 us &gt;&gt;= 3;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_128, 200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>TIM4_GetCounter<\/strong>() &lt; us);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_ClearFlag<\/strong>(TIM4_FLAG_UPDATE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(DISABLE);\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>delay_ms<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> ms)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(ms--)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_us<\/strong>(1000);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">The very first important things to decide and note are the clock speeds of peripherals and CPU. Here both are set to 16MHz. Secondly, TIM4 is use to create software delays and so it should be clocked.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>....<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, ENABLE);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">The smallest unit of time that we usually use in microcontroller coding is microseconds and so it should be coded first:<\/p>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>delay_us<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> us)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_DeInit<\/strong>();\u00a0\u00a0\u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>((us &lt;= 200) &amp;&amp; (us &gt;= 0))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_16, 200);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((us &lt;= 400) &amp;&amp; (us &gt; 200))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 us &gt;&gt;= 1;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_32, 200);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((us &lt;= 800) &amp;&amp; (us &gt; 400))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 us &gt;&gt;= 2;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_64, 200);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((us &lt;= 1600) &amp;&amp; (us &gt; 800))<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 us &gt;&gt;= 3;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_TimeBaseInit<\/strong>(TIM4_PRESCALER_128, 200);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(ENABLE);\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>TIM4_GetCounter<\/strong>() &lt; us);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_ClearFlag<\/strong>(TIM4_FLAG_UPDATE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM4_Cmd<\/strong>(DISABLE);\u00a0\u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<p style=\"text-align: justify\">TIM4 is deinitialized first. The input or argument to the <strong><em>delay_us<\/em><\/strong> function is the amount of time in microseconds we wish to delay. TIM4 is an 8-bit timer and so it can count up to 255. For simplicity, the count has been limited to 200. The first <strong><em>if-else<\/em><\/strong> conditional statement will configure the timer for periods from 0 to 200 microseconds. Input clock to the timer is prescaled by 16 and so it has a input clock frequency of 1MHz or 1 microsecond tick interval. In the while loop at the bottom of the function, TIM4\u2019s counter count is checked against the variable <strong><em>us<\/em><\/strong>. The loop breaks when the counter exceeds the variable\u2019s value, creating a software delay. For bigger delays, the other conditional statements are used.<\/p>\n<p style=\"text-align: justify\">For more bigger delays, delay milliseconds (<strong><em>delay_ms<\/em><\/strong>) function is used. This function loops calls of a thousand microseconds.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>delay_ms<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> ms)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(ms--)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_us<\/strong>(1000);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">The demo here is just a simple LED blinker.<\/p>\n<h4>Demo<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Software-Delay.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13988\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Software-Delay-512x650.jpg\" alt=\"Software Delay\" width=\"512\" height=\"650\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Software-Delay-512x650.jpg 512w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Software-Delay.jpg 590w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/CIQzuBrd260?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>Encoder Interface<\/h2>\n<p style=\"text-align: justify\">In applications like motor control, it is often required to know how much a motor has rotated, how fast it is rotating and in which direction. It is possible to deduce these feedback data with interrupts, timers and even with tricky GPIO coding. However, using methods employing GPIOs, interrupts and timers will add some resource overhead and will also add up extra coding efforts. STM8s have in-built encoder decoding interface that can be used in such scenarios without extra coding or hardware addition.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Rotary-Click-Binary-Clock.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13990 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Rotary-Click-Binary-Clock.jpg\" alt=\"Rotary Click Binary Clock\" width=\"540\" height=\"590\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The applications of encoder decoding interface are not only limited to acquiring motor feedbacks. The encoder interface can also be used to interface rotary encoders, linear actuators, digital volume control, etc. Here in this example, I demonstrated this encoder interface with a rotary encoder.<\/p>\n<h4>Hardware Connection<\/h4>\n<h4 style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/enc.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13991\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/enc.png\" alt=\"enc\" width=\"450\" height=\"387\" \/><\/a><\/h4>\n<p>&nbsp;<\/p>\n<h4>Code Example<\/h4>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LED_Port<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIOD<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LED_Pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>()<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>int<\/strong> present_value = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>int<\/strong> previous_value = 0x0001;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_init();\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(1, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"STM8S QEI Test\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"Value:\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 present_value = TIM1_GetCounter();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(present_value != previous_value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(12, 1, present_value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteReverse(LED_Port, LED_Pin);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 previous_value = present_value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSECmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_LSICmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOC);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOC,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 \u00a0((GPIO_Pin_TypeDef)(GPIO_PIN_1 | GPIO_PIN_2)),<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 \u00a0GPIO_MODE_IN_PU_NO_IT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(LED_Port, LED_Pin, GPIO_MODE_OUT_OD_HIZ_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_TimeBaseInit(10, TIM1_COUNTERMODE_UP, 1000, 1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_EncoderInterfaceConfig(TIM1_ENCODERMODE_TI12,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0TIM1_ICPOLARITY_FALLING,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0TIM1_ICPOLARITY_FALLING);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_Cmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> tmp[5] = {0x20, 0x20, 0x20, 0x20, '\\0'} ;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp[0] = ((value \/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 \u00a0\u00a0 tmp[1] = (((value \/ 100) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp[2] = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 \u00a0\u00a0 tmp[3] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(tmp);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p>A rotary\/quadrature encoder gives two outputs that are slightly out of phase:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/rotary.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13993\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/rotary-580x146.png\" alt=\"rotary\" width=\"580\" height=\"146\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/rotary-580x146.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/rotary.png 813w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Thus, to interface such an encoder, we will need two timer inputs. <strong><em>TI12 <\/em><\/strong>are those inputs. <strong><em>TI12 <\/em><\/strong>are mapped to <strong><em>TIM1_CH1<\/em><\/strong> and <strong><em>TIM1_CH2<\/em><\/strong> respectively. These inputs need to be pulled up unless external pull-up resistors are used.<\/p>\n<pre><em><span style=\"color: #0000ff\">GPIO_DeInit(GPIOC);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">GPIO_Init(GPIOC,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ((GPIO_Pin_TypeDef)(GPIO_PIN_1 | GPIO_PIN_2)),<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_MODE_IN_PU_NO_IT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">The peripheral and CPU clocks are set as follows:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Since TIM1\u2019s encoder interface is used, TIM1 peripheral clock is enabled and the I2C clock is enabled for the I2C LCD module.<\/p>\n<p style=\"text-align: justify\">Then, the main thing to explain here is the way the timer is set for encoder interface:<\/p>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_DeInit();<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_TimeBaseInit(10, TIM1_COUNTERMODE_UP, 1000, 1);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_EncoderInterfaceConfig(TIM1_ENCODERMODE_TI12,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPOLARITY_FALLING,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TIM1_ICPOLARITY_FALLING);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_Cmd(ENABLE);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\">}<\/span><\/pre>\n<p style=\"text-align: justify\">The 1000 in the time base setup is maximum encoder interface count, i.e. the encoder interface\u2019s output will span from 0 to 1000.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-modes.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13992\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-modes-580x235.png\" alt=\"Encoder modes\" width=\"580\" height=\"235\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-modes-580x235.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-modes.png 680w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Since we are using two inputs, the encoder interface is setup according to the third option shown above.<\/p>\n<p>To get current encoder count, TIM1\u2019s counter is read as follows:<\/p>\n<pre><em><span style=\"color: #0000ff\">present_value = TIM1_GetCounter();<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4><span lang=\"EN-US\">Demo<\/span><\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13994\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-1-580x529.jpg\" alt=\"Encoder Interface (1)\" width=\"580\" height=\"529\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-1-580x529.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-1.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13995\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-2-580x509.jpg\" alt=\"Encoder Interface (2)\" width=\"580\" height=\"509\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-2-580x509.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Encoder-Interface-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\/YQW0VAG7eM4?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>One Pulse Mode (OPM)<\/h2>\n<p style=\"text-align: justify\">One Pulse Mode (OPM) is an additional feature of STM8 timers. It is like a monostable multivibrator or a one-shot timer that can be used to generate a pulse of fixed width after a defined amount of delay. It has several uses like wake up command generator for other onboard devices\/microcontrollers, trigger for sensors like DHT22, etc.<\/p>\n<h4>Hardware Connection<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13999\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm-580x513.png\" alt=\"opm\" width=\"580\" height=\"513\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm-580x513.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm.png 693w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><br \/>\n<\/a><\/p>\n<h4>Code Example<\/h4>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSECmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSERDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_LSICmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSICmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_I2C, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_UART2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER3, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOC);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOC, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_WriteHigh<\/strong>(GPIOC, GPIO_PIN_4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(2000);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_TimeBaseInit<\/strong>(160, TIM1_COUNTERMODE_UP, 10000, 1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_OC4Init<\/strong>(TIM1_OCMODE_PWM2,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_OUTPUTSTATE_ENABLE,\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 6000,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_OCPOLARITY_HIGH,\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_OCIDLESTATE_RESET);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_SelectOnePulseMode<\/strong>(TIM1_OPMODE_SINGLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_CtrlPWMOutputs<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">Firstly, the peripheral and CPU clocks are set at max speed:<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">....\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, ENABLE);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">TIM1 is setup is as simply as we would do for PWM generation. However, for one pulse mode (OPM) we must select one pulse mode.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_TimeBaseInit<\/strong>(160, TIM1_COUNTERMODE_UP, 10000, 1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_OC4Init<\/strong>(TIM1_OCMODE_PWM2,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_OUTPUTSTATE_ENABLE,\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 6000,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_OCPOLARITY_HIGH,\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_OCIDLESTATE_RESET);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_SelectOnePulseMode<\/strong>(TIM1_OPMODE_SINGLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_CtrlPWMOutputs<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">At this point it is necessary to describe TIM1 PWM modes. There are two PWM mode \u2013 PWM mode 1 and PWM mode 2.<\/p>\n<p style=\"text-align: justify\"><strong><em><u>PWM Mode 1 <\/u><\/em><\/strong><\/p>\n<p style=\"text-align: justify\">In up-counting mode, the channel is active if the counter is less than CCR1 or else it is inactive.<br \/>\nThe opposite is true in down-counting mode.<\/p>\n<p style=\"text-align: justify\"><strong><em><u>PWM Mode 2<\/u><\/em><\/strong><\/p>\n<p style=\"text-align: justify\">The channel is inactive as long as the counter is less than CCR1 in up- counting mode.<\/p>\n<p style=\"text-align: justify\">For OPM example here, we need PWM mode 2.<\/p>\n<p style=\"text-align: justify\">In this example the pulse width time of the one pulse is about 0.25ms and has a delay of 0.375ms. The calculation is very simple. Since 16MHz clock is used, one cycle takes 62.5ns and so 10000 counts equal 0.625ms. Because we are using PWM mode 2, it will take more than 6000 counts or 0.375ms before the one pulse start. The pulse has a width of (10000 &#8211; 6000) = 4000 counts or 0.25ms and will end after this time.<\/p>\n<h4>Demo<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/OPM.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-13998\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/OPM-580x332.jpg\" alt=\"OPM\" width=\"580\" height=\"332\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/OPM-580x332.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/OPM.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14110\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm1-580x309.png\" alt=\"opm\" width=\"580\" height=\"309\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm1-580x309.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/opm1.png 725w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/zJy3_cCYUfY?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>PWM Input Mode (PWMI)<\/h2>\n<p style=\"text-align: justify\">With timer capture input we can capture the frequency of an incoming waveform. However, this is not the only stuff that we can do with capture hardware. We can use it to determine the waveform\u2019s duty cycle too. Deducing duty cycle enable us to do lot of other stuffs like decoding IR remote signal patterns, measuring time to determine distance measured by an ultrasonic rangefinder sensor, measuring time slot lengths of a one-wire sensor like DHT11 and so on. A very clever feature of STM8 timers is the PWM input capture mode. With this mode we can time the pulse widths of an incoming signal.<\/p>\n<h4>Hardware Connection<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMM_HW.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14001\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMM_HW.png\" alt=\"PWMM_HW\" width=\"465\" height=\"559\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.h (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#ifndef<\/strong> __STM8S_IT_H<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>__STM8S_IT_H<\/strong><\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">@far @interrupt <strong>void<\/strong> <strong>TIM1_CH1_CCP_IRQHandler<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/* Includes ------------------------------------------------------------------*\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">....<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.c (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>signed<\/strong> <strong>long<\/strong> duty_cycle;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_CH1_CCP_IRQHandler<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 duty_cycle = <strong>TIM1_GetCapture2<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ClearITPendingBit<\/strong>(TIM1_IT_CC2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">....<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8_interrupt_vector.c (shortened)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>typedef<\/strong> <strong>void<\/strong> @far (*interrupt_handler_t)(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> interrupt_instruction;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 interrupt_handler_t interrupt_handler;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>void<\/strong> <strong>_stext<\/strong>();\u00a0\u00a0\u00a0\u00a0 \/* startup routine *\/<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> <strong>const<\/strong> _vectab[] = {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)<strong>_stext<\/strong>}, \/* reset *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* trap\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq0\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)TIM1_CH1_CCP_IRQHandler}, \/* irq12 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq29 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>main.c<\/u><\/em><\/strong><\/p>\n<pre><span style=\"color: #0000ff\"><em><strong>#include<\/strong> \"STM8S.h\"<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>#include<\/strong> \"lcd.h\"<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>signed<\/strong> <strong>long<\/strong> duty_cycle = 0;<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>TIM2_setup<\/strong>(<strong>void<\/strong>);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>print_I<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>long<\/strong> value);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>main<\/strong>()<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{\u00a0\u00a0\u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>int<\/strong> i = 100;<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_setup<\/strong>();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM2_setup<\/strong>();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_init();\u00a0<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_clear_home();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 0);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"PWM Capture Test\");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"T\/ms:\");<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(10);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(GPIO_ReadInputPin(GPIOB, GPIO_PIN_7) == RESET)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteLow(GPIOD, GPIO_PIN_0);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(100);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(GPIO_ReadInputPin(GPIOB, GPIO_PIN_7) == RESET);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteHigh(GPIOD, GPIO_PIN_0);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i += 100;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(i\u00a0 &gt; 1000)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i = 100;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_SetCompare1(i);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_SetCompare2(i);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_I<\/strong>(11, 1, duty_cycle);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(100);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_DeInit();<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSECmd(DISABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_LSICmd(DISABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{\u00a0\u00a0\u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOB);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOC);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOC, GPIO_PIN_1, GPIO_MODE_IN_FL_NO_IT);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOD);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_DeInit();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_TimeBaseInit(2000, TIM1_COUNTERMODE_UP, 55535, 1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_CCxCmd(TIM1_CHANNEL_2, ENABLE);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_PWMIConfig(TIM1_CHANNEL_1,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 TIM1_ICPOLARITY_RISING,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 TIM1_ICSELECTION_DIRECTTI,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 TIM1_ICPSC_DIV1,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 0);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_PWMIConfig(TIM1_CHANNEL_2,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 TIM1_ICPOLARITY_FALLING,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 TIM1_ICSELECTION_INDIRECTTI,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 TIM1_ICPSC_DIV1,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 0);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_SelectInputTrigger(TIM1_TS_TI1FP1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_SelectSlaveMode(TIM1_SLAVEMODE_RESET);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ClearFlag(TIM1_FLAG_CC2);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ITConfig(TIM1_IT_CC2, ENABLE);\u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_Cmd(ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enableInterrupts();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>TIM2_setup<\/strong>(<strong>void<\/strong>)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_DeInit();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_TimeBaseInit(TIM2_PRESCALER_32, 1250);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_OC1Init(TIM2_OCMODE_PWM2, TIM2_OUTPUTSTATE_ENABLE, 1000,\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TIM2_OCPOLARITY_LOW);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_OC2Init(TIM2_OCMODE_PWM2, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_LOW);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_SetCompare1(100);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_SetCompare2(100);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM2_Cmd(ENABLE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>print_I<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>long<\/strong> value)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> tmp[6] = {0x20, 0x20, 0x20, 0x20, 0x20, '\\0'} ;<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp[0] = ((value \/ 10000) + 0x30);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 \u00a0\u00a0 tmp[1] = (((value \/ 1000) % 10) + 0x30);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp[2] = (((value \/ 100) % 10) + 0x30);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 \u00a0\u00a0 tmp[3] = (((value \/ 10) % 10) + 0x30);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 \u00a0\u00a0 tmp[4] = ((value % 10) + 0x30);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/pre>\n<pre><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(tmp);\u00a0<\/span><\/pre>\n<pre><span style=\"color: #0000ff\">}<\/span><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">The setup and code for this example is same as the timer input capture example. There are few difference though. Unlike the timer input capture example in which TIM2\u2019s output waveform\u2019s period was measured, here the duty cycle or pulse on time of TIM2\u2019s output waveform is measured. Additionally the following lines of code are added for TIM1 capture hardware:<\/p>\n<pre><span style=\"color: #0000ff\"><em>TIM1_PWMIConfig(TIM1_CHANNEL_1,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPOLARITY_RISING,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 TIM1_ICSELECTION_DIRECTTI,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPSC_DIV1,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>TIM1_PWMIConfig(TIM1_CHANNEL_2,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPOLARITY_FALLING,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICSELECTION_INDIRECTTI,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPSC_DIV1,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>TIM1_SelectInputTrigger(TIM1_TS_TI1FP1);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>TIM1_SelectSlaveMode(TIM1_SLAVEMODE_RESET);<\/em><\/span><\/pre>\n<p style=\"text-align: justify\">The above code can alternatively written as follows:<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPOLARITY_RISING,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICSELECTION_DIRECTTI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPSC_DIV1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_2,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPOLARITY_FALLING,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICSELECTION_INDIRECTTI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICPSC_DIV1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0);\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_SelectInputTrigger<\/strong>(TIM1_TS_TI1FP1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_SelectSlaveMode<\/strong>(TIM1_SLAVEMODE_RESET);\u00a0\u00a0<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">The main theme of PWM input measurement is to capture both edges of a pulse and time the difference between these captures. Physically just one GPIO is needed for this purpose but internally two timer channels are assigned for the task. One is set to capture rising edge while the other falling edge. The first channel which is set to capture rising edge, triggers or starts the timer while the second resets it. For the first channel, we do not need to set any interrupt as it will start the timer automatically when it has sensed a rising edge. However, for the second channel, capture interrupt is needed to notify completion of a duty cycle capture.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_ClearFlag<\/strong>(TIM1_FLAG_CC2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_ITConfig<\/strong>(TIM1_IT_CC2, ENABLE);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Owing to this, channel 2\u2019s capture data is extracted to compute duty cycle.<\/p>\n<pre><em><span style=\"color: #0000ff\">duty_cycle = <strong>TIM1_GetCapture2<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_ClearITPendingBit<\/strong>(TIM1_IT_CC2);<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Demo<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14002\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-2-580x256.jpg\" alt=\"PWMI (2)\" width=\"580\" height=\"256\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-2-580x256.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-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\/Gwv3zVbnVvk?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>PWM Duty Capture using Software<\/h2>\n<p style=\"text-align: justify\">It is possible to measure pulse widths with only one timer input capture pin and avoid PWMI mode. However, some software tricks must be applied to reliably do the measurements.<\/p>\n<h4>Hardware Connection<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/pwm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14005\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/pwm.png\" alt=\"pwm\" width=\"498\" height=\"427\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.h (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#ifndef<\/strong> __STM8S_IT_H<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>__STM8S_IT_H<\/strong><\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">@far @interrupt <strong>void<\/strong> <strong>TIM1_CH1_CCP_IRQHandler<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/* Includes ------------------------------------------------------------------*\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>....<\/strong><\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.c (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>static<\/strong> bool state = FALSE;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>long<\/strong> duty_cycle;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>long<\/strong> start_time;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>long<\/strong> end_time;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_CH1_CCP_IRQHandler<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(<strong>TIM1_GetFlagStatus<\/strong>(TIM1_FLAG_CC1))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 <strong>if<\/strong>(state == FALSE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 start_time = <strong>TIM1_GetCapture1<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TIM1_ICSELECTION_DIRECTTI, 1, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end_time = <strong>TIM1_GetCapture1<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, 1, 1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 duty_cycle = (end_time - start_time);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 state = ~state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ClearITPendingBit<\/strong>(TIM1_IT_CC1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ClearFlag<\/strong>(TIM1_FLAG_CC1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>....<\/strong><\/span><\/em><\/pre>\n<p><strong><em>\u00a0<\/em><\/strong><\/p>\n<p><strong><em><u>stm8_interrupt_vector.c (shortened)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>typedef<\/strong> <strong>void<\/strong> @<strong>far<\/strong> (*interrupt_handler_t)(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> interrupt_instruction;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 interrupt_handler_t interrupt_handler;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>void<\/strong> <strong>_stext<\/strong>();\u00a0\u00a0\u00a0\u00a0 \/* startup routine *\/<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> <strong>const<\/strong> _vectab[] = {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)<strong>_stext<\/strong>}, \/* reset *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* trap\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq0\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)TIM1_CH1_CCP_IRQHandler}, \/* irq12 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq29 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<p><strong><em>\u00a0<\/em><\/strong><\/p>\n<p><strong><em><u>main.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>long<\/strong> duty_cycle = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>long<\/strong> start_time = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>long<\/strong> end_time = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM2_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_I<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>long<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>()<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>long<\/strong> time_period = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM2_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_init<\/strong>();\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_clear_home<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(0, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"PWM Capture Test\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"T\/ms:\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(10);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_I<\/strong>(13, 1, duty_cycle);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(900);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSECmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_LSICmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSICmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV8);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_SPI, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER2, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_I2C, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOC);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOC, GPIO_PIN_1, GPIO_MODE_IN_FL_NO_IT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_TimeBaseInit<\/strong>(2000, TIM1_COUNTERMODE_UP, 55535, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_CCxCmd<\/strong>(TIM1_CHANNEL_1, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, 1, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ITConfig<\/strong>(TIM1_IT_CC1, ENABLE);\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>enableInterrupts<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM2_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM2_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM2_TimeBaseInit<\/strong>(TIM2_PRESCALER_32, 1250);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM2_OC1Init<\/strong>(TIM2_OCMODE_PWM2, TIM2_OUTPUTSTATE_ENABLE, 1000, TIM2_OCPOLARITY_LOW);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM2_SetCompare1<\/strong>(1125);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM2_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_I<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>long<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> ch = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x2D);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &gt; 9999)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch = ((value \/ 10000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 10000)\/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 4), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 5), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 999) &amp;&amp; (value &lt;= 9999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 10000)\/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 4), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 5), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 4), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 5), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 4), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 5), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">ch = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 4), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 5), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">Everything here is same as the previous capture example. Since we have to sense both edges for capturing a pulse\u2019s width, we will have to do something more in the interrupt routine to take care of this issue.<\/p>\n<p style=\"text-align: justify\">We assume and select that the first edge that the timer input will capture will be the rising edge of the waveform. Given this fact, the timer is set as follows:<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, 1, 1);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">So when the capture interrupt is triggered, we know for sure that it was caused by the rising edge of the pulse captured.<\/p>\n<p style=\"text-align: justify\">In the input capture interrupt, the very first thing to do is to check the capture-compare flag and then we check last setup state of the timer. Since rising edge capture was initially configured, the first capture count is actually the start time of the pulse. Upon detecting this we must quickly reconfigure the timer capture hardware to sense falling edge.<\/p>\n<p style=\"text-align: justify\">Now the timer\u2019s capture interrupt will be triggered on the falling edge and we have to measure the timer\u2019s count on this next interrupt. This second count is the end time of the pulse. The difference between these counts represents the pulse width.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TIM1_CH1_CCP_IRQHandler<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(<strong>TIM1_GetFlagStatus<\/strong>(TIM1_FLAG_CC1))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 <strong>if<\/strong>(state == FALSE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 start_time = <strong>TIM1_GetCapture1<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING,\u00a0\u00a0\u00a0\u00a0 TIM1_ICSELECTION_DIRECTTI, 1, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end_time = <strong>TIM1_GetCapture1<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ICInit<\/strong>(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, 1, 1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 duty_cycle = (end_time - start_time);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 state = ~state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ClearITPendingBit<\/strong>(TIM1_IT_CC1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>TIM1_ClearFlag<\/strong>(TIM1_FLAG_CC1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Every time a TIM1 capture-compare interrupt occurs, the timer\u2019s sense edge is altered along with a variable called \u201cstate\u201d. This variable helps in remembering which edge it detected last time and which count was captured. Finally, before leaving the interrupt sub-routine pending and flag bits are reset.<\/p>\n<h3 style=\"text-align: justify\">Demo<\/h3>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14004\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-1-580x215.jpg\" alt=\"PWMI (1)\" width=\"580\" height=\"215\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-1-580x215.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/PWMI-1.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\/DvXU7NkdZII?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>Low Power Sleep Mode<\/h2>\n<p style=\"text-align: justify\">Low power sleep mode is a major requirement in any modern era microcontroller and that is because present-day modern gadgets use batteries as primary energy source. For instance, consider a smart watch like the Mikroelektronika\u2019s HexiWear. Unlike previous generation of watches which used tiny LCDs and LED displays, this watch uses an OLED screen to project info. Most of the time we do not keep our eyes fixed at our watch and so it is unnecessary to keep the display powered up. Thus, it is a good idea to put the display and other unimportant functionalities of the watch to sleep. This suspended state in turn save limited battery energy to a great extent. The same trick can also be applied to STM8s.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/HexiWear.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14009\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/HexiWear-580x629.jpg\" alt=\"HexiWear\" width=\"580\" height=\"629\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/HexiWear-580x629.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/HexiWear.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">There are a number of ways to reduce power consumption of a design. These include:<\/p>\n<ul style=\"text-align: justify\">\n<li>Using low frequency clocks.<\/li>\n<li>Slowing down or switching to low speed clocks when fast processing is not needed.<\/li>\n<li>Stopping or deinitializing unused hardware peripheral modules.<\/li>\n<li>Using lower power supply voltages without compromising brownout limits.<\/li>\n<li>Suspending the CPU until certain event(s) take place.<\/li>\n<li>Avoiding polling-based or blocking codes.<\/li>\n<li>Optimizing and organizing codes so that tasks are quickly and efficiently done.<\/li>\n<li>Reducing design sizes and using SMD components.<\/li>\n<li>Following recommended design notes and layout.<\/li>\n<\/ul>\n<p style=\"text-align: justify\">In terms of coding, including low power sleep mode in a code needs well-organized code planning. A developer must probe and formulate plans for both wakeup and sleep events. This is so because if a MCU goes to sleep then it must wake up upon fulfillment of certain event(s) or else it will appear to have got stuck in an unprecedented loop and will behave unresponsively. Similarly, it is wise to put it to sleep as much as possible in order to reduce power consumption. Thus, events like interrupts are very important in this regard.<\/p>\n<p>&nbsp;<\/p>\n<h4>Hardware Connection<\/h4>\n<h4 style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14008\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware.png\" alt=\"Hardware\" width=\"454\" height=\"560\" \/><\/a><\/h4>\n<p>&nbsp;<\/p>\n<h4>Code Example<\/h4>\n<p>&nbsp;<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>bool<\/strong> state = FALSE;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>EXTI_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> i = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>EXTI_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = 0; i &lt;= 6; i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteReverse(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(900);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wfi();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong> (TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = 0; i &lt; 4; i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteReverse(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(600);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = 0; i &lt; 4; i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteReverse(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(300);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 halt();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOB);\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_IN_PU_IT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>EXTI_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ITC_DeInit();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ITC_SetSoftwarePriority(ITC_IRQ_PORTB, ITC_PRIORITYLEVEL_0);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 EXTI_DeInit();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_FALL_ONLY);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rim();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSECmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_LSICmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">As the hardware connections suggest, Discovery board\u2019s built-in LED and button are used. The button is set as an external interrupt source. In the main code shown below, all hardware and clock are set. When the board is powered, the built-in LED flashes slowly three times indicating the beginning of the application code. After the flashing has stopped, there is no other activity. This is because of the function<\/p>\n<p style=\"text-align: justify\"><strong><em>wfi()<\/em><\/strong> \u2013 Wait for Interrupt<em>. <\/em>When this function executes, the CPU is halted until an interrupt occurs. Here, the built-in button comes into play. It introduces the required interrupt. This interrupt causes the CPU to wake up and the CPU continues executing next instructions. Again, we\u2019ll see fast variable rate flashes of the built-in LED and then no repetition of the same activity despite being in the main loop. This is because of the <strong><em>halt()<\/em><\/strong> function. This function also does the same thing as the wait for interrupt function. Thus, halt function also suspends CPU activities, reducing power consumption.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> i = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>EXTI_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = 0; i &lt;= 6; i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteReverse(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(900);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wfi();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong> (TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = 0; i &lt; 4; i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteReverse(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(600);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = 0; i &lt; 4; i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteReverse(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(300);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 halt();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Demo<\/h4>\n<h4 style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14010\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-1-580x242.jpg\" alt=\"WFI (1)\" width=\"580\" height=\"242\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-1-580x242.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-1.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14011\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-2-580x242.jpg\" alt=\"WFI (2)\" width=\"580\" height=\"242\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-2-580x242.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/WFI-2.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/h4>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/vTCWKv8is_s?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>Auto Wakeup Mode (AWU)<\/h2>\n<p style=\"text-align: justify\">Imagine that you have to design a data acquisition system like a solar-powered weather station that will log data periodically. You can guess that there is a limitation of available energy to keep up the system and continuous monitoring is unnecessary. Thus weather data is periodically obtained and the system has no other task rather than to sleep. In situations like this we have to rely on STM8\u2019s low power mode with auto wakeup feature.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ATMega328P-Weather-Station-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14007\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ATMega328P-Weather-Station-2-580x500.jpg\" alt=\"ATMega328P Weather Station (2)\" width=\"580\" height=\"500\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ATMega328P-Weather-Station-2-580x500.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ATMega328P-Weather-Station-2-1024x883.jpg 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ATMega328P-Weather-Station-2.jpg 1369w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The Auto Wakeup Unit (AWU) of STM8 microcontrollers is like an alarm clock. All we have to do is to set the time for wake up and put our device to sleep. Time ticks and the CPU wakes up to do assigned tasks once the time is over.<\/p>\n<h4 style=\"margin-top: 0cm\"><span lang=\"EN-US\">Hardware Connection<\/span><\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14008\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware.png\" alt=\"Hardware\" width=\"454\" height=\"560\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.h (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#ifndef<\/strong> __STM8S_IT_H<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>__STM8S_IT_H<\/strong><\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">@far @interrupt <strong>void<\/strong> <strong>AWU_trigger_IRQHandler<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/* Includes ------------------------------------------------------------------*\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">....<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.c (top part only)<\/u><\/em><\/strong><\/p>\n<pre><span style=\"color: #0000ff\"><em><strong>#include<\/strong> \"stm8s.h\"<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>#include<\/strong> \"stm8s_it.h\"<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>AWU_trigger_IRQHandler<\/strong>(<strong>void<\/strong>)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 <strong>AWU_GetFlagStatus<\/strong>();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>....<\/em><\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8_interrupt_vector.c (shortened)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>typedef<\/strong> <strong>void<\/strong> @<strong>far<\/strong> (*interrupt_handler_t)(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> interrupt_instruction;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 interrupt_handler_t interrupt_handler;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/@far @interrupt void NonHandledInterrupt (void)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 \/* in order to detect unexpected events during development,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 it is recommended to set a breakpoint on the following instruction<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/\u00a0 return;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>void<\/strong> <strong>_stext<\/strong>();\u00a0\u00a0\u00a0\u00a0 \/* startup routine *\/<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> interrupt_vector <strong>const<\/strong> _vectab[] = {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)_stext}, \/* reset *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {0x82, AWU_trigger_IRQHandler}, \/* irq1\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq29 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline\"><strong><em>main.c<\/em><\/strong><\/span><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>AWU_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> s = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>AWU_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(s = 0x00; s &lt; 0x04; s++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteLow(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteHigh(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 halt();\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSECmd(DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_LSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_LSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, ENABLE);\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_OD_HIZ_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>AWU_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_IdleModeEnable();\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_DeInit();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_LSICalibrationConfig(128000);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_Init(AWU_TIMEBASE_2S);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_Cmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enableInterrupts();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">To keep things simple, again the on-board LED of Discovery board is used.<\/p>\n<p style=\"text-align: justify\">The main clock settings are not that important as AWU usually uses LSI as clock source. However, the AWU peripheral clock must be enabled.<\/p>\n<pre><em><span style=\"color: #0000ff\">CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, ENABLE);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">AWU setup is simple as shown below:<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>AWU_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_IdleModeEnable();\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_DeInit();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_LSICalibrationConfig(128000);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_Init(AWU_TIMEBASE_2S);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AWU_Cmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enableInterrupts();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">First, we enable idle mode. Then the AWU peripheral is deinitialized. Optionally LSI can be calibrated but in most cases, this is not needed and can be avoided. Initializing the AWU requires only the wake-up time. This time value can be some of the prefixed time values only and it dictates the time for wake up after the CPU has gone sleeping.<\/p>\n<p>Lastly, we have to enable the AWU unit and its respective interrupt \u2013 IRQ 1.<\/p>\n<pre><em><span style=\"color: #0000ff\">{0x82, AWU_trigger_IRQHandler}, \/* irq1\u00a0 *\/<\/span><\/em><\/pre>\n<p>In the interrupt routine, we don\u2019t need to do anything except checking its flag\u2019s status.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>AWU_trigger_IRQHandler<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>AWU_GetFlagStatus<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">With these settings, we will see that the on-board LED will blink briefly and then remain turned off for about 2 seconds. Since the AWU is set for 2 seconds, the CPU wakes up after 2 seconds from halted state and the process repeats over and over again.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>for<\/strong>(s = 0x00; s &lt; 0x04; s++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteLow(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteHigh(GPIOD, GPIO_PIN_0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">halt();<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Demo<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14014\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-1-580x242.jpg\" alt=\"AWU (1)\" width=\"580\" height=\"242\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-1-580x242.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-1.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14015\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-2-580x243.jpg\" alt=\"AWU (2)\" width=\"580\" height=\"243\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-2-580x243.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/AWU-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\/xY2q8smQGUc?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>True Data EEPROM<\/h2>\n<p style=\"text-align: justify\">There are several cases where we need to save some very important data in a microcontroller and have them retrieved later. For instance, we would like keep preferences like contrast, colour, etc. of our TV set fixed once set and would like the TV to remember them whenever we turn it on. Usually a micro has three types of memory \u2013 RAM, EEPROM and flash memory. EEPROM and flash memory are non-volatile memories, meaning they retain the data stored in them even when powered off. RAM, on the other hand, is a volatile memory. All these memories have different roles. RAM is mainly intended for fast processing and temporary storage. EEPROMs are intended for storing a small set of important data that are often needed to be recalled. Finally, there is flash memory to hold the application code. Thus, it is logical to store settings and calibration data in either EEPROM or flash memory.<\/p>\n<p style=\"text-align: justify\">STM8s have true data EEPROMs and flash memories. Both share same registers and controls. Shown below is the memory map of STM8S003K3 microcontroller:<\/p>\n<p style=\"text-align: center\">\u00a0<a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Memory-Map.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14019\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Memory-Map.png\" alt=\"Memory Map\" width=\"511\" height=\"183\" \/><\/a><\/p>\n<p style=\"text-align: justify\">You can find this info in your device\u2019s datasheet. Check the address ranges. This is important because if you try to write or read wrong locations, your application code will crash as it is an illegal operation.<\/p>\n<p>&nbsp;<\/p>\n<h4>Hardware Connection<\/h4>\n<p style=\"text-align: center\">\u00a0<a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14018\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware-Schematic.png\" alt=\"Hardware Schematic\" width=\"391\" height=\"528\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h4>Code Example<\/h4>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>Button_Port<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIOB<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>Button_Pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_7<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Flash_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>()<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> value = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Flash_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_init();\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"STM8 EEPROM Test\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = FLASH_ReadByte(0x4000);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"WR: ---\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(9, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"RD:\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(13, 1, value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(2000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(GPIO_ReadInputPin(Button_Port, Button_Pin) == FALSE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(GPIO_ReadInputPin(Button_Port, Button_Pin) == FALSE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_Unlock(FLASH_MEMTYPE_DATA);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_EraseByte(0x4000);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_ProgramByte(0x4000, value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_Lock(FLASH_MEMTYPE_DATA);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(13, 1, value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(4, 1, value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value++;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSECmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_LSICmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOB);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(Button_Port, Button_Pin, GPIO_MODE_IN_FL_NO_IT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Flash_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_DeInit();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> chr = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(chr);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">In this demo, two-wire I2C LCD is used for displaying data. The code works by reading the last data stored in the EEPROM and incrementing a variable named <strong><em>value<\/em><\/strong>. Only one location (0x4000) is read and updated when the Discovery board\u2019s button is pressed.<\/p>\n<p style=\"text-align: justify\">Using the internal EEPROM is very easy. We need to deinitialize it first:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Flash_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_DeInit();<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Reading a location is as follows:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">value = FLASH_ReadByte(0x4000);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">We just have to set the location we wish to read.<\/p>\n<p style=\"text-align: justify\">To erase and to write, we need to unlock the memory type we wish to write using <strong><em>Memory Access Security System (MASS) <\/em><\/strong>key, write\/erase the desired location and the lock it back. This lock feature ensures safety from data corruption and accidental writes.<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">FLASH_Unlock(FLASH_MEMTYPE_DATA);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">FLASH_EraseByte(0x4000);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">delay_ms(20);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">FLASH_ProgramByte(0x4000, value);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">delay_ms(20);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">FLASH_Lock(FLASH_MEMTYPE_DATA);<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Demo<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14017\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM-580x496.jpg\" alt=\"EEPROM\" width=\"580\" height=\"496\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM-580x496.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/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\/9gsMS9MkyJs?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>Internal Flash Memory<\/h2>\n<p>&nbsp;<\/p>\n<p>Though flash memories are primarily intended for storing application codes, it is still possible to use them just like EEPROMs using <strong><em>In-Application Programming (IAP)<\/em><\/strong>. However, it is important to check that by mistake, we don\u2019t write in those areas where application code reside. IAP can also be used for upgrading application firmware <strong><em>Over-The-Air (OTA)<\/em><\/strong>.<\/p>\n<p>&nbsp;<\/p>\n<h4>Hardware Connection<\/h4>\n<p style=\"text-align: center\">\u00a0<a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware-Schematic.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14018\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware-Schematic.png\" alt=\"Hardware Schematic\" width=\"391\" height=\"528\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>Button_Port<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIOB<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>Button_Pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_7<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Flash_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>()<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> value = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Flash_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_init();\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"STM8S Flash Test\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = FLASH_ReadByte(0x9FF0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"WR: ---\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(9, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putstr(\"RD:\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(13, 1, value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(2000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(GPIO_ReadInputPin(Button_Port, Button_Pin) == FALSE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(GPIO_ReadInputPin(Button_Port, Button_Pin) == FALSE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_Unlock(FLASH_MEMTYPE_PROG);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_EraseByte(0x9FF0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_ProgramByte(0x9FF0, value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_Lock(FLASH_MEMTYPE_PROG);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(13, 1, value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_print<\/strong>(4, 1, value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value++;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSECmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_LSICmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(GPIOB);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_Init(Button_Port, Button_Pin, GPIO_MODE_IN_FL_NO_IT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Flash_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FLASH_DeInit();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> chr = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(chr);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">This example is same as the EEPROM example. The differences are the read, write and erase instructions.<\/p>\n<pre><em><span style=\"color: #0000ff\">value = FLASH_ReadByte(0x9FF0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u2026.<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">FLASH_Unlock(FLASH_MEMTYPE_PROG);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">FLASH_EraseByte(0x9FF0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">FLASH_ProgramByte(0x9FF0, value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">delay_ms(20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">FLASH_Lock(FLASH_MEMTYPE_PROG);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">The same MASS keying technique is needed and everything is same because both memories are controlled using the same set of registers. A few things must be noted while using data EEPROM and program flash:<\/p>\n<ul style=\"text-align: justify\">\n<li>The memory type needs to be specified &#8211; FLASH_MEMTYPE_PROG when using program\/flash memory and FLASH_MEMTYPE_DATA when using the internal true data EEPROM.<\/li>\n<\/ul>\n<ul style=\"text-align: justify\">\n<li>By definition a block is a set of bytes and a page is a set of blocks. Most modern memories do not allow byte-level write\/erase. However, both memory types of STM8s allow byte-level read, write and erase. By the way, it is wise to use page and block writes\/erases to enhance memory life cycle and for faster operations.<\/li>\n<\/ul>\n<ul style=\"text-align: justify\">\n<li>It is also possible to set configuration bytes using IAP.<\/li>\n<\/ul>\n<ul style=\"text-align: justify\">\n<li>Avoid frequent writes\/erases to increase memory life cycles. If needed to write\/erase data frequently use wear-leveling technique. Read operations do not wear memories.<\/li>\n<\/ul>\n<ul>\n<li style=\"text-align: justify\">Apply <strong><em>Read-Out-Protection (ROP) <\/em><\/strong>with <strong><em>ROP<\/em><\/strong> configuration bit if you want to protect your code from unfriendly eyes.<a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ROP.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14021\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ROP-580x310.png\" alt=\"ROP\" width=\"580\" height=\"310\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ROP-580x310.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ROP-1024x547.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/ROP.png 1366w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><br \/>\n<\/a><\/li>\n<li style=\"text-align: justify\">The read, write and erase location must not be outside specified boundary limits or else the application will surely crash or perform improperly. Check device datasheet for memory locations. A much easier and faster way is to use ST Visual Programmer.<a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14022\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM-580x310.png\" alt=\"EEPROM\" width=\"580\" height=\"310\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM-580x310.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM-1024x547.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/EEPROM.png 1362w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><br \/>\n<a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/flash1-e1515780203255.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14024\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/flash1-580x314.png\" alt=\"flash\" width=\"580\" height=\"314\" \/><br \/>\n<\/a><\/li>\n<\/ul>\n<ul>\n<li>Power source must not be fluctuating.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li>By definition a block is a set of bytes and a page is a set of blocks. Most modern memories do not allow byte-level write\/erase. However, both memory types of STM8s allow byte-level read, write and erase. By the way, it is wise to use page and block writes\/erases to enhance memory life cycle and for faster operations.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li>It is also possible to set configuration bytes using IAP.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h4 style=\"text-align: justify\">Demo<\/h4>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14025\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-1-580x544.jpg\" alt=\"Flash (1)\" width=\"580\" height=\"544\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-1-580x544.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-1.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14026\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-2-580x544.jpg\" alt=\"Flash (2)\" width=\"580\" height=\"544\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-2-580x544.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Flash-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\/N-AUuSuAQyA?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>UART Interrupt<\/h2>\n<p style=\"text-align: justify\">We have seen that we can use UART without interrupt methods. However, in most cases, UART interrupts are needed to make a serial communication real-time. In particular UART reception interrupt is of great importance. For example, when it is needed to interface a serial GPS receiver with a host micro, we will need UART reception interrupt because the GPS receiver will be continuously sending GPS data and it will be unwise to poll UART. If reception interrupt is used, the host micro will then be continually receiving GPS data in the background while doing other tasks in the main foreground.<\/p>\n<h4>Hardware Connection<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/uart.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14033\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/uart.png\" alt=\"uart\" width=\"386\" height=\"449\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.h (top part only)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#ifndef<\/strong> __STM8S_IT_H<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>__STM8S_IT_H<\/strong><\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">@far @interrupt <strong>void<\/strong> <strong>UART_RX_IRQHandler<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/* Includes ------------------------------------------------------------------*\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">....<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8s_it.c (top part only)<\/u><\/em><\/strong><\/p>\n<pre><span style=\"color: #0000ff\"><em><strong>#include<\/strong> \"stm8s.h\"<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>#include<\/strong> \"stm8s_it.h\"<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>char<\/strong> pos;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>char<\/strong> RX_value[16];<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em><strong>void<\/strong> <strong>UART_RX_IRQHandler<\/strong>(<strong>void<\/strong>)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RX_value[pos] = <strong>UART1_ReceiveData8<\/strong>();<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_ClearITPendingBit<\/strong>(UART1_IT_RXNE);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_ClearFlag<\/strong>(UART1_FLAG_RXNE);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_SendData8<\/strong>(RX_value[pos]);<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_ClearFlag<\/strong>(UART1_FLAG_TXE);<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pos++;<\/em><\/span><\/pre>\n<pre><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(pos &gt; 15)<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pos = 0;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>}<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>....<\/em><\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>stm8_interrupt_vector.c (shortened)<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s_it.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>typedef<\/strong> <strong>void<\/strong> @<strong>far<\/strong> (*interrupt_handler_t)(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> interrupt_instruction;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 interrupt_handler_t interrupt_handler;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/@far @interrupt void NonHandledInterrupt (void)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* in order to detect unexpected events during development,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0 it is recommended to set a breakpoint on the following instruction<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/\u00a0\u00a0\u00a0\u00a0 return;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\/\/}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>void<\/strong> <strong>_stext<\/strong>();\u00a0\u00a0\u00a0\u00a0 \/* startup routine *\/<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>struct<\/strong> <strong>interrupt_vector<\/strong> <strong>const<\/strong> _vectab[] = {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)<strong>_stext<\/strong>}, \/* reset *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* trap\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq0\u00a0 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, (interrupt_handler_t)UART_RX_IRQHandler}, \/* irq18 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ....<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {0x82, NonHandledInterrupt}, \/* irq29 *\/<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>main.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> pos;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> RX_value[16];<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>UART1_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_init<\/strong>();\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_clear_home<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(1, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"STM8S UART ISR\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(RX_value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(100);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSECmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_LSICmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSICmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_UART1, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(GPIOD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_OD_HIZ_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>GPIO_Init<\/strong>(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>UART1_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_Init<\/strong>(9600,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 UART1_WORDLENGTH_8D,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 UART1_STOPBITS_1,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 UART1_PARITY_NO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 UART1_SYNCMODE_CLOCK_DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 UART1_MODE_TXRX_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_ITConfig<\/strong>(UART1_IT_RXNE, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>enableInterrupts<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_Cmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_print<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> chr = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value \/ 1000) + 0x30);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 100) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 1), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 2), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 chr = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>((x_pos + 3), y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(chr);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">The UART setup is same as before. The exception is the interrupt part:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>UART1_ITConfig<\/strong>(UART1_IT_RXNE, ENABLE);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>enableInterrupts<\/strong>();<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">These lines enable UART reception interrupt and global interrupt.<\/p>\n<p style=\"text-align: justify\">Just as with other interrupts, UART reception interrupt is enabled in the STM8S interrupt vector map file.<\/p>\n<pre style=\"text-align: justify\"><span style=\"color: #0000ff\"><em>{0x82, (interrupt_handler_t)UART_RX_IRQHandler}, \/* irq18 *\/<\/em><\/span><\/pre>\n<p style=\"text-align: justify\">When a valid UART data is received by the UART RX pin, an UART reception interrupt is triggered. UART buffer is read. UART reception pending bit and reception flag are both cleared to pave way for further receptions. The data received is stored in an array for displaying it later and is immediately transmitted back through UART TX pin.<\/p>\n<p style=\"text-align: justify\">In the STM8 interrupt source file the following lines of code are added to do all these tasks:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>UART_RX_IRQHandler<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RX_value[pos] = <strong>UART1_ReceiveData8<\/strong>();<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_ClearITPendingBit<\/strong>(UART1_IT_RXNE);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_ClearFlag<\/strong>(UART1_FLAG_RXNE);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_SendData8<\/strong>(RX_value[pos]);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>UART1_ClearFlag<\/strong>(UART1_FLAG_TXE);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pos++;<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(pos &gt; 15)<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pos = 0;<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Demo<\/h4>\n<h4><\/h4>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/UART-ISR.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14032 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/UART-ISR-580x397.jpg\" alt=\"UART ISR\" width=\"580\" height=\"397\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/UART-ISR-580x397.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/UART-ISR.jpg 863w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><br \/>\n<iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/4fE5-aza_48?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2 style=\"text-align: justify\">Software SPI \u2013 MAX6675<\/h2>\n<p style=\"text-align: justify\">Software SPI is basically bit-banging ordinary GPIOs to emulate SPI signals. Software SPI is rarely needed unless hardware SPI peripheral is unavailable or hardware SPI pins are used up for some other tasks. Though it is slow and require extra coding and therefore extra overhead compared to hardware SPI, it is sometimes very helpful in debugging SPI-based hardware as it offers full control over all SPI signals.<\/p>\n<p style=\"text-align: justify\">To demo software SPI here, I have used MAX6675 Cold-Junction-Compensated K-Thermocouple-to-Digital Converter. It is interfaced with a typical K-type thermocouple and sends out the temperature sensed by the thermocouple.<\/p>\n<h4 style=\"text-align: justify\">Hardware Connection<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/sw_spi.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14038\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/sw_spi.png\" alt=\"sw_spi\" width=\"492\" height=\"519\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<h4><\/h4>\n<p><strong><em><u>MAX6675.h<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SW_SPI_Port<\/strong> \u00a0\u00a0\u00a0 GPIOC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CS_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_1<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SCK_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_2<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SO_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_3<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CS_OUT_HIGH<\/strong>()\u00a0\u00a0 GPIO_WriteHigh(SW_SPI_Port, CS_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CS_OUT_LOW<\/strong>()\u00a0\u00a0\u00a0 GPIO_WriteLow(SW_SPI_Port, CS_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SCK_OUT_HIGH<\/strong>()\u00a0 GPIO_WriteHigh(SW_SPI_Port, SCK_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SCK_OUT_LOW<\/strong>()\u00a0\u00a0 GPIO_WriteLow(SW_SPI_Port, SCK_pin)<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SO_IN<\/strong>()\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 GPIO_ReadInputPin(SW_SPI_Port, SO_pin)<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>T_min<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>T_max<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1024<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>count_max<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4096<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>no_of_pulses<\/strong>\u00a0\u00a0\u00a0 16<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>deg_C<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>deg_F<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>tmp_K<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a02<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>open_contact<\/strong>\u00a0\u00a0\u00a0 0x04<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>close_contact<\/strong>\u00a0\u00a0 0x00<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>scalar_deg_C<\/strong>\u00a0\u00a0\u00a0 0.25<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>scalar_deg_F_1<\/strong> \u00a01.8<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>scalar_deg_F_2<\/strong>\u00a0 32.0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>scalar_tmp_K<\/strong>\u00a0\u00a0\u00a0 273.0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>no_of_samples<\/strong>\u00a0\u00a0 16<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>MAX6675_init<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> <strong>MAX6657_get_ADC<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> *ADC_data);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>float<\/strong> <strong>MAX6675_get_T<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> ADC_value, <strong>unsigned<\/strong> <strong>char<\/strong> T_unit);<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong><em><u>MAX6675.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"MAX6675.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>MAX6675_init<\/strong>()<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>GPIO_DeInit<\/strong>(SW_SPI_Port);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>GPIO_Init<\/strong>(SW_SPI_Port,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ((GPIO_Pin_TypeDef)(SCK_pin | CS_pin)),<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_MODE_OUT_PP_HIGH_FAST);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>GPIO_Init<\/strong>(SW_SPI_Port, SO_pin, GPIO_MODE_IN_FL_NO_IT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>CS_OUT_HIGH<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>SCK_OUT_HIGH<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> <strong>MAX6657_get_ADC<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> *ADC_data)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> samples = no_of_samples;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> clk_pulses = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>unsigned<\/strong> <strong>int<\/strong> temp_data = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>unsigned<\/strong> <strong>long<\/strong> avg_value = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>while<\/strong>(samples &gt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clk_pulses = no_of_pulses;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CS_OUT_LOW<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(clk_pulses &gt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data &lt;&lt;= 1;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(<strong>SO_IN<\/strong>())<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data |= 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>SCK_OUT_HIGH<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>SCK_OUT_LOW<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clk_pulses--;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CS_OUT_HIGH<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data &amp;= 0x7FFF;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 avg_value += temp_data;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 samples--;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>delay_ms<\/strong>(10);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 temp_data = (avg_value &gt;&gt; 4);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>if<\/strong>((temp_data &amp; 0x04) == close_contact)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 *ADC_data = (temp_data &gt;&gt; 3);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>return<\/strong> close_contact;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 *ADC_data = (count_max + 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>return<\/strong> open_contact;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>float<\/strong> <strong>MAX6675_get_T<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> ADC_value, <strong>unsigned<\/strong> <strong>char<\/strong> T_unit)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>float<\/strong> tmp = 0.0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 tmp = (((<strong>float<\/strong>)ADC_value) * scalar_deg_C);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>switch<\/strong>(T_unit)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> deg_F:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp *= scalar_deg_F_1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp += scalar_deg_F_2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> tmp_K:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp += scalar_tmp_K;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>default<\/strong>:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>return<\/strong> tmp;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong><em><u>main.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"MAX6675.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> bl_state;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>const<\/strong> <strong>unsigned<\/strong> <strong>char<\/strong> symbol[0x08] =<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 0x00, 0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_symbol<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_C<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_I<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>long<\/strong> value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_D<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>int<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_F<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>float<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> state = close_contact;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>int<\/strong> ti = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>float<\/strong> tf = 0.0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>MAX6675_init<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_init<\/strong>();\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_clear_home<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>lcd_symbol<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(0, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(\"STM8 SW-SPI Test\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(TRUE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 state = <strong>MAX6657_get_ADC<\/strong>(&amp;ti);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>switch<\/strong>(state)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>case<\/strong> open_contact:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_goto<\/strong>(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_putstr<\/strong>(\"\u00a0\u00a0\u00a0\u00a0 Error!\u00a0\u00a0\u00a0\u00a0 \");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>delay_ms<\/strong>(200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_goto<\/strong>(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_putstr<\/strong>(\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>case<\/strong> close_contact:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 tf = <strong>MAX6675_get_T<\/strong>(ti, deg_C);\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_goto<\/strong>(0, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_putstr<\/strong>(\"T\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_goto<\/strong>(2, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_send<\/strong>(0, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_goto<\/strong>(3, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>LCD_putstr<\/strong>(\"C:\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>print_F<\/strong>(9, 1, tf, 2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>delay_ms<\/strong>(100);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_DeInit<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSECmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_LSICmd<\/strong>(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSICmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(<strong>CLK_GetFlagStatus<\/strong>(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchCmd<\/strong>(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_HSIPrescalerConfig<\/strong>(CLK_PRESCALER_HSIDIV8);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_SYSCLKConfig<\/strong>(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_ClockSwitchConfig<\/strong>(CLK_SWITCHMODE_AUTO,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 DISABLE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_I2C, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>CLK_PeripheralClockConfig<\/strong>(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>lcd_symbol<\/strong>(<strong>void<\/strong>)\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> s = 0;\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>LCD_send<\/strong>(0x40, CMD);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>for<\/strong>(s = 0; s &lt; 8; s++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_send<\/strong>(symbol[s], DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>LCD_send<\/strong>(0x80, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_C<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> ch[5] = {0x20, 0x20, 0x20, 0x20, '\\0'};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &lt; 0x00)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x2D;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 0) &amp;&amp; (value &lt;= 9))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_I<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>long<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> ch[7] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, '\\0'};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x2D;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &gt; 9999)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value \/ 10000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 10000)\/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 999) &amp;&amp; (value &lt;= 9999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 10000)\/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_D<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>signed<\/strong> <strong>int<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>char<\/strong> ch[5] = {0x2E, 0x20, 0x20, '\\0'};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ch[1] = ((value \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(points &gt; 1)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(points &gt; 1)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>LCD_putstr<\/strong>(ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_F<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos, <strong>float<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>long<\/strong> tmp = 0x0000;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 tmp = value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>print_I<\/strong>(x_pos, y_pos, tmp);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 tmp = ((value - tmp) * 1000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(tmp &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp = -tmp;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x2D);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_goto<\/strong>(x_pos, y_pos);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>LCD_putchar<\/strong>(0x20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>((value &gt;= 10000) &amp;&amp; (value &lt; 100000))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + 6), y_pos, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 1000) &amp;&amp; (value &lt; 10000))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + 5), y_pos, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 100) &amp;&amp; (value &lt; 1000))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + 4), y_pos, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 10) &amp;&amp; (value &lt; 100))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + 3), y_pos, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>(value &lt; 10)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + 2), y_pos, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h2>Explanation<\/h2>\n<p style=\"text-align: justify\">A decent implementation of software SPI first requires I\/Os and their purposes to be defined at first:<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SW_SPI_Port<\/strong> \u00a0\u00a0\u00a0 GPIOC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CS_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_1<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SCK_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_2<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SO_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_3<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CS_OUT_HIGH<\/strong>()\u00a0\u00a0 GPIO_WriteHigh(SW_SPI_Port, CS_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CS_OUT_LOW<\/strong>()\u00a0\u00a0\u00a0 GPIO_WriteLow(SW_SPI_Port, CS_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SCK_OUT_HIGH<\/strong>()\u00a0 GPIO_WriteHigh(SW_SPI_Port, SCK_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SCK_OUT_LOW<\/strong>()\u00a0\u00a0 GPIO_WriteLow(SW_SPI_Port, SCK_pin)<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SO_IN<\/strong>()\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 GPIO_ReadInputPin(SW_SPI_Port, SO_pin)<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Trust me defining stuffs this way saves both time and helps in debugging.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW_SPI_Timing.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14039\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW_SPI_Timing-580x159.png\" alt=\"SW_SPI_Timing\" width=\"580\" height=\"159\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW_SPI_Timing-580x159.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW_SPI_Timing.png 973w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">We must code signal patterns as per timing diagram in the device\u2019s datasheet (shown above). The datasheet of MAX6675 states that sensed data should be read on falling edges of the serial clock with chip select pin held low. This is what we have to code:<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>CS_OUT_LOW<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>while<\/strong>(clk_pulses &gt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 temp_data &lt;&lt;= 1;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(<strong>SO_IN<\/strong>())<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp_data |= 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>SCK_OUT_HIGH<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>SCK_OUT_LOW<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 clk_pulses--;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">};\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>CS_OUT_HIGH<\/strong>();<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Note that <strong><em>Chip Select (CS)<\/em><\/strong> is held low to begin communication. <strong><em>Serial Clock (SCK) <\/em><\/strong>is held high first and the set low to emulate a falling edge of the serial clock. In total sixteen such transitions are needed to extract all data from MAX6675 via serial input pin.<\/p>\n<p style=\"text-align: justify\">The rest of the code is data processing and conversion, and then finally data display. I\u2019m sure you\u2019ll understand.<\/p>\n<h4 style=\"margin-top: 0cm\"><span lang=\"EN-US\">Demo<\/span><\/h4>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14037\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-2-580x477.jpg\" alt=\"SW-SPI (2)\" width=\"580\" height=\"477\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-2-580x477.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-2.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14036\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-1-580x489.jpg\" alt=\"SW-SPI (1)\" width=\"580\" height=\"489\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-1-580x489.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SW-SPI-1.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\/yD-1a70MfV8?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2>Driving LCD with Hardware SPI and by Bit-Banging Method<\/h2>\n<p style=\"text-align: justify\">Bit-banging and SPI-based communications are very popular in the embedded system world. These methods are not limited to communication with sensors, drives, etc. They can be used for driving an alphanumeric LCD with a few pins. Usually with shift registers like 74HC595 and CD4094B, we can make such display interfaces very simply. It is also possible to do so with SPI port expanders like MCP23S17 but those will be expensive solutions. All that we will need is to create a way to translate LCD I\/O operations to SPI signals.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI_LCD.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14041\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI_LCD.png\" alt=\"SPI_LCD\" width=\"447\" height=\"218\" \/><\/a><\/p>\n<p style=\"text-align: justify\">The main advantages of using SPI-based\/bit-banging-based LCDs include immunity from noise and EMI, simplicity, reduction of GPIO usage and addressability. However, the downsides are slower refresh rates and requirement of additional coding and memory spaces. Even with these pluses and minuses, driving a LCD with such arrangements is often a requirement, especially when it comes to low pin count micros and fast debugging.<\/p>\n<h4 style=\"margin-top: 0cm\"><span lang=\"EN-US\">Hardware Connection<\/span><\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/3-Wire-LCD.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14042\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/3-Wire-LCD.png\" alt=\"3 Wire LCD\" width=\"385\" height=\"390\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/3-Wire-LCD.png 385w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/3-Wire-LCD-90x90.png 90w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/a><\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/4094-Module.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14043\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/4094-Module.png\" alt=\"4094 Module\" width=\"518\" height=\"454\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<p>&nbsp;<\/p>\n<p><strong><em><u>lcd.h<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"stm8s.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_PORT<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIOD<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_STB_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_2\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_SCK_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_3<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_SDI_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_4\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_STB_HIGH<\/strong>()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteHigh(LCD_PORT, LCD_STB_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_STB_LOW<\/strong>() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteLow(LCD_PORT, LCD_STB_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_SCK_HIGH<\/strong>()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteHigh(LCD_PORT, LCD_SCK_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_SCK_LOW<\/strong>() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteLow(LCD_PORT, LCD_SCK_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_SDI_HIGH<\/strong>()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteHigh(LCD_PORT, LCD_SDI_pin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>LCD_SDI_LOW<\/strong>() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteLow(LCD_PORT, LCD_SDI_pin)<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>clear_display<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x01<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>goto_home<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x02<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>cursor_direction_inc<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x02)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>cursor_direction_dec<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x00)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>display_shift<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x01)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>display_no_shift<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x04 | 0x00)<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>display_on<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x04)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>display_off<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>cursor_on<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x02)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>cursor_off<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>blink_on<\/strong>\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>blink_off<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x08 | 0x00)<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>_8_pin_interface<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x10)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>_4_pin_interface<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>_2_row_display<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x08)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>_1_row_display<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>_5x10_dots<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x40)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>_5x7_dots<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (0x20 | 0x00)<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>dly<\/strong>\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>DAT<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CMD<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>SIPO<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_init<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_toggle_EN<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_send<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> mode);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_4bit_send<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> lcd_data);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_putstr<\/strong>(<strong>char<\/strong> *lcd_string);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_putchar<\/strong>(<strong>char<\/strong> char_data);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_clear_home<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_goto<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos, <strong>unsigned<\/strong> <strong>char<\/strong> y_pos);<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>lcd.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>SIPO<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> bit = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> clk = 0x08;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> temp = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 temp = data_value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_STB_LOW();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(clk &gt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit = ((temp &amp; 0x80) &gt;&gt; 0x07);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit &amp;= 0x01;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>switch<\/strong>(bit)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> 0:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SDI_LOW();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>default<\/strong>:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SDI_HIGH();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_HIGH();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp &lt;&lt;= 0x01;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clk--;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_LOW();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_STB_HIGH();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_init<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> t = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_Init(LCD_PORT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0((GPIO_Pin_TypeDef)(LCD_STB_pin | LCD_SCK_pin | LCD_SDI_pin)),<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0GPIO_MODE_OUT_PP_HIGH_FAST);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 data_value = 0x08;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>SIPO<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(10);\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send(0x33, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send(0x32, CMD);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send((_4_pin_interface | _2_row_display | _5x7_dots), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send((display_on | cursor_off | blink_off), CMD);\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send((clear_display), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send((cursor_direction_inc | display_no_shift), CMD);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_toggle_EN<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 data_value |= 0x08;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>SIPO<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(dly);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 data_value &amp;= 0xF7;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>SIPO<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(dly);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_send<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> mode)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>switch<\/strong>(mode)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> DAT:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 data_value |= 0x04;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 \u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0<strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>default<\/strong>:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 data_value &amp;= 0xFB;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>SIPO<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_4bit_send(value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_4bit_send<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> lcd_data)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> temp = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 temp = (lcd_data &amp; 0xF0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 data_value &amp;= 0x0F;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 data_value |= temp;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>SIPO<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>LCD_toggle_EN<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 temp = (lcd_data &amp; 0x0F);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 temp &lt;&lt;= 0x04;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 data_value &amp;= 0x0F;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 data_value |= temp;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>SIPO<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>LCD_toggle_EN<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}\u00a0<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_putstr<\/strong>(<strong>char<\/strong> *lcd_string)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(*lcd_string != '\\0')\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(*lcd_string++);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_putchar<\/strong>(<strong>char<\/strong> char_data)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>((char_data &gt;= 0x20) &amp;&amp; (char_data &lt;= 0x7F))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_send(char_data, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_clear_home<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send(clear_display, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_send(goto_home, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_goto<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> x_pos,<strong>unsigned<\/strong> <strong>char<\/strong> y_pos)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(y_pos == 0)\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_send((0x80 | x_pos), CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_send((0x80 | 0x40 | x_pos), CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>main.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"lcd.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>char<\/strong> data_value;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>show_value<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> value);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>const<\/strong> <strong>char<\/strong> txt1[] = {\"MICROARENA\"};<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>const<\/strong> <strong>char<\/strong> txt2[] = {\"SShahryiar\"};<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>const<\/strong> <strong>char<\/strong> txt3[] = {\"STM8S003K3\"};<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>const<\/strong> <strong>char<\/strong> txt4[] = {\"Discovery!\"};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> s = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>clock_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>GPIO_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_init();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_goto(3, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_putstr(txt1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_goto(3, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_putstr(txt2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(2600);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>for<\/strong>(s = 0; s &lt; 10; s++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto((3 + s), 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(txt3[s]);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>for<\/strong>(s = 0; s &lt; 10; s++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_goto((3 + s), 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_putchar(txt4[s]);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(2600);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 s = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_clear_home();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_goto(3, 0);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_putstr(txt1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(1)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>show_value<\/strong>(s);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 s++;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(200);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>clock_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_DeInit();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_HSECmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_LSICmd(DISABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>GPIO_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_DeInit(LCD_PORT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>show_value<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>char<\/strong> ch = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 ch = ((value \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 LCD_goto(6, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 ch = (((value \/ 10) % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 LCD_goto(7, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 ch = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 LCD_goto(8, 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 LCD_putchar(ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">The code demoed here is same as the other LCD codes in this article so there is not much to explain. The I\/O 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 STM8 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\">CD4094B can be operated by either bit-banging GPIOs, i.e. using software SPI or using hardware SPI. If we are to use software-based SPI then we need to code the entire SPI operation as shown below:<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>SIPO<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> bit = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> clk = 0x08;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> temp = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 temp = data_value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_STB_LOW();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(clk &gt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit = ((temp &amp; 0x80) &gt;&gt; 0x07);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit &amp;= 0x01;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>switch<\/strong>(bit)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> 0:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SDI_LOW();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>default<\/strong>:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SDI_HIGH();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_HIGH();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp &lt;&lt;= 0x01;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 clk--;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LCD_SCK_LOW();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 LCD_STB_HIGH();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">This function does the work of SPI clock generation, chip selection and data bit shifting.<\/p>\n<p style=\"text-align: justify\">If hardware SPI is used, we have to initialize SPI hardware, use hardware SPI pins and use SPI write technique to send data to shift register. The process of clock generation and data shifting is done inside the SPI hardware and so we have nothing else to do.<\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>SPI_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_Init(SPI_FIRSTBIT_MSB,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 SPI_BAUDRATEPRESCALER_64,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 SPI_MODE_MASTER,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 SPI_CLOCKPOLARITY_LOW,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 SPI_CLOCKPHASE_1EDGE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 SPI_DATADIRECTION_1LINE_TX,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 SPI_NSS_SOFT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 0x00);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_Cmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>LCD_write<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(SPI_GetFlagStatus(SPI_FLAG_BSY));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_WriteHigh(GPIOC, GPIO_PIN_4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 SPI_SendData(data_value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_WriteLow(GPIOC, GPIO_PIN_4);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(!SPI_GetFlagStatus(SPI_FLAG_TXE));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Just as with any hardware peripheral, we have to enable SPI peripheral clock before we use it.<\/p>\n<pre><em><span style=\"color: #0000ff\">CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">The rest of the code is just about translating and transferring GPIO patterns to the shift register. Remember everything is same the only this is the fact that the shift register here works as a GPIO expander. The code here works as per hardware connections shown. In the market, there is no ready-made SPI LCD module like the one I used here. It is my own designed. If different shift register or different hardware layout is used then you must modify the code accordingly.<\/p>\n<p>&nbsp;<\/p>\n<h4>Demo<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14044\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-2-580x418.jpg\" alt=\"SPI LCD (2)\" width=\"580\" height=\"418\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-2-580x418.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-2.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14045\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-1-580x435.jpg\" alt=\"SPI LCD (1)\" width=\"580\" height=\"435\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-1-580x435.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/SPI-LCD-1.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\/WZpp8x1kf5k?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<h2 style=\"text-align: justify\">TFT Display \u2013 ST7735<\/h2>\n<p style=\"text-align: justify\">Alphanumeric LCD are well-suited for most applications that require no graphical objects to be projected on a display screen. However, to make interfaces interactive and user-friendly, designers sometimes like things to be projected graphically. For example, consider an oscilloscope. In such cases, we need to use a graphical LCD (GLCD) or TFT display. Compared to GLCDs, TFTs are much more interactive, smarter and cheaper. Most GLCDs are monochrome and fat while TFTs are just the opposites. Because of these reasons, TFTs are more popular than GLCDs.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14048\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT.jpg\" alt=\"TFT\" width=\"412\" height=\"270\" \/><\/a><\/p>\n<p style=\"text-align: justify\">At present TFT displays are very common in the embedded-system market. There are many models of TFT displays, varying in screen size, resolution and other properties. ILI9325, IL9341, SSD1289, SSD1963, etc. are a few examples of common TFT display chips. However, most these TFT drivers need about sixteen plus GPIOs to function as they use 8080 display interface to communicate with host devices. ST7735-based TFT display stands differently in this regard. It needs SPI instead of 8080 display interface and it is good enough for most application. Adding a resistive touch screen on top of the display and SD card support will make it smarter.<\/p>\n<h4>Hardware Connection<\/h4>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14049\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-580x501.png\" alt=\"TFT\" width=\"580\" height=\"501\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-580x501.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT.png 661w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h4>Code Example<\/h4>\n<h4><\/h4>\n<p><strong><em><u>font.h<\/u><\/em><\/strong><\/p>\n<pre><span style=\"color: #0000ff\"><em><strong>static<\/strong> <strong>const<\/strong> <strong>unsigned<\/strong> <strong>char<\/strong> font[][5] =<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>{<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0\u00a0 {0x00, 0x00, 0x00, 0x00, 0x00} \/\/ 20<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x00, 0x5f, 0x00, 0x00} \/\/ 21 !<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x07, 0x00, 0x07, 0x00} \/\/ 22 \"<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x14, 0x7f, 0x14, 0x7f, 0x14} \/\/ 23 #<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} \/\/ 24 $<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x23, 0x13, 0x08, 0x64, 0x62} \/\/ 25 %<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x36, 0x49, 0x55, 0x22, 0x50} \/\/ 26 &amp;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x05, 0x03, 0x00, 0x00} \/\/ 27 '<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x1c, 0x22, 0x41, 0x00} \/\/ 28 (<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x41, 0x22, 0x1c, 0x00} \/\/ 29 )<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x14, 0x08, 0x3e, 0x08, 0x14} \/\/ 2a *<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x08, 0x08, 0x3e, 0x08, 0x08} \/\/ 2b +<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x50, 0x30, 0x00, 0x00} \/\/ 2c ,<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x08, 0x08, 0x08, 0x08, 0x08} \/\/ 2d -<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x60, 0x60, 0x00, 0x00} \/\/ 2e .<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x20, 0x10, 0x08, 0x04, 0x02} \/\/ 2f \/<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3e, 0x51, 0x49, 0x45, 0x3e} \/\/ 30 0<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x42, 0x7f, 0x40, 0x00} \/\/ 31 1<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x42, 0x61, 0x51, 0x49, 0x46} \/\/ 32 2<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x21, 0x41, 0x45, 0x4b, 0x31} \/\/ 33 3<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x18, 0x14, 0x12, 0x7f, 0x10} \/\/ 34 4<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x27, 0x45, 0x45, 0x45, 0x39} \/\/ 35 5<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3c, 0x4a, 0x49, 0x49, 0x30} \/\/ 36 6<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x01, 0x71, 0x09, 0x05, 0x03} \/\/ 37 7<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x36, 0x49, 0x49, 0x49, 0x36} \/\/ 38 8<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x06, 0x49, 0x49, 0x29, 0x1e} \/\/ 39 9<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x36, 0x36, 0x00, 0x00} \/\/ 3a :<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x56, 0x36, 0x00, 0x00} \/\/ 3b ;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x08, 0x14, 0x22, 0x41, 0x00} \/\/ 3c &lt;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x14, 0x14, 0x14, 0x14, 0x14} \/\/ 3d =<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x41, 0x22, 0x14, 0x08} \/\/ 3e &gt;<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x02, 0x01, 0x51, 0x09, 0x06} \/\/ 3f ?<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x32, 0x49, 0x79, 0x41, 0x3e} \/\/ 40 @<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7e, 0x11, 0x11, 0x11, 0x7e} \/\/ 41 A<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x49, 0x49, 0x49, 0x36} \/\/ 42 B<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3e, 0x41, 0x41, 0x41, 0x22} \/\/ 43 C<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x41, 0x41, 0x22, 0x1c} \/\/ 44 D<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x49, 0x49, 0x49, 0x41} \/\/ 45 E<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x09, 0x09, 0x09, 0x01} \/\/ 46 F<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3e, 0x41, 0x49, 0x49, 0x7a} \/\/ 47 G<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x08, 0x08, 0x08, 0x7f} \/\/ 48 H<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x41, 0x7f, 0x41, 0x00} \/\/ 49 I<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x20, 0x40, 0x41, 0x3f, 0x01} \/\/ 4a J<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x08, 0x14, 0x22, 0x41} \/\/ 4b K<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x40, 0x40, 0x40, 0x40} \/\/ 4c L<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} \/\/ 4d M<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x04, 0x08, 0x10, 0x7f} \/\/ 4e N<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3e, 0x41, 0x41, 0x41, 0x3e} \/\/ 4f O<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x09, 0x09, 0x09, 0x06} \/\/ 50 P<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3e, 0x41, 0x51, 0x21, 0x5e} \/\/ 51 Q<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x09, 0x19, 0x29, 0x46} \/\/ 52 R<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x46, 0x49, 0x49, 0x49, 0x31} \/\/ 53 S<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x01, 0x01, 0x7f, 0x01, 0x01} \/\/ 54 T<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3f, 0x40, 0x40, 0x40, 0x3f} \/\/ 55 U<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x1f, 0x20, 0x40, 0x20, 0x1f} \/\/ 56 V<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3f, 0x40, 0x38, 0x40, 0x3f} \/\/ 57 W<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x63, 0x14, 0x08, 0x14, 0x63} \/\/ 58 X<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x07, 0x08, 0x70, 0x08, 0x07} \/\/ 59 Y<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x61, 0x51, 0x49, 0x45, 0x43} \/\/ 5a Z<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x7f, 0x41, 0x41, 0x00} \/\/ 5b [<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x02, 0x04, 0x08, 0x10, 0x20} \/\/ 5c ?<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x41, 0x41, 0x7f, 0x00} \/\/ 5d ]<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x04, 0x02, 0x01, 0x02, 0x04} \/\/ 5e ^<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x40, 0x40, 0x40, 0x40, 0x40} \/\/ 5f _<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x01, 0x02, 0x04, 0x00} \/\/ 60 `<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x20, 0x54, 0x54, 0x54, 0x78} \/\/ 61 a<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x48, 0x44, 0x44, 0x38} \/\/ 62 b<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x38, 0x44, 0x44, 0x44, 0x20} \/\/ 63 c<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x38, 0x44, 0x44, 0x48, 0x7f} \/\/ 64 d<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x38, 0x54, 0x54, 0x54, 0x18} \/\/ 65 e<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x08, 0x7e, 0x09, 0x01, 0x02} \/\/ 66 f<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x0c, 0x52, 0x52, 0x52, 0x3e} \/\/ 67 g<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x08, 0x04, 0x04, 0x78} \/\/ 68 h<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x44, 0x7d, 0x40, 0x00} \/\/ 69 i<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x20, 0x40, 0x44, 0x3d, 0x00} \/\/ 6a j<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7f, 0x10, 0x28, 0x44, 0x00} \/\/ 6b k<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x41, 0x7f, 0x40, 0x00} \/\/ 6c l<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7c, 0x04, 0x18, 0x04, 0x78} \/\/ 6d m<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7c, 0x08, 0x04, 0x04, 0x78} \/\/ 6e n<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x38, 0x44, 0x44, 0x44, 0x38} \/\/ 6f o<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7c, 0x14, 0x14, 0x14, 0x08} \/\/ 70 p<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x08, 0x14, 0x14, 0x18, 0x7c} \/\/ 71 q<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x7c, 0x08, 0x04, 0x04, 0x08} \/\/ 72 r<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x48, 0x54, 0x54, 0x54, 0x20} \/\/ 73 s<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x04, 0x3f, 0x44, 0x40, 0x20} \/\/ 74 t<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3c, 0x40, 0x40, 0x20, 0x7c} \/\/ 75 u<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x1c, 0x20, 0x40, 0x20, 0x1c} \/\/ 76 v<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x3c, 0x40, 0x30, 0x40, 0x3c} \/\/ 77 w<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x44, 0x28, 0x10, 0x28, 0x44} \/\/ 78 x<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x0c, 0x50, 0x50, 0x50, 0x3c} \/\/ 79 y<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x44, 0x64, 0x54, 0x4c, 0x44} \/\/ 7a z<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x08, 0x36, 0x41, 0x00} \/\/ 7b {<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x00, 0x7f, 0x00, 0x00} \/\/ 7c |<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x00, 0x41, 0x36, 0x08, 0x00} \/\/ 7d }<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x10, 0x08, 0x08, 0x10, 0x08} \/\/ 7e ?<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>\u00a0\u00a0\u00a0 ,{0x78, 0x46, 0x41, 0x46, 0x78} \/\/ 7f ?<\/em><\/span><\/pre>\n<pre><span style=\"color: #0000ff\"><em>};<\/em><\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>ST7735.h<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"font.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SPI_PORT<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 GPIOC<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CTL_PORT<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0 GPIOD<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CS_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_7<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>RS_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_5<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>RST_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_6<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SCK_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_5<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SDA_pin<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_PIN_6<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_NOP<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_SWRESET<\/strong>\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDDID<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x04<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDDST<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x09<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDDPM<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0A<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDD_MADCTL<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0B<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>STT7735_RDD_COLMOD<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0C<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDDIM<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0D<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDDSM<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0E<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_SLPIN<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x10<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_SLPOUT<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x11<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PTLON<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x12<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_NORON<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x13<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_INVOFF<\/strong>\u00a0\u00a0\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<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_INVON<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x21<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_GAMSET<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x26<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_DISPOFF<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x28<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_DISPON<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x29<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_CASET<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x2A<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RASET<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x2B<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RAMWR<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x2C<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RAMRD<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x2E<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PTLAR<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x30<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_TEOFF<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x34<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_TEON<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x35<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_MADCTL<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x36<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_IDMOFF<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x38<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_IDMON<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x39<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_COLMOD<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x3A<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID1<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDA<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID2<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDB<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID3<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDC<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID4<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDD<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_FRMCTR1<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xB1<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_FRMCTR2<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a00xB2<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_FRMCTR3<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xB3<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_INVCTR<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xB4<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_DISSET5<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xB6<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PWCTR1<\/strong>\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PWCTR2<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00xC1<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PWCTR3<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xC2<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PWCTR4<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xC3<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PWCTR5<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xC4<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_VMCTR1<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xC5<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID1<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDA<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID2<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDB<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID3<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDC<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_RDID4<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xDD<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_PWCTR6<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xFC<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_GMCTRP1<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xE0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_GMCTRN1<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xE1<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>BLACK<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0000<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>BLUE<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x001F<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>RED<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xF800<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>GREEN<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x07E0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>CYAN<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x07FF<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>MAGENTA<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xF81F<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>YELLOW<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xFFE0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>WHITE<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0xFFFF<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>MADCTL_MY<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x80<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>MADCTL_MX<\/strong>\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>MADCTL_MV<\/strong>\u00a0\u00a0\u00a0\u00a0\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<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>MADCTL_ML<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x10<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>MADCTL_RGB<\/strong>\u00a0\u00a0\u00a0\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<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong>\u00a0\u00a0 <strong>MADCTL_MH<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x04<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_TFTWIDTH<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 128<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ST7735_TFTLENGTH<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 160<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>CMD<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>DAT<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x1<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>SQUARE<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>ROUND<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>NO<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#define<\/strong> <strong>YES<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> width;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> length;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>int<\/strong> <strong>Swap_Colour<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>int<\/strong> <strong>Color565<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> r, <strong>unsigned<\/strong> <strong>char<\/strong> g, <strong>unsigned<\/strong> <strong>char<\/strong> b);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>SPI_setup<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_HW_init<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Write<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> mode);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Reset<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_init<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Word_Write<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Set_Addr_Window<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> xs, <strong>signed<\/strong> <strong>int<\/strong> ys, <strong>signed<\/strong> <strong>int<\/strong> xe, <strong>signed<\/strong> <strong>int<\/strong> ye);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_RAM_Address_Set<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Invert_Display<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> i);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Set_Rotation<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> m);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TFT_fill<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Pixel<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Rectangle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>char<\/strong> type, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Circle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> xc, <strong>signed<\/strong> <strong>int<\/strong> yc, <strong>signed<\/strong> <strong>int<\/strong> radius, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_V_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_H_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>unsigned<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Triangle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>signed<\/strong> <strong>int<\/strong> x3, <strong>signed<\/strong> <strong>int<\/strong> y3, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Font_Pixel<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>char<\/strong> pixel_size);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_char<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong>\u00a0 y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>char<\/strong> ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_str<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>char<\/strong> *ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_C<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>signed<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_I<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>signed<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_D<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>unsigned<\/strong> <strong>int<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_F<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>float<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points);<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>ST7735.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"ST7735.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> width;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>extern<\/strong> <strong>unsigned<\/strong> <strong>int<\/strong> length;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>int<\/strong> <strong>Swap_Colour<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>return<\/strong> ((colour &lt;&lt; 0x000B) | (colour &amp; 0x07E0) | (colour &gt;&gt; 0x000B));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>int<\/strong> <strong>Color565<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> r, <strong>unsigned<\/strong> <strong>char<\/strong> g, <strong>unsigned<\/strong> <strong>char<\/strong> b)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>return<\/strong> (((r &amp; 0xF8) &lt;&lt; 0x08) | ((g &amp; 0xFC) &lt;&lt; 0x03) | (b &gt;&gt; 0x03));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>SPI_setup<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 SPI_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 SPI_Init(SPI_FIRSTBIT_MSB,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_BAUDRATEPRESCALER_2,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_MODE_MASTER,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_CLOCKPOLARITY_HIGH,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_CLOCKPHASE_1EDGE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_DATADIRECTION_1LINE_TX,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SPI_NSS_SOFT,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 SPI_Cmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_HW_init<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_Init(SPI_PORT, ((GPIO_Pin_TypeDef)(SCK_pin | SDA_pin)),\u00a0\u00a0\u00a0\u00a0 GPIO_MODE_OUT_PP_HIGH_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_Init(CTL_PORT, ((GPIO_Pin_TypeDef)(CS_pin | RS_pin | RST_pin)), GPIO_MODE_OUT_PP_HIGH_FAST);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>SPI_setup<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(10);\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Write<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> mode)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(SPI_GetFlagStatus(SPI_FLAG_BSY));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_WriteLow(CTL_PORT, CS_pin);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<strong>switch<\/strong>(mode)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> CMD:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteLow(CTL_PORT, RS_pin);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> DAT:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_WriteHigh(CTL_PORT, RS_pin);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 SPI_SendData(value);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(!SPI_GetFlagStatus(SPI_FLAG_TXE));<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_WriteHigh(CTL_PORT, CS_pin);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Reset<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_WriteLow(CTL_PORT, RST_pin);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 GPIO_WriteHigh(CTL_PORT, RST_pin);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_init<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>ST7735_HW_init<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>ST7735_Reset<\/strong>();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_SWRESET, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_us(150);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_SLPOUT, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_us(150);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_FRMCTR1, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x01, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2C, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2D, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_FRMCTR2, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x01, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2C, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2D, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_FRMCTR3, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x01, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2C, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2D, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x01, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2C, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2D, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_INVCTR, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x07, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_PWCTR1, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0xA2, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x02, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x84, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_PWCTR1, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0xC5, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_PWCTR2, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x0A, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_PWCTR3, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x8A, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2A, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_PWCTR4, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x8A, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0xEE, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_PWCTR5, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x0E, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_VMCTR1, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_COLMOD, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x05, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_MADCTL, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0xC8, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_RAM_Address_Set();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_GMCTRP1, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x02, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x1C, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x07, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x12, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x37, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x32, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x29, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2D, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x29, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x25, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2B, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x39, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x01, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x03, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x10, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_GMCTRN1, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x03, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x1D, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x07, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x06, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2E, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2C, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x29, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2D, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2E, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x2E, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x37, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x3F, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x02, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x10, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_NORON, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(10);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_DISPON, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(100);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_RAMWR, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay_ms(100);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Word_Write<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(((value &amp; 0xFF00) &gt;&gt; 0x08), DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write((value &amp; 0x00FF), DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Set_Addr_Window<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> xs, <strong>signed<\/strong> <strong>int<\/strong> ys, <strong>signed<\/strong> <strong>int<\/strong> xe, <strong>signed<\/strong> <strong>int<\/strong> ye)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_CASET, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(xs, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(xe, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_RASET, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ys, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(0x00, DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ye, DAT);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_RAMWR, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_RAM_Address_Set<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>ST7735_Set_Addr_Window<\/strong>(0x00, 0x00, 0x7F, 0x9F);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Invert_Display<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> i)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 ST7735_Write(i, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Set_Rotation<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> m)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> rotation = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ST7735_Write(ST7735_MADCTL, CMD);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 rotation = (m % 4);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>switch<\/strong>(rotation)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> 0:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ST7735_Write((MADCTL_MX | MADCTL_MY | MADCTL_RGB), DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 width\u00a0 = ST7735_TFTWIDTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 length = ST7735_TFTLENGTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> 1:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ST7735_Write((MADCTL_MY | MADCTL_MV | MADCTL_RGB), DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 width\u00a0 = ST7735_TFTLENGTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 length = ST7735_TFTWIDTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> 2:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ST7735_Write((MADCTL_RGB), DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 width = ST7735_TFTWIDTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 length = ST7735_TFTLENGTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> 3:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ST7735_Write((MADCTL_MX | MADCTL_MV | MADCTL_RGB), DAT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 width = ST7735_TFTLENGTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 length = ST7735_TFTWIDTH;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TFT_fill<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> i = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> j = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>ST7735_Set_Addr_Window<\/strong>(0, 0, (width - 1), (length - 1));<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>for<\/strong>(j = length; j &gt; 0; j--)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = width; i &gt; 0; i--)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ST7735_Word_Write<\/strong>(colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Pixel<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>ST7735_Set_Addr_Window<\/strong>(x_pos, y_pos, (1 + x_pos), (1 + y_pos));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>ST7735_Word_Write<\/strong>(colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> <strong>int<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dx = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dy = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> stepx = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> stepy = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> fraction = 0x0000;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 dy = (y2 - y1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 dx = (x2 - x1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong> (dy &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dy = -dy;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 stepy = -1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 stepy = 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong> (dx &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dx = -dx;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 stepx = -1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 stepx = 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 dx &lt;&lt;= 0x01;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 dy &lt;&lt;= 0x01;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x1, y1, colour);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong> (dx &gt; dy)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fraction = (dy - (dx &gt;&gt; 1));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong> (x1 != x2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong> (fraction &gt;= 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y1 += stepy;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fraction -= dx;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x1 += stepx;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fraction += dy;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x1, y1, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fraction = (dx - (dy &gt;&gt; 1));<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong> (y1 != y2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong> (fraction &gt;= 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x1 += stepx;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fraction -= dy;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y1 += stepy;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fraction += dx;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x1, y1, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Rectangle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>char<\/strong> type, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> i = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> xmin = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> xmax = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> ymin = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> ymax = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(fill != NO)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(x1 &lt; x2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xmin = x1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xmax = x2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xmin = x2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xmax = x1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(y1 &lt; y2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ymin = y1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ymax = y2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ymin = y2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ymax = y1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(; xmin &lt;= xmax; ++xmin)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = ymin; i &lt;= ymax; ++i)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(xmin, i, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>(x1, y1, x2, y1, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>(x1, y2, x2, y2, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>(x1, y1, x1, y2, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>(x2, y1, x2, y2, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(type != SQUARE)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x1, y1, back_colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x1, y2, back_colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x2, y1, back_colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x2, y2, back_colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Circle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> xc, <strong>signed<\/strong> <strong>int<\/strong> yc, <strong>signed<\/strong> <strong>int<\/strong> radius, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>int<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> a = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> b = 0x0000;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> p = 0x0000;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 b = radius;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 p = (1 - b);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 <strong>do<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(fill != NO)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>((xc - a), (yc + b), (xc + a), (yc + b), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>((xc - a), (yc - b), (xc + a), (yc - b), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>((xc - b), (yc + a), (xc + b), (yc + a), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>((xc - b), (yc - a), (xc + b), (yc - a), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc + a), (yc + b), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc + b), (yc + a), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc - a), (yc + b), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc - b), (yc + a), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc + b), (yc - a), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc + a), (yc - b), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc - a), (yc - b), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>((xc - b), (yc - a), colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(p &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p += (0x03 + (0x02 * a++));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p += (0x05 + (0x02 * ((a++) - (b--))));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<strong>while<\/strong>(a &lt;= b);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_V_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> pos = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> temp = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(y1 &gt; y2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;y1, &amp;y2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(y2 &gt; (y1 - 1))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x1, y2, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y2--;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_H_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>unsigned<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> pos = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> temp = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(x1 &gt; x2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;x1, &amp;x2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>while<\/strong>(x2 &gt; (x1 - 1))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Pixel<\/strong>(x2, y1, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x2--;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Triangle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>signed<\/strong> <strong>int<\/strong> x3, <strong>signed<\/strong> <strong>int<\/strong> y3, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>int<\/strong> colour)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> a = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> b = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> sa = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> sb = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> yp = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> last = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dx12 = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dx23 = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dx13 = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dy12 = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dy23 = 0;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> dy13 = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>switch<\/strong>(fill)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>case<\/strong> YES:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(y1 &gt; y2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;y1, &amp;y2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;x1, &amp;x2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(y2 &gt; y3)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;y3, &amp;y2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;x3, &amp;x2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(y1 &gt; y2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;y1, &amp;y2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;x1, &amp;x2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(y1 == y3)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a = b = x1;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(x2 &lt; a)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a = x2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>(x2 &gt; b)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = x2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(x2 &lt; a)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a = x3;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>(x3 &gt; b)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = x3;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_H_Line<\/strong>(a, (a + (b - (a + 1))), y1, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>return<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dx12 = (x2 - x1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dy12 = (y2 - y1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dx13 = (x3 - x1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dy13 = (y3 - y1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dx23 = (x3 - x2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dy23 = (y3 - y2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sa = 0,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb = 0;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(y2 == y3)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 last = y2;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 last = (y2 - 1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(yp = y1; yp &lt;= last; yp++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a = (x1 + (sa \/ dy12));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = (x1 + (sb \/ dy13));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sa += dx12;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb += dx13;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(a &gt; b)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;a, &amp;b);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_H_Line<\/strong>(a, (a + (b - (a + 1))), yp, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sa = (dx23 * (yp - y2));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb = (dx13 * (yp - y1));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(; yp &lt;= y3; yp++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a = (x2 + (sa \/ dy23));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b = (x1 + (sb \/ dy13));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sa += dx23;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb += dx13;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(a &gt; b)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 swap(&amp;a, &amp;b);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_H_Line<\/strong>(a, (a + (b - (a + 1))), yp, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>default<\/strong>:<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>(x1, y1, x2, y2, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>(x2, y2, x3, y3, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Line<\/strong>(x3, y3, x1, y1, colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>break<\/strong>;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Font_Pixel<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>char<\/strong> pixel_size)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> i = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>ST7735_Set_Addr_Window<\/strong>(x_pos, y_pos, (x_pos + pixel_size - 1), (y_pos + pixel_size - 1));<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong>(i = 0x00; i &lt; (pixel_size * pixel_size); i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>ST7735_Word_Write<\/strong>(colour);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_char<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong>\u00a0 y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>char<\/strong> ch)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> i = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>unsigned<\/strong> <strong>char<\/strong> j = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> value = 0x00;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(font_size &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 font_size = 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(x_pos &lt; font_size)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x_pos = font_size;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong> (i = 0x00; i &lt; 0x05; i++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>for<\/strong> (j = 0x00; j &lt; 0x08; j++)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = 0x00;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = ((font[((<strong>unsigned<\/strong> <strong>char<\/strong>)ch) - 0x20][i]));<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>((value &gt;&gt; j)\u00a0 &amp; 0x01)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Font_Pixel<\/strong>(x_pos, y_pos, colour, font_size);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>Draw_Font_Pixel<\/strong>(x_pos, y_pos, back_colour, font_size);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y_pos = y_pos + font_size;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y_pos -= (font_size &lt;&lt; 0x03);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x_pos += font_size;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 x_pos += font_size;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(x_pos &gt; width)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x_pos = (font_size + 0x01);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y_pos += (font_size &lt;&lt; 0x03);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_str<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>char<\/strong> *ch)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>do<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_char<\/strong>(x_pos, y_pos, font_size, colour, back_colour, *ch++);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x_pos += (font_size * 0x06);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<strong>while<\/strong>((*ch &gt;= 0x20) &amp;&amp; (*ch &lt;= 0x7F) &amp;&amp; (*ch != '\\n'));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_C<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>signed<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>char<\/strong> ch[4] = {0x20, 0x20, 0x20, 0x20};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &lt; 0x00)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x2D;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 0) &amp;&amp; (value &lt;= 9))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>print_str<\/strong>(x_pos, y_pos, font_size, colour, back_colour, ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_I<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>signed<\/strong> <strong>int<\/strong> value)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>char<\/strong> ch[6] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x2D;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = -value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[0] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &gt; 9999)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value \/ 10000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 10000) \/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 999) &amp;&amp; (value &lt;= 9999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 10000) \/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 99) &amp;&amp; (value &lt;= 999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt; 9) &amp;&amp; (value &lt;= 99))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[1] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[5] = 0x20;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>print_str<\/strong>(x_pos, y_pos, font_size, colour, back_colour, ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_D<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>unsigned<\/strong> <strong>int<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>char<\/strong> ch[5] = {0x2E, 0x20, 0x20, 0x20, 0x20};<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 ch[1] = ((value \/ 1000) + 0x30);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(points &gt; 1)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[2] = (((value % 1000) \/ 100) + 0x30);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(points &gt; 2)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[3] = (((value % 100) \/ 10) + 0x30);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(points &gt; 3)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch[4] = ((value % 10) + 0x30);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>print_str<\/strong>(x_pos, y_pos, font_size, colour, back_colour, ch);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_F<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>float<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>long<\/strong> tmp = 0x0000;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 tmp = value;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>print_I<\/strong>(x_pos, y_pos, font_size, colour, back_colour, tmp);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 tmp = ((value - tmp) * 10000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>(tmp &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tmp = -tmp;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>if<\/strong>((value &gt;= 9999) &amp;&amp; (value &lt; 99999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + (0x24 * font_size)), y_pos, font_size, colour, back_colour, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 999) &amp;&amp; (value &lt; 9999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + (0x1E * font_size)), y_pos, font_size, colour, back_colour, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 99) &amp;&amp; (value &lt; 999))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + (0x18 * font_size)), y_pos, font_size, colour, back_colour, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>((value &gt;= 9) &amp;&amp; (value &lt; 99))<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + (0x12 * font_size)), y_pos, font_size, colour, back_colour, tmp, points);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 <strong>else<\/strong> <strong>if<\/strong>(value &lt; 9)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_D<\/strong>((x_pos + (0x0C * font_size)), y_pos, font_size, colour, back_colour, tmp, points);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(value &lt; 0)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_char<\/strong>(x_pos, y_pos, font_size, colour, back_colour, 0x2D);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>else<\/strong><\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>print_char<\/strong>(x_pos, y_pos, font_size, colour, back_colour, 0x20);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p><strong><em><u>main.c<\/u><\/em><\/strong><\/p>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"STM8S.h\"<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>#include<\/strong> \"ST7735.h\"<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>int<\/strong> width;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>unsigned<\/strong> <strong>int<\/strong> length;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>setup_clock<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>setup_GPIOs<\/strong>(<strong>void<\/strong>);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>main<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>float<\/strong> f = -0.09;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>int<\/strong> i = -9;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>signed<\/strong> <strong>char<\/strong> c = 127;<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>setup_clock<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>setup_GPIOs<\/strong>();<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 ST7735_init();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 ST7735_Set_Rotation(0x01);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 TFT_fill(<strong>Swap_Colour<\/strong>(GREEN));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Circle(79, 63, 20, YES, Swap_Colour(RED));<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 delay_ms(4000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 TFT_fill(<strong>Swap_Colour<\/strong>(WHITE));<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Circle(6, 6, 4, YES, RED);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Circle(153, 6, 4, YES, RED);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Circle(6, 121, 4, YES, RED);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Circle(153, 121, 4, YES, RED);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 delay_ms(1000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Line(14, 0, 14, 127, CYAN);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Line(145, 0, 145, 127, CYAN);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Line(0, 14, 159, 14, CYAN);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Line(0, 113, 159, 113, CYAN);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 delay_ms(1000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 Draw_Rectangle(17, 17, 142, 110, YES, ROUND, BLUE, WHITE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 delay_ms(1000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 print_str(22, 58, 2, YELLOW, BLUE, \"MicroArena\");<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 delay_ms(4000);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 TFT_fill(BLACK);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 print_str(20, 90, 1, YELLOW, BLACK, \"www.fb.com\/MicroArena\");<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(1)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_F(60, 20, 1, BLUE, BLACK, f, 2);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_C(60, 40, 1, RED, BLACK, c);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 print_I(60, 60, 1, GREEN, BLACK, i);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 f += 0.01;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c -= 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i += 1;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>if<\/strong>(c &lt; -128)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c = 127;<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(60);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0 };<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>setup_clock<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_DeInit();<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSECmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_LSICmd(DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSICmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <strong>while<\/strong>(CLK_GetFlagStatus(CLK_FLAG_HSERDY) == FALSE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchCmd(ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE,<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER3, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<pre><\/pre>\n<pre><\/pre>\n<pre><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>setup_GPIOs<\/strong>(<strong>void<\/strong>)<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">{<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(SPI_PORT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GPIO_DeInit(CTL_PORT);<\/span><\/em><\/pre>\n<pre><em><span style=\"color: #0000ff\">}<\/span><\/em><\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h4>Explanation<\/h4>\n<p style=\"text-align: justify\">Well that\u2019s a hell lot code. Explaining the working of the ST7735 TFT display is beyond the scope of this article. The goal here is just the integration of such displays with STM8s. The library I coded here has several functions which however need some explanation.<\/p>\n<p style=\"text-align: justify\">The following functions set display inversion and orientation.<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Invert_Display<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> i);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>ST7735_Set_Rotation<\/strong>(<strong>unsigned<\/strong> <strong>char<\/strong> m);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">For graphics, the following functions can be used:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>\/* <\/strong><\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>Fills the entire TFT area with the designated colour.<\/strong><\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>*\/<\/strong><\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>\u00a0<\/strong><\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>TFT_fill<\/strong>(<strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Draws a pixel of designated colour on coordinate (x_pos, y_pos).<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Pixel<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Draws a line of designated colour from point (x1, y1) to (x2, y2).<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Draws a rectangle from point (x1, y1) to (x2, y2). \u201cFill\u201d states whether or not the rectangular area is solid filled. \u201cType\u201d states whether the edges of the rectangle are round or square. \u201cColour\u201d states the colour of the edges of the rectangle and \u201cback colour\u201d states the colour of the area inside the rectangle.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Rectangle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>char<\/strong> type, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Draws a circle of a given radius with center at (xc, yc). Argument \u201cradius\u201d states radius of the circle in pixels. \u201cFill\u201d states whether or not the circular area is solid filled. \u201cColour\u201d states colour of the circle.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Circle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> xc, <strong>signed<\/strong> <strong>int<\/strong> yc, <strong>signed<\/strong> <strong>int<\/strong> radius, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Draws a vertical line of designated colour from point (x1, y1) to point (x1, y2)<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_V_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>unsigned<\/strong> colour);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Draws a horizontal line of designated colour from point (x1, y1) to point (x2, y1)<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_H_Line<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>unsigned<\/strong> colour);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Draws a triangle of designated colour in the area enclosed by points (x1, y1), (x2, y2) and (x3, y3). \u201cFill\u201d states whether or not the occupied area is solid filled.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>Draw_Triangle<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x1, <strong>signed<\/strong> <strong>int<\/strong> y1, <strong>signed<\/strong> <strong>int<\/strong> x2, <strong>signed<\/strong> <strong>int<\/strong> y2, <strong>signed<\/strong> <strong>int<\/strong> x3, <strong>signed<\/strong> <strong>int<\/strong> y3, <strong>unsigned<\/strong> <strong>char<\/strong> fill, <strong>unsigned<\/strong> <strong>int<\/strong> colour);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\"><strong>\u00a0<\/strong><\/p>\n<p style=\"text-align: justify\">For printing texts, the following functions can be used:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Prints a single character \u201cch\u201d at (x_pos, y_pos) with size stated by \u201cfont_size\u201d. \u201cColour\u201d states font colour and \u201cback_colour\u201d states the font background colour.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>\u00a0<\/strong><\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_char<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong>\u00a0 y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>char<\/strong> ch);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Prints a string of characters from point (x_pos, y_pos) with size stated by \u201cfont_size\u201d. \u201cColour\u201d states font colour and \u201cback_colour\u201d states the font background colour.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_str<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>char<\/strong> *ch);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Prints a character type variable in \u201cvalue\u201d at (x_pos, y_pos) with size stated by \u201cfont_size\u201d. \u201cColour\u201d states font colour and \u201cback_colour\u201d states the font background colour.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_C<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>signed<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>\u00a0<\/strong><\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Prints an integer type variable in \u201cvalue\u201d at (x_pos, y_pos) with size stated by \u201cfont_size\u201d. \u201cColour\u201d states font colour and \u201cback_colour\u201d states the font background colour.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>\u00a0<\/strong><\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_I<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>signed<\/strong> <strong>int<\/strong> value);<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">\/*<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">Prints a float type variable in \u201cvalue\u201d at (x_pos, y_pos) with size stated by \u201cfont_size\u201d. \u201cColour\u201d states font colour and \u201cback_colour\u201d states the font background colour. Points states the number of digits after decimal point.<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">*\/<\/span><\/em><\/pre>\n<pre style=\"text-align: justify\"><\/pre>\n<p>&nbsp;<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\"><strong>void<\/strong> <strong>print_F<\/strong>(<strong>signed<\/strong> <strong>int<\/strong> x_pos, <strong>signed<\/strong> <strong>int<\/strong> y_pos, <strong>unsigned<\/strong> <strong>char<\/strong> font_size, <strong>unsigned<\/strong> <strong>int<\/strong> colour, <strong>unsigned<\/strong> <strong>int<\/strong> back_colour, <strong>float<\/strong> value, <strong>unsigned<\/strong> <strong>char<\/strong> points);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Initialize the TFT display before using it by including the following initialization function in the main file:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">ST7735_init();<\/span><\/em><\/pre>\n<p style=\"text-align: justify\">Since the TFT display communicates by using SPI communication method, enable the SPI peripheral clock and necessary GPIOs:<\/p>\n<pre style=\"text-align: justify\"><em><span style=\"color: #0000ff\">CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);<\/span><\/em><\/pre>\n<p style=\"text-align: justify\"><strong><em>Font.h <\/em><\/strong>contains the character fonts and must be included to print texts, symbols and numbers.<\/p>\n<p style=\"text-align: justify\">One word of caution, by the way, is to look out for possible stack overflow and memory model related issues. If such a case arise then you should check the memory model of your code from project settings as shown:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Stack.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14050\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Stack-580x446.png\" alt=\"Stack\" width=\"580\" height=\"446\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Stack-580x446.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Stack.png 585w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p style=\"text-align: justify\">Usually this case occurs when we try to declare a large array or do something similar. By default, short stack memory model is selected and most projects will flawlessly work with this memory model. However, for some projects especially those related to TFT, OLED, graphical displays, GSM, GPS and similar, long stack model is a must or else you won\u2019t be able to compile your code any way.<\/p>\n<h4>Demo<\/h4>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14051\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-1-580x427.jpg\" alt=\"TFT (1)\" width=\"580\" height=\"427\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-1-580x427.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-1.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14052\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-2-580x424.jpg\" alt=\"TFT (2)\" width=\"580\" height=\"424\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-2-580x424.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-2.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-14054\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-3-580x427.jpg\" alt=\"TFT (3)\" width=\"580\" height=\"427\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-3-580x427.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/TFT-3.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\/R-NL_7BuCwM?feature=oembed\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen><\/iframe><br \/>\n<!--nextpage--><\/p>\n<p>A sequel of this post can be found <a href=\"http:\/\/embedded-lab.com\/blog\/stm8-microcontrollers-final-chapters\/\" target=\"_blank\">here<\/a>.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-14008\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2018\/01\/Hardware.png\" alt=\"Hardware\" width=\"454\" height=\"560\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is the continuation of the\u00a0first post on STM8 microcontrollers\u00a0here.<\/p>\n","protected":false},"author":5,"featured_media":13315,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1638,1466],"tags":[1646,862,1645,1644,1715,850],"class_list":["post-13976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-stm8","category-tutorials","tag-8-bit-microcontroller","tag-stm","tag-stm8","tag-stm8s","tag-stm8vldiscovery","tag-stmicroelectronics"],"_links":{"self":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/13976","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=13976"}],"version-history":[{"count":35,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/13976\/revisions"}],"predecessor-version":[{"id":14241,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/13976\/revisions\/14241"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media\/13315"}],"wp:attachment":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=13976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=13976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=13976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}