Python 2, 66 55 Bytes
This should really have been the most obvious approach to me..
a='0123456789ABCDEF'
for x in a:
for y in a:print x+y
Old (66 Bytes): Technically this causes an error after FF
, but it does reach 30
.
n=1;a='0123456789ABCDEF'
while 1:print a[n/16]*(n>15)+a[n%16];n+=1
I assumed string formatting wasn't allowed since I'm pretty sure it would go through base conversion, but if it was allowed, this would be 29 bytes:
n=1
while 1:print"%x"%n;n+=1