这个道题要注意的地方是:要避免锁存器中P0口复用的问题,每次用了之后都要把P2口前三位置零,等到下一次要用时再重新打开。
void SELECT_HC138(unsigned char n,unsigned char dat)
{
P2=(P2&0x1f)|0x00;
P0=dat;
switch(n)
{
case 4: P2=(P2&0x1f)|0x80; break;
case 5: P2=(P2&0x1f)|0xa0; break;
case 6: P2=(P2&0x1f)|0xc0; break;
case 7: P2=(P2&0x1f)|0xe0; break;
}
P2=(P2&0x1f)|0x00;//将前三位置1
}
其余的就是很基础的问题,参考代码如下:
#include <STC12C5A60S2.H>
sbit L1 = P1^0;
sbit L2 = P1^1;
sbit L8 = P1^7;
unsigned char dat1 = 0xff;
unsigned char code smgduanma[18]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0x88,0x80,
0xc6,0xc0,0x86,0x8e,0xbf,0x7f
};
void smgDisplay();
unsigned char lightnum=0;
unsigned char lednum=0;
void SELECT_HC138(unsig