diff --git a/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c b/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c
index 4db10152d0d37404a8b2a135293155f28f3cbe2f..4c971541d928d6a99a0498ee01d2579d429b45f5 100644
--- a/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c
+++ b/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c
@@ -52,6 +52,7 @@ char *memdev="/dev/mem";
 #define PARLCD_REG_BASE_PHYS 0x43c00000
 #define PARLCD_REG_SIZE      0x00004000
 
+#define PARLCD_REG_CR_o                 0x0000
 #define PARLCD_REG_CMD_o                0x0008
 #define PARLCD_REG_DATA_o               0x000C
 
@@ -85,6 +86,11 @@ void *map_phys_address(off_t region_base, size_t region_size, int opt_cached)
   return mem;
 }
 
+void parlcd_write_cr(unsigned char *parlcd_mem_base, uint16_t data)
+{
+  *(volatile uint16_t*)(parlcd_mem_base + PARLCD_REG_CR_o) = data;
+}
+
 void parlcd_write_cmd(unsigned char *parlcd_mem_base, uint16_t cmd)
 {
   *(volatile uint16_t*)(parlcd_mem_base + PARLCD_REG_CMD_o) = cmd;
@@ -377,6 +383,12 @@ int main(int argc, char *argv[])
   struct ifaddrs *ifa = NULL;
   struct ifaddrs *ifa_it;
 
+  int lcd_hw_reset = 0;
+
+  if (argc >= 2)
+    if(!strcmp(argv[1], "reset"))
+      lcd_hw_reset = 1;
+
   if (getifaddrs(&ifa)) {
     return -1;
   }
@@ -404,6 +416,13 @@ int main(int argc, char *argv[])
   if (parlcd_mem_base == NULL)
     exit(1);
 
+  if (lcd_hw_reset) {
+    parlcd_write_cr(parlcd_mem_base, 2);
+    parlcd_delay(100);
+    parlcd_write_cr(parlcd_mem_base, 0);
+    parlcd_delay(100);
+  }
+
   parlcd_hx8357_init(parlcd_mem_base);
   parlcd_hx8357_init(parlcd_mem_base);