Title: Simple Digital I/O in C
1Simple Digital I/O in C
These lecture notes created by Dr. Alex Dean, NCSU
2In these notes . . .
- Simple Digital I/O
- Port
- Data Direction
- Data
- Drive Capacity
- Use
- Initialization
- Reading
- Writing
- Example
- Echo LEDs
3Digital Input/Output (I/O) Ports
- The fundamental interfacing subsystem
- A port bit can be input or output
- M30626 has 11 Programmable I/O Ports (total of 87
digital I/O bits) (P1 through P7 and P9 and P10
are bidirectional 8-bit ports, while P8 has an an
input-only bit) - For some other MCUs some ports may be limited to
only input or output - Direction register sets bit direction (PD1, etc.)
- 1 Output
- 0 Input (value of direction register bits after
reset) - Data register holds actual data
- P1 etc.
- M16C62P Hardware Manual, Programmable I/O
Ports
4Programmable I/O Port
5Digital I/O Port as Input
enabled, turns on pull-up when input is 1
0
1
Read direction
1
off
0
0
Read port
disabled
1
off
Read port
enabled
6Digital I/O Port as Output
disabled
1
0
Read direction
1
1
Read port
enabled
0
1
enabled, behave as inverters
Read port
disabled
7Pull-Up Resistors for Inputs
- Used to simplify interfacing with devices with
limited signal swing - M30626 is digital CMOS and is only designed to
operate correctly with valid input voltages
(Everything else is illegal and is not
guaranteed) - Logic 1 0.8 VCC to VCC, Logic 0 0V to 0.2
VCC - Resistor is used to pull up voltage of signal
from devicewith two states - Low resistance to ground
- High resistance (essentially open circuit)
- Pull-up resistor is built into microcontroller to
simplify circuit design and eliminate external
components (save money, space, assembly effort) - M30626 Pull-Ups
- Controlled in blocks of 4 (upper and lower halves
of each port) - Each block is enabled by a bit in PUR0, PUR1 or
PUR2 - Pull-ups disabled if a port bit is configured as
an output - Value typically 120kW, min 66 kW, max 500kW
- M16C62P Hardware Manual, Programmable I/O Ports.
8Example in Assembly P6 Echoes Nibble Data
- Configuring port to desired structure
- Top 4 bits (4-7) of P6 are inputs
- Clear bits 4-7 of PD6
- These inputs need pull-up resistors
- Set bit PU15 of special function register (SFR)
PUR1 to enable pull-ups - Bottom 4 bits of P6 are outputs
- Set bits 0-3 of PD6
Bits 7-4
Port 6
Bits 3-0
Init or.b PU15, PUR1 mov.b 00001111b,
PD6 Loop mov.b P6, R0 read inputs shl.b -4,
R0 move bits 7-4 into 3-0 mov.b R0, P6 write
outputs jmp Loop repeat forever
9C-Level Support for SFR Interfacing
- Renesas has provided C support for MCU special
function registers and special bits in sfr62p.h - Original is in Renesas\QSK62P\Sample_Code\Common
- File is copied into project directory when you
create a new file - Note that these names are lower-case!
- Can treat SFRs (and some bits) as variables
- Examples
- To initialize a GPIO ports direction, set the
port data direction register - pd0 is the name for SFR PD0
- Write all 0s (0x00) to it to make it an input
port - pd0 0x00
- Write all 1s (0xff) to make it an output port
- pd1 0xff
- To read from the port
- data p0
- To write to a port
- p1 data
- Can even access some bits (use names in sfr62p.h)
- p1_1 0
- n p0_7
10Example in C P6 Echoes Nibble Data
include sfr62p.h define DIR_OUT (1) define
DIR_IN (0) unsigned char a pu15 1 / pd6
0xf0 / pd6_0 pd6_1 DIR_OUT pd6_2 pd6_3
DIR_OUT pd6_4 pd6_5 DIR_IN pd6_6 pd6_7
DIR_IN while (1) a p6 a gtgt 4 p6 a
- Reading and writing data
- Load data from input port
- Move top nibble to bottom
- Write data to output port
- Jump back to start
- Now lets invert the data before writing it out
- Load data from input port
- Move top nibble to bottom
- Invert it (complement)
- Write data to output port
- Jump back to start
Bits 7-4
a a
Port 6
Bits 3-0
11Example Application Revisiting the Response Timer
- Requirements
- Measure time delay between when program lights
LED and user presses switch - Display delay on LCD
- Input
- Switch active low, needs pull-up
- Outputs
- LED active low, triggers user
- LCD displays time measurement
- Development plan
- Get a simple program skeleton to compile follow
tutorial 1 or 2 if needed - Verify debugger takes us to main()
- Configure and test LED outputs
- Configure and test switch inputs
- Configure and test LCD
- Create and test time delay measurement function