A variable that hasn't been assigned a value is NULL. Never compare anything with NULL - such a test (whether it's IF, where WHEN in a CASE expression, where WHERE in a SQL filter, always evaluates to false (even when inverted with !=, <>, NOT, etc.). hence the ELSE branch, which is for test failures or falseness, will be executed.
NULL isn't a value, it means we don't know the value - if we did, it may or may not satisfy the test expression, so Oracle always makes such tests fail. Instead, use IS NULL to check for nullness, or use NVL to change it some dummy value so you can perform the test with only one expression:
DECLARE
l_tmp VARCHAR2(3);
BEGIN
IF NVL(l_tmp,' ') <> 'ABC' THEN
dbms_output.put_line('Not ABC');
ELSE
dbms_output.put_line('ABC');
END IF;
END;
It should be noted that DECODE is an exception to the normal rule: you can compare against NULL as if it were a distinct value: SELECT DECODE(null,null,'is null','is not null') FROM dual will return is null. But just about every other function (such as case) and expression requires that we explicitly handle NULLs as a special case. Either NVL or COALESCE get used quite frequently to do just that.