用匯編做lcd數字時鐘(單片機)
#define uint unsigned int //0~65535
#define ulong unsigned long //0~4294967295sbit gewei=P2^3;
sbit shiwei=P2^2;
sbit baiwei=P2^1;
sbit qianwei=P2^0;num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar keytable[16]={0x0A,0x0B,0x0C,0x0D,0x03,0x06,0x09,0x0E,0x02,0x05,0x08,0x0F,0x01,0x04,0x07,0x00};//鍵值表
uchar minute=0;
uchar hour=0;
uint m=0;
/*************延時Xms*****************/
void delay_xms(unsigned int m) //延時程序
{ unsigned int i,j;
for(i=m;i>0;i--)
for(j=122;j>0;j--);
}
/**********初使化****************/
void init()
{
P1=0xf0;
EX0=1;
TMOD=0x01;
TH0=0x3c;
TL0=0x3c;
ET0=1;
TR0=1;
EA=1;
}
/****************等待釋放鍵盤***************/
uchar testkey()
{
P1=0xf0;
return(~P1&0xf0);}
/************主函數***************/
void main()
{
init();
while(1)
{
P0=num[hour/10];
qianwei=0;
delay_xms(8);
qianwei=1;
P0=num[hour%10];
baiwei=0;
delay_xms(8);
baiwei=1;
P0=num[minute/10];
shiwei=0;
delay_xms(8);
shiwei=1;
P0=num[minute%10];
gewei=0;
delay_xms(8);
gewei=1;
}
}
void table()interrupt 0
{
uchar sccode,recode,keycode,linenum,jianma,rownum=0x00;//rownum為列值計數器,置初值為0
sccode=0xfe;
delay_xms(10);
if(INT0==1){keycode=0xff;return;}//若此時中斷引腳為高電平,則是抖動,返回值為 00xff,改為if((PC8255&0x0f)!=0x0f)(的確有鍵按下)
while(P1!=0xf0)//確保掃描次數,確保C口高四位輸出掃描碼
{
P1=sccode;
if((P1&0xf0)!=0xf0)//本列有鍵按下
{
recode=P1&0xf0;
recode=recode>>4;
recode=recode^0x0f;
if(recode==0x01)linenum=0x00;
else if(recode==0x02)linenum=0x04;
else if(recode==0x04)linenum=0x08;
else if(recode==0x08)linenum=0x0c;
jianma=linenum+rownum;//求得相對於keytable的地址偏移量
while(testkey());//等待按鍵釋放,函數delay的參數可以在實際調試時確定
keycode=keytable[jianma];//從鍵值表中查得鍵值
} else
{
sccode=(sccode<<1)|0x01;//列掃描碼左移壹位
rownum++;//列值計數器加1
}
}
switch(keycode)
{
case 0x01:if(hour<24)
hour++;
else
hour=0;
break;
case 0x04:if(hour==0)hour=23;
else
hour--;
break;
case 0x02:if(minute<60)
{minute++;<br> m=0;}
else
{minute=0;<br> m=0;}
break;
case 0x05:if(minute==0)
{minute=59;<br> m=0;}
else
{minute --;<br> m=0;}
break;
}
}
/*****************定時函數******************/
void Time_xms()interrupt 1
{
TR0=0;
m++;
if(m==50)
//if(m==10)
{
m=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour>23)
hour=0;
}
}
TH0=0x3c;
TL0=0x3c;
TR0=1;}