当前位置:首页 > 《单片机原理及应用》实验指导书
{ uchar data key_temp; }
//==========================================================================
void timer_0(void) interrupt 1 {
static uchar data keylong;
key_temp=(~P1)&0x0f;
if(key_temp==0) { key_new=key_temp; keylong=0; key_on=0; else if(key_new!=key_temp)
{ key_new=key_temp;key_on=0; key_again=0; keylong=1;} else if(keylong<4) { key_on=0; key_again=0; keylong++;} else if(keylong==4) { key_on=1; key_again=1; keylong++;} else if(keylong>200) { key_on=0; key_again=1; keylong=170;} else { keylong++;}
key_again=0;}
code uchar
TAB1[]={0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60};
code uchar TAB2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; static uchar dsp[8]; static uchar n; TH0=(65536-2304)/256; TL0=(65536-2304)%6; delay_time++;
if(++count==400) { }
30
//设置定时器初值,2.5ms中断一次
++sec; count=0; NewTime=1; if(sec==60) if(min==60)
{++min; {++hour;
sec=0;} min=0;}
if(hour==24) {hour=0;}
}
dsp[0]=TAB1[hour/10]; dsp[1]=TAB1[hour]; dsp[2]=0xf7; dsp[3]=TAB1[min/10]; dsp[4]=TAB1[min]; dsp[5]=0xf7; dsp[6]=TAB1[sec/10]; dsp[7]=TAB1[sec];
n++; n%=8;
P0=dsp[n]; P2=TAB2[n];
if((count)==0) keyscan();
//========================================================================
void delay(uint t) { EA = 0; }
delay_time = 0; EA = 1;
while(delay_time 五、思考题 1. 给电子钟加上打铃的功能,打铃时间固定。 2. 给电子钟加上打铃时间调节功能。如何实现多点(4个)打铃功能? 附:电子钟汇编参考程序,不含按键检测和整点提示功能。 LED_PORT EQU SCN_PORT EQU P0 P2 ;笔划输出,低有效 ;段扫描输出,低有效(P2.4-P2.7) DSEG 31 ORG 10H 8 1 1 2 ;显示缓冲区 ;扫描指针 ;扫描码 ;中断计数,每2.5ms加1 DISP_BUF: DS SCN_INX: DS SCN_COD: DS CNT: DS CSEG ORG 00H LJMP MAIN ORG 0BH ;主程序入口,转初始化程序 ;定时中断0入口 ;每2.5ms中断一次,用于刷新显示 LJMP INTP0 ORG 30H MOV CLR CLR CLR MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV SCN_INX,A TMOD,#01H A CNT+0,A CNT+1,A SP,#50H RS0 RS1 ;-----------初------始-----化--------------------------------- MAIN: ;初始化堆栈指针 ;选用第0组通用寄存器 CLR P1.5 DISP_BUF+0,#2 DISP_BUF+1,#3 DISP_BUF+2,#10 DISP_BUF+3,#5 DISP_BUF+4,#8 DISP_BUF+5,#10 DISP_BUF+6,#0 DISP_BUF+7,#0 32 ;时十位 ;时个位 ;显示'-' ;分十位 ;分个位 ;显示'-' ;秒十位 ;秒个位 ;扫描指针置0 ;右边LED先点亮 ;定时器0,方式1 MOV SCN_COD,#80H MOV MOV TH0,#0F7H MOV TL0,#000HSETB TR0 SETB SETB SJMP PUSH PUSH EA ET0 $ ACC PSW ;计数初值,每次 2.5ms(11.0592MHz晶振) ;65536-(2.5ms/1.085us)=65536-2304=63232=0F700H ;启动定时器0 ;中断总允许 ;允许定时器0中断 ;主程序在此循环 ;-----------定时器0中断服务程序,间隔2.5ms-------------- INTP0: MOV TH0,#0F7H MOV TL0,#00H SETB CLR MOV ANL ADD MOV MOV MOV ANL A,SCN_INX A,#07H A,#DISP_BUF R1,A A,@R1 RS0 RS1 ;置计数初值 ;选用第1组通用寄存器 ;取扫描指针 ;清除高5位 ;加显示缓冲区首地址 DPTR,#CODE_TAB A,#0FH ;DPTR指向笔划代码表 ;取笔划代码 ;笔划代码送LED口 ;取扫描段代码 MOVC A,@A+DPTR MOV LED_PORT,A MOV MOV A,SCN_COD P2,A A,SCN_COD MOV RR A 33 ;扫描段代码循环右移一位 ;扫描指针+1 MOV INC SCN_COD,A SCN_INX
共分享92篇相关文档