当前位置 - 股票行情交易網 - 裝修設計 - 用匯編做lcd數字時鐘(單片機)

用匯編做lcd數字時鐘(單片機)

#include<at89x52.h>#define uchar unsigned char //0~255

#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;}