Shorthand expansion exercise from K & R C (ex 3-3)
Here are some comments regarding your code:


Using s1[i+2] and s1[i-1] can possibly refer to memory locations outside of allocated memory
Inside of expand() you use the restriction of MAXLEN which is not conveyed in the parameters, which should be like char s1[MAXLEN] (which also introduces different strange aspect of the c-language). As your code stands now you can easily call it with char fails[2]; expand(fails, fails)
You should also test for null before accessing input parameters, currently you can call expand(input, 0) and it will happily try to do something which will fail
You are better of to always include braces around blocks within if-else statements to avoid erroneous indentation errors
Give s1 and s2 proper names to indicate what they are    
You'll possibly get into problems or unwanted behaviour, with input like z-0, a-00--a, Z-0, --[
The range a-a will give count = DOWN, and behave somewhat strangely


Regarding the brace comment, consider the following code snippet:

int a = 13; int b = 5;
if (a &lt; b)
   a = a + 10;
   if (a &gt; b)
      a = 5;
else
   b = 6;


What will a and b hold now? Correct answer is a=5, b=5. If surrounding the blocks with braces the code would behave like you possibly read it, indicating the correct response of a=13, b=6. This is a constructed example, but it does happen way to often in real life that someone indents the code wrongly and strange things happen.

Here is the code example again, using starting braces on the same line, many prefer them to be on a new line. Choose a style, and stick to it.

int a = 13; int b = 5;
if (a &lt; b) {
   a = a + 10;
   if (a &gt; b) {
      a = 5;
   }
} else {
   b = 6;
}