闪耀的空白 发表于 2013-4-20 23:29:55

帮忙看看,

HOUR EQU 40H         ;小时变量
MIN EQU        41H            ;分钟变量
SEC EQU        42H            ;秒变量
HOUR_1 EQU 50H         ;小时BCD码个位
HOUR_2 EQU 51H         ;小时BCD码十位
MIN_1 EQU 52H          ;分钟BCD码个位
MIN_2 EQU 53H          ;分钟BCD码十位
SW1 BIT P3.2         ;小时加1按键
SW2 BIT P3.3         ;分钟加1按键
ORG 0000H
LJMP START             ;转移到初始化程序
ORG 000BH
LJMP CT0S            ;到定时器0的中断服务程序
ORG 0030H
START:                         ;初始化部分
MOV HOUR,#12         ;初始时间12:00
MOV MIN,#00
MOV R3,#20             ;初始化R3(20次50ms的中断)
MOV TMOD,#01H          ;初始化T0定时器,T0工作方式1 ,定时50ms
MOV TH0,#04BH          ;送定时器初值
MOV TL0,#0FFH
SETB EA                ;开总中断
SETB ET0               ;开定时器0中断
SETB TR0               ;启动定时器
MAIN:   
LCALL KEYPRESS         ;调按键处理子程序
LCALL BCD8421          ;调BCD码转换子程序
LCALL DISPLAY          ;调显示子程序
LJMP MAIN
;***************************************************
DELAY:MOV R7,#255            ;延时子程序
D2:   DJNZ R7,D2
RET
;***************************************************
KEYPRESS:                            ;按键处理子程序,p3.2、P3.3为按键的接口
SETB SW1               ;设置为输入
JB SW1,KEY1            ;按键没有按下,查询下一按键
LCALL DELAY            ;若按下,延时去抖
JB SW1,KEY1
MOV A,HOUR             ;小时变量送A
INC A                  ;小时数加1
MOV HOUR,A             ;保存小时数
CJNE A,#24,KEY0      ;如果不等于24,等待按键释放
MOV HOUR,#00H          ;如果等于24,则使小时变量送0
KEY0:   LCALL DISPLAY           ;调显示起延时去抖作用,保证扫描显示不停止
JNB SW1,KEY0         ;没有释放,继续等待
LCALL DISPLAY      
JNB SW1,KEY0      
KEY1:   SETB SW2
JB SW2,KRET
LCALL DELAY
JB SW2,KRET
MOV A,MIN
INC A                  ;分钟变量加1
MOV MIN,A
CJNE A,#60,KEY10           ;如果不等于60,等待按键释放
MOV MIN,#00H         ;如果等于60,则使分钟变量送0
KEY10:LCALL DISPLAY
JNB SW2,KEY10
LCALL DISPLAY
JNB SW2,KEY10
KRET:   RET
;**************************************************
CT0S:        ;走时部分。延时1s,秒加1,秒满60分钟加1,分钟满60小时加1
PUSH ACC               ;保护现场
MOV        TH0,#04BH          ;重新送定时器初值
MOV        TL0,#0FFH
DJNZ R3,TIMEEND      ;中断次数不足20次直接返回
MOV        R3,#20             ;中断次数满20次为1秒,重新送计数初值
MOV        A,SEC            ;秒增加1
INC A
MOV        SEC,A
CJNE A,#60,TIMEEND   
MOV        SEC,#00H
MOV        A,MIN            ;满60秒,分钟加1
INC A
MOV        MIN,A
CJNE A,#60,TIMEEND
MOV MIN,#00H
MOV        A,HOUR             ;满60分,小时加1
INC A               
MOV        HOUR,A
CJNE A,#24,TIMEEND
MOV        HOUR,#00H
TIMEEND:POP ACC                        ;恢复现场
CPL P2.4
RETI
;*********************BCD码转换子程序,变量不大于60,没有百位
BCD8421:MOV A,HOUR
MOV B,#0AH
DIV AB               ;除以10,商为十位,余数为个位
MOV HOUR_2,A
MOV HOUR_1,B
MOV A,MIN
MOV B,#0AH
DIV AB
MOV MIN_2,A
MOV MIN_1,B
RET
;*****************************************************************
DISPLAY:        ;以下是显示子程序,P1口输出段码,P2口输出位码
MOV        P2,#00H            ;显示小时的部分
MOV        DPTR,#CHAR
MOV        A,HOUR_2
MOVC A,@A+DPTR
MOV        P1,A
MOV P2,#0FDH
LCALL DELAY
MOV        A,HOUR_1
MOVC A,@A+DPTR
MOV        P1,A
MOV P2,#0FEH
LCALL        DELAY
MOV        A,MIN_2                 ;显示分钟的部分
MOVC A,@A+DPTR
MOV        P1,A
MOV P2,#0F7H
LCALL DELAY
MOV        A,MIN_1
MOVC A,@A+DPTR
MOV        P1,A
MOV P2,#0FBH
LCALL DELAY
RET
CHAR:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳型字型码表
END


秒是用led灯的显示的,小时和分钟用数码管,数码管可以正常显示,就是led灯闪烁的太快了、、、

闪耀的空白 发表于 2013-4-20 23:30:23

秒是用led灯的显示的,小时和分钟用数码管,数码管可以正常显示,就是led灯闪烁的太快了、、、

绿茶山人 发表于 2013-4-22 09:13:20

这么多汇编看的头麻。楼主为什么不用C写?

tongdayusu 发表于 2013-4-22 09:22:37

楼主标题似乎不大合格。

huangshuyi 发表于 2013-4-22 09:26:44

这是什么处理器咯

xyz543 发表于 2013-4-22 09:37:29

我回帖是请楼主能珍惜自己的 ID 号,您这程序的问题我不是很了解,但请楼主先详阅这帖 论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读 再好好的修正您的标题. 保证您可得到永生.. {:smile:}

闪耀的空白 发表于 2013-4-22 12:21:48

89c51啊。。。。

zjk 发表于 2013-4-22 14:40:42

擦,汇编的啊,木有办法
页: [1]
查看完整版本: 帮忙看看,