Software reuse is a noble goal that has been chased by many firms for years. This paper first defines why abstraction is needed to enable reuse, then describes 3 methods of abstracting hardware from software applications. The first method provide a shallow level of abstraction and uses a direct I/O access method using macros to hide the implementation. This method is the fastest and easiest to use, but is also the hardest to change when the hardware changes. Method 2 uses an API for direct I/O. This method is more flexible and ports easier to different hardware, but requires a slight addition in resources. The final method utilizes a high level of abstraction and is an example of indirect I/O, where the I/O is obtained using a messaging system such as is found in OSEK or device drivers as in a Windows or Unix based RTOS. This system works well in a complex environment where data is obtained both from hardware and other devices. The cost is additional resources and is not for small systems.