原创 基于单片机的数字钟程序

2010-10-24 14:06 1871 2 2 分类: MCU/ 嵌入式

汇编语言程序:


DATA_SEG  SEGMENT DATA      ;定义一个DATA段


STACK     SEGMENT IDATA        ;定义一个堆栈段


BIT_SEG   SEGMENT BIT       ;定义一个位段


bKey    BIT  P1.0;


 


IdleConst EQU  50


 


RSEG      STACK


DS  10H            ;16个字节的堆栈


    


RSEG    DATA_SEG       ;开始DATA_SEG段


buffer:   DS 6    ;6个字节的显示缓冲区


ms50:     DS 1       ;50ms计数


ms250:    DS 1    ;250ms计数


sec:    DS 1          ;秒


min:    DS 1          ;分


hour:     DS 1       ;时


ms50_1:   DS 1       ;存放多少个50ms,用于记录按键时间


SetPos:   DS 1       ;设置位置


SetPos1:  DS 1       ;需要屏蔽的数码管


 


RSEG    BIT_SEG


bIdle:    DBIT 1       ;省电模式


bTwinkle: DBIT 1       ;当前设置位置闪烁


 


CSEG    AT 0       ;相当于小汇编的ORG


     LJMP MAIN


 


CSEG    AT 000BH        ;定时器T0中断处理入口地址


     LJMP INT_Timer0


 


CSEG    AT 001BH        ;定时器T1中断处理入口地址


     LJMP INT_Timer1


    


CSEG    AT 0100H  


MAIN:     MOV  SP,#STACK-1    ;堆栈


     CLR  bIdle  


     CLR  bTwinkle


     MOV  ms50,A       ;清零50ms


     MOV  ms250,A


     MOV  hour,#12     ;设定初值:  12:59:50


     MOV  min,#59


     MOV  sec,#50


     MOV  TH0,#3CH     ;定时中断计数器初值


    


MOV  TL0,#B0H     ;定时50ms


     MOV  TMOD,#11H    ;定时器0,1:方式一


     MOV  IE,#8AH      ;中断初始化,EA=1,ET0=1, ET1 = 1


     SETB TR0       ;开定时器T0


     MOV  SetPos,#0FFH   ;


 


 


 


MAIN1:    ACALL   AdjustBuffer   ;调整显示缓冲区


    


MAIN2:    ACALL   Key       ;调用键扫描


     ACALL   Display


     JNB  F0,MAIN2


     CLR  F0


     SJMP MAIN1        ;需要刷新显示时间


                   


;中断服务程序


INT_Timer0:  MOV  TL0,#B5H


     MOV  TH0,#60


     PUSH 01H


     MOV  R1,#ms50


     INC  @R1       ;50ms单元加1


     CJNE @R1,#5,ExitInt


     MOV  @R1,#0       ;恢复初值


     INC  R1


     MOV  A,SetPos


     CJNE A,#0FFH,INT_Timer0_1


     SJMP INT_Timer0_2


INT_Timer0_1:  CPL  bTwinkle


     SJMP ExitInt1


INT_Timer0_2:  INC  @R1


     CJNE @R1,#4,ExitInt


     MOV  @R1,#0       ;恢复初值


     INC  R1


     INC  @R1       ;秒加1


     CJNE @R1,#60,ExitInt1


     MOV  @R1,#0


     INC  R1


     INC  @R1       ;分加1


     CJNE @R1,#60,ExitInt1


     MOV  @R1,#0


     INC  R1


     INC  @R1       ;时加1


     CJNE @R1,#24,ExitInt1


     MOV  @R1,#0


ExitInt1: SETB F0


ExitInt:  POP  01H


     RETI;


 


中断服务程序


 


INT_Timer1:  MOV  TL0,#176+5


     MOV  TH0,#60


     INC  ms50_1


     RETI


    


HexToBCD: MOV  B,#10


     DIV  AB


     MOV  @R0,B


     INC  R0


     MOV  @R0,A


     INC  R0


     RET


 


 


 


 


AdjustBuffer:  MOV  R0,#buffer


     MOV  A,sec


     ACALL   HexToBCD


     MOV  A,min


     ACALL   HexToBCD


     MOV  A,hour


     ACALL   HexToBCD


     RET


 


;显示


Display:  JNB  bIdle,Display3


     RET       ;省电模式


Display3: PUSH B


     PUSH ACC


     PUSH DPL


     PUSH DPH


     PUSH 00H


     MOV  R0,#buffer


     MOV  B,#0FEH


     MOV  DPTR,#SEG_TAB


Display1: MOV  A,@R0


     MOVC A,@A+DPTR ;取段码


     MOV  P0,A


     MOV  A,B


    JNB  bTwinkle,Display4


     ORL  A,SetPos1


Display4: MOV  P2,A    ;选种数码管


     CALL Delay1ms


     MOV  A,B


     RL A


     JNB  ACC.6,Display2


    


 


MOV  B,A


     INC  R0


     SJMP Display1


Display2: POP  00H


     POP  DPH


     POP  DPL


     POP  ACC


     POP  B


     RET


SEG_TAB:  DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H ;段码


     DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH


     DB 0FFH,0BFH  ;延时1ms


Delay1ms: PUSH ACC


     MOV  A,#230


     DJNZ ACC,$


     MOV  A,#230


     DJNZ ACC,$


     POP  ACC


     RET  ;  设置功能


SetFunTab: AJMP NoSet        ;不需要调整


 


 


 


AJMP SetHour      ;调整小时


     AJMP SetMin       ;调整分钟


     AJMP SetSec       ;调整秒钟


NoSet:    CLR  bTwinkle


     RET          ;不在设置状态


SetHour:  INC  hour


     MOV  A,hour


     CJNE A,#24,SetHour1


     MOV  hour,#0


SetHour1: SJMP SetFun1


SetMin:   INC  min


     MOV  A,min


     CJNE A,#60,SetMin1


     MOV  min,#0


SetMin1:  SJMP SetFun1


SetSec:   INC  sec


     MOV  A,sec


     CJNE A,#60,SetFun1


     MOV  sec,#0


SetFun1:  SETB F0


     RET;调整闪烁位置


SetPosTab: AJMP NoSetPos


     AJMP SetHourPos


     AJMP SetMinPos


     AJMP SetSecPos


 


 


NoSetPos: MOV  SetPos1,#0


     RET


SetHourPos:  MOV  SetPos1,#30H


     RET


SetMinPos: MOV  SetPos1,#0CH


     RET


SetSecPos: MOV  SetPos1,#03H


     RET


         


Key:    ACALL   Display


     JNB  bKey,Key4


     JNB  TR1,Key3


     CLR  TR1


     SETB bKey


     MOV  A,ms50_1


     CJNE A,#10,$+3


     JNC  Key1


;调整时间 


SetFun:   MOV  A,SetPos


     INC  A


     RL A


     MOV  DPTR,#SetFunTab


     JMP  @A+DPTR


Key1:     CJNE A,#IdleConst,$+3


     JNC  Key2


;进入设置状态


SetPosFun: INC  SetPos


   



 


MOV  A,SetPos


     CJNE A,#3,SetPosFun1


     MOV  SetPos,#0FFH   ;退出设置状态


SetPosFun1:  MOV  A,SetPos


     INC  A


     RL A


     MOV  DPTR,#SetPosTab


     JMP  @A+DPTR


Key2:     SETB bIdle        ;进入省电模式


     MOV  P2,#0FFH


Key3:     RET


Key4:     JNB  TR1,Key5


     MOV  A,ms50_1


     CJNE A,#IdleConst,$+3


     JNC  Key2


     RET


Key5:     ACALL   Display


     ACALL   Display


     


 


ACALL   Display


     ACALL   Display


     JNB  bKey,Key6


     SJMP Key3


Key6:     CLR  bIdle  


     MOV  TH1,#60


     MOV  TL1,#176


     SETB TR1


     MOV  ms50_1,#0


     RET


     END


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /1 下一条