Page 457 - Programming Microcontrollers in C
P. 457

442    Chapter 8  MCORE, A RISC Machine

                       static BYTE c;

                       if(KPSR.KPKD)  /* if a key has been depressed */
                       {
                          for(column=COL_0;column!=0xf;column=(column<<1 |0x1) & 0xf)
                          {
                              KPDRB.COLUMNS=column;
                              /* kill some time here */
                              if(KPDRB.ROWS!=0xff)
                              {
                                 c=(~(KPDRB.COLUMNS<<4 |
                                     (KPDRB.ROWS&0xf))) & 0xff;
                              }
                          }
                          if(c==0x22)
                              *data=’2';
                          else if(c==0x42)
                              *data=’1';
                          else
                              *data=0;
                          c=0;
                          KPDRB.COLUMNS=0X0; /* write 0 to KPDR[15:8] */
                          KPSR.KDIE=OFF;  /* disable key depress interrupt */
                          KPSR.KRIE=ON;  /* enable key release interrupt */
                   }
                   else                     /* key release was detected */
                   {
                          KPSR.KPKR=ON;
                          KPSR.KPKD=ON;  /* clear key release and depress */
                          KPSR.KRSS=ON;  /* set key release synchronizer */
                          KPSR.KDSC=ON;  /* clear key depress synchronizer */
                          KPDRB.COLUMNS=0X0; /* write 0 to KPDR[15:8] */
                          KPSR.KDIE=ON;  /* enable key depress interrupt */
                          KPSR.KRIE=OFF;  /* disable key release interrupt */
                       }
                   }
                              The code executed by the isr when a key is released is unchanged
                          from earlier.

            Adding a Display

                              Access to the LCD port is through a memory-mapped register.
                          This register contains two byte-wide fields, one called COMMAND
   452   453   454   455   456   457   458   459   460   461   462