home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_02 / 2n02039a < prev    next >
Text File  |  1990-12-27  |  9KB  |  321 lines

  1. /*-
  2.  *  ---------------------------------------------
  3.  *  File:       I8255FNC.C
  4.  *  Creator:    Blake Miller
  5.  *  Version:    01.00.00            October 1990
  6.  *  Language:   Microsoft Quick C   Version 2.0
  7.  *  Purpose:    Intel 8255A Digital IO Functions
  8.  *  ---------------------------------------------
  9.  */
  10.  
  11. /*  Include Files ----------------------------*/
  12. #define     I8255FNC_C_DEFINED  1
  13. #include    "I8255GEN.H"
  14. #undef      I8255FNC_C_DEFINED
  15.  
  16. /*  Function Prototypes ----------------------*/
  17. void I8255_init(I8255DAT *data,int address);
  18. void I8255_config(I8255DAT *data,int pa_dir,
  19.                   int pb_dir,int cl_dir,int ch_dir);
  20. void I8255_bitput(I8255DAT *data,int bit,int state);
  21. void I8255_bitget(I8255DAT *data,int bit,int *state);
  22. void I8255_put_byte(I8255DAT *data,int p_num,
  23.                     unsigned char p_dat);
  24. void I8255_get_byte(I8255DAT *data,int p_num,
  25.                     unsigned char *p_dat);
  26. void I8255_dump_bytes(I8255DAT *data);
  27. void I8255_load_bytes(I8255DAT *data);
  28.  
  29. /*  ---------------------------------------------
  30.  *  Function Definitions
  31.  *  ---------------------------------------------
  32.  */
  33.  
  34. /*- 8255 : Initialize Data Space -------------**
  35.  *  Initialize the data to safe values.
  36.  *  Passed:
  37.  *      pointer :   port data
  38.  *      integer :   I8255 base address
  39.  */
  40. void I8255_init (I8255DAT *data, int address)
  41.     {
  42.     data->stat = I8255_ST_OK;
  43.     data->base = address;
  44.     data->mode = 0;
  45.     data->adat = 0;
  46.     data->bdat = 0;
  47.     data->cdat = 0;
  48.     }
  49.  
  50. /*- 8255 : Configure --------------------------**
  51.  *  Configure the 8255A for all ports in Mode 0.
  52.  *  Pass an integer representing the IN or OUT
  53.  *  state for each port.  TRUE (!0) will mean
  54.  *  input, and FALSE (0) will mean output.
  55.  *  Passed:
  56.  *      pointer :   port data
  57.  *      integer :   direction Port A
  58.  *      integer :   direction Port B
  59.  *      integer :   direction Port C Low
  60.  *      integer :   direction Port C High
  61.  */
  62. void I8255_config (I8255DAT *data, int pa_dir, int pb_dir,
  63.                                int cl_dir, int ch_dir)
  64.     {
  65.     data->mode = I8255_SET;
  66.     if ( pa_dir )   data->mode |= I8255_PA_IN;
  67.     if ( pb_dir )   data->mode |= I8255_PB_IN;
  68.     if ( cl_dir )   data->mode |= I8255_CL_IN;
  69.     if ( ch_dir )   data->mode |= I8255_CH_IN;
  70.     chp_portwt ( I8255_CNTRL(data->base), data->mode );
  71.     data->stat = I8255_ST_OK;
  72.     }
  73.  
  74. /*- I8255 : Bit Put ----------------------------**
  75.  *  Set/Clear one of the bits in the 8255.
  76.  *  A state of 1 sets the bit and a state of
  77.  *  0 clears the bit.
  78.  *  Passed:
  79.  *      pointer :   port data
  80.  *      integer :   bit number
  81.  *      integer :   state : TRUE (!0) = SET,
  82.  *                          FALSE (0) = CLEAR
  83.  *      Loads stat with appropriate error code
  84.  */
  85. void I8255_bitput (I8255DAT *data, int bit, int state)
  86.     {
  87.     int             port;   /* port number  */
  88.     int             padd;   /* port address */
  89.     unsigned char   mask;   /* byte mask    */
  90.     unsigned char   oval;   /* out value    */
  91.  
  92.     if ( (bit < 1) || (bit > 24) ){
  93.         data->stat = I8255_ST_BB;
  94.         return;
  95.         }
  96.     bit--;
  97.     port = ( bit / 8 );     /* port number (0 - 2)          */
  98.     bit = bit % 8;          /* modulo to get the bit number */
  99.     mask = 0x01;            /* assume low bit of byte       */
  100.     mask = mask << bit;     /* shift left to requested bit  */
  101.     if ( state ){           /* bit set  */
  102.         switch ( port ){
  103.             case 0:         /* port A   */
  104.                 data->adat = data->adat | mask;
  105.                 break;
  106.             case 1:         /* port B   */
  107.                 data->bdat = data->bdat | mask;
  108.                 break;
  109.             case 2:         /* port C   */
  110.                 data->cdat = data->cdat | mask;
  111.                 break;
  112.             }
  113.         }
  114.     else {                  /* bit clear    */
  115.         mask = ~mask;
  116.         switch ( port ){
  117.             case 0:         /* port A   */
  118.                 data->adat = data->adat & mask;
  119.                 break;
  120.             case 1:         /* port B   */
  121.                 data->bdat = data->bdat & mask;
  122.                 break;
  123.             case 2:         /* port C   */
  124.                 data->cdat = data->cdat & mask;
  125.                 break;
  126.             }
  127.         }
  128.     switch ( port ){
  129.         case 0:         /* port A   */
  130.             padd = I8255_PORTA (data->base);
  131.             oval = data->adat;
  132.             break;
  133.         case 1:         /* port B   */
  134.             padd = I8255_PORTB (data->base);
  135.             oval = data->bdat;
  136.             break;
  137.         case 2:         /* port C   */
  138.             padd = I8255_PORTC (data->base);
  139.             oval = data->cdat;
  140.             break;
  141.         default:        /* bad port number  */
  142.             data->stat = I8255_ST_BP;
  143.             return;
  144.             break;
  145.         }
  146.     chp_portwt ( padd, oval );
  147.     data->stat = I8255_ST_OK;
  148.     }
  149.  
  150. /*- I8255 : Bit Get ----------------------------**
  151.  *  Read one of the bits in the 8255.
  152.  *  A state of 1 indicates a set bit and a state of 0
  153.  *  indicates a clear bit.
  154.  *  Passed:
  155.  *      pointer :   port data
  156.  *      integer :   bit number
  157.  *      pointer :   integer :   state :
  158.  *                  1 = SET, 0 = CLEAR
  159.  *      Loads stat with approrpiate error code.
  160.  *      Loads state with 0 or 1.
  161.  */
  162. void I8255_bitget (I8255DAT *data, int bit, int *state)
  163.     {
  164.     int             port;   /* port number  */
  165.     int             padd;   /* port address */
  166.     unsigned char   ival;   /* in value     */
  167.  
  168.     if ( (bit < 1) || (bit > 24) ){
  169.         data->stat = I8255_ST_BB;
  170.         return;
  171.         }
  172.     bit--;
  173.     port = ( bit / 8);      /* port number (0 - 2)          */
  174.     bit = bit % 8;          /* modulo to get the bit number */
  175.     switch ( port ){
  176.         case 0:         /* port A   */
  177.             padd = I8255_PORTA(data->base);
  178.             break;
  179.         case 1:         /* port B   */
  180.             padd = I8255_PORTB(data->base);
  181.             break;
  182.         case 2:         /* port C   */
  183.             padd = I8255_PORTC(data->base);
  184.             break;
  185.         default:        /* bad port number  */
  186.             data->stat = I8255_ST_BP;
  187.             return;
  188.             break;
  189.         }
  190.     chp_portrd ( padd, &ival );
  191.     ival = ival >> bit;
  192.     ival = ival & 0x01;
  193.     *state = (unsigned int) ival;
  194.     data->stat = I8255_ST_OK;
  195.     }
  196.  
  197. /*- I8255 : Byte Put ---------------------------**
  198.  *  Write one of the bytes in the 8255A.
  199.  *  The port number should be 1 - 3 as follows:
  200.  *  1 = Port A,  2 = Port B,  3 = Port C
  201.  *  Passed:
  202.  *      pointer         :   port data
  203.  *      integer         :   port number
  204.  *      unsigned char   :   port data
  205.  *      Loads stat with any error ID.
  206.  */
  207. void I8255_put_byte (I8255DAT *data, int p_num, unsigned char p_dat)
  208.     {
  209.     int             padd;   /* port address */
  210.  
  211.     if ( (p_num < 1) || (p_num > 3) ){
  212.         data->stat = I8255_ST_BP;
  213.         return;
  214.         }
  215.     p_num--;
  216.     switch ( p_num ){
  217.         case 0:         /* port A   */
  218.             padd = I8255_PORTA(data->base);
  219.             data->adat = p_dat;
  220.             break;
  221.         case 1:         /* port B   */
  222.             padd = I8255_PORTB(data->base);
  223.             data->bdat = p_dat;
  224.             break;
  225.         case 2:         /* port C   */
  226.             padd = I8255_PORTC(data->base);
  227.             data->cdat = p_dat;
  228.             break;
  229.         default:        /* bad port number  */
  230.             return;
  231.             break;
  232.         }
  233.     chp_portwt ( padd, p_dat );
  234.     data->stat = I8255_ST_OK;
  235.     }
  236.  
  237. /*- I8255 : Byte Get ---------------------------**
  238.  *  Read one of the bytes in the 8255.
  239.  *  The port number should be 1 - 3 as follows:
  240.  *  1 = Port A,  2 = Port B,  3 = Port C
  241.  *  Reads the 8255A and returns data in
  242.  *  variable as well as loading port data area.
  243.  *  Passed:
  244.  *      pointer :   port data
  245.  *      integer :   port number
  246.  *      pointer :   unsigned char : returned port data
  247.  *  Returns:
  248.  *      Loads stat with appropriate error code.
  249.  *      Loads p_dat with returned data.
  250.  */
  251. void I8255_get_byte (I8255DAT *data, int p_num,
  252.                    unsigned char *p_dat)
  253.     {
  254.     int             padd;   /* port address */
  255.     unsigned char   ival;   /* input value  */
  256.  
  257.     if ( (p_num < 1) || (p_num > 3) ){
  258.         data->stat = I8255_ST_BP;
  259.         return;
  260.         }
  261.     p_num--;
  262.     switch ( p_num ){
  263.         case 0:         /* port A   */
  264.             padd = I8255_PORTA(data->base);
  265.             break;
  266.         case 1:         /* port B   */
  267.             padd = I8255_PORTB(data->base);
  268.             break;
  269.         case 2:         /* port C   */
  270.             padd = I8255_PORTC(data->base);
  271.             break;
  272.         }
  273.     chp_portrd ( padd, &ival );   /* input data   */
  274.     switch ( p_num ){
  275.         case 0:         /* port A   */
  276.             data->adat = ival;
  277.             break;
  278.         case 1:         /* port B   */
  279.             data->bdat = ival;
  280.             break;
  281.         case 2:         /* port C   */
  282.             data->cdat = ival;
  283.             break;
  284.         }
  285.     *p_dat = ival;
  286.     data->stat = I8255_ST_OK;
  287.     }
  288.  
  289. /*- I8255 : Dump Bytes -------------------------**
  290.  *  Write all of the bytes from the data area to the 8255.
  291.  */
  292. void I8255_dump_bytes (I8255DAT *data)
  293.     {
  294.     chp_portwt ( I8255_PORTA(data->base), data->adat );
  295.     chp_portwt ( I8255_PORTB(data->base), data->bdat );
  296.     chp_portwt ( I8255_PORTC(data->base), data->cdat );
  297.     data->stat = I8255_ST_OK;
  298.     }
  299.  
  300. /*- I8255 : Load Bytes -------------------------**
  301.  *  Read all of the bytes of the 8255 into the data area.
  302.  */
  303. void I8255_load_bytes (I8255DAT *data)
  304.     {
  305.     unsigned char   ival;   /* input value  */
  306.  
  307.     chp_portrd ( I8255_PORTA(data->base), &ival );
  308.     data->adat = ival;
  309.     chp_portrd ( I8255_PORTB(data->base), &ival );
  310.     data->bdat = ival;
  311.     chp_portrd ( I8255_PORTC(data->base), &ival );
  312.     data->cdat = ival;
  313.     data->stat = I8255_ST_OK;
  314.     }
  315.  
  316. /*-
  317.  *  -------------------------------------------------------
  318.  *  END I8255FNC.C Source File
  319.  *  -------------------------------------------------------
  320.  */
  321.