;特别说明,本程序仅供单片机爱好者自己学习使用,
;不得做为其它商业用途
;此程序在硬件上调试通 ;晶振频率为11.0592MHZ ;用定时器1延时,外部中断0接紧急控制 ;R0为100MS延时常数,R2为状态延时常数 ;8279控制数码管显示时间 ;用P1口控制双色灯 ;此程序写于2007-7-6,作者:徐学军 Z8279 EQU 0FF82H ;8279 状态/命令口地址 D8279 EQU 0FF80H ;8279 数据口地址 LEDMOD EQU 00H ;左边输入 八位字符显示 ;外部译码键扫描方式,双键互锁 LEDFEQ EQU 33H ;扫描速率 LEDCLS EQU 0C1H ;清除显示 RAM LEDWR0 EQU 80H ;设定的将要写入的显示RAM地址 ORG 0000H LJMP START ORG 0003H ;INT 0 中断入口地址 LJMP INT_0 ORG 001BH ;T1中断入口地址 LJMP INT_T1 ORG 0040H START: MOV SP,#60H MOV TMOD,#10H ;置T1为方式1 SETB EX0 ;INT 0 中断有效 SETB IT0 SETB EA MOV TL1,#00H ;延时50mS常数 MOV TH1,#4cH MOV R0,#2 ;延时100mS常数 SETB TR1 ;启动T1 SETB ET1 setb pt1 ;必须设置定时器1的中断优先级高于外部中断0 LCALL INIT8279 ;初始化8279
LCALL STATUS0 ;初始状态(都是红灯) CIRCLE: LCALL STATUS1 ;南北绿灯,东西红灯 LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯 LCALL STATUS3 ;南北红灯,东西绿灯 LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯 LJMP CIRCLE INT_0: PUSH PSW ;保护现场 PUSH 2 PUSH 90H clr ex0 MOV P1,#0FH ;南北,东西都亮红灯 MOV R2,#100 ;延时10秒 LCALL DELAY_DISPLAY setb ex0 POP 90H ;恢复现场 POP 2 POP PSW RETI INT_T1: PUSH ACC PUSH PSW CLR TR1 MOV TL1,#00H ;延时 50mS 常数 MOV TH1,#4CH SETB TR1 DJNZ R0,EXIT MOV R0,#2 ;延时 100ms常数 DEC R2 EXIT: POP PSW POP ACC RETI STATUS0: ;南北红灯,东西红灯 MOV P1,#0FH MOV R2,#10 ;延时1秒 LCALL DELAY_DISPLAY RET STATUS1: ;南北绿灯,东西红灯 MOV P1,#96H ;南北绿灯,东西红灯 MOV R2,#200 ;延时20秒 LCALL DELAY_DISPLAY RET STATUS2: ;南北绿灯闪转黄灯,东西红灯 MOV R3,#03H ;绿灯闪3次 FLASH: MOV P1,#9FH MOV R2,#03H LCALL DELAY_DISPLAY MOV P1,#96H MOV R2,#03H LCALL DELAY_DISPLAY DJNZ R3,FLASH MOV P1,#06H ;南北黄灯,东西红灯 MOV R2,#10 ;延时1秒 LCALL DELAY_DISPLAY RET STATUS3: ;南北红灯,东西绿灯 MOV P1,#69H MOV R2,#200 ;延时20秒 LCALL DELAY_DISPLAY RET STATUS4: ;南北红灯,东西绿灯闪转黄灯 MOV R3,#03H ;绿灯闪3次 FLASH1: MOV P1,#6FH MOV R2,#03H LCALL DELAY_DISPLAY MOV P1,#69H MOV R2,#03H LCALL DELAY_DISPLAY DJNZ R3,FLASH1 MOV P1,#09H ;南北红灯,东西黄灯 MOV R2,#10 ;延时1秒 LCALL DELAY_DISPLAY NOP RET INIT8279: ;8279初始化子程序 PUSH DPH ;保存现场 PUSH DPL PUSH ACC LCALL DELAY ;延时 MOV DPTR ,#Z8279 MOV A,#LEDMOD ;置8279工作方式 MOVX @DPTR,A MOV A,#LEDFEQ ;置键盘扫描速率 MOVX @DPTR,A MOV A,#LEDCLS ;清除 LED 显示 MOVX @DPTR,A LCALL DELAY ;延时 POP ACC ;恢复现场 POP DPL POP DPH RET ;显示字符子程序 ;输入: R4,位置 R5,值 DISLED: PUSH DPH ;保存现场 PUSH DPL PUSH ACC MOV A,#LEDWR0 ;置显示起始地址 ADD A,R4 ;加位置偏移量 MOV DPTR,#Z8279 MOVX @DPTR,A ;设定显示位置 MOV DPTR,#LEDSEG ;置显示常数表起始位置 MOV A,R5 MOVC A,@A+DPTR ;查表 MOV DPTR,#D8279 MOVX @DPTR,A ;显示数据 POP ACC ;恢复现场 POP DPL POP DPH RET DELAY: ;延时子程序 PUSH 0 ;保存现场 PUSH 1 MOV 0,#0H DELAY1: MOV 1,#0H DJNZ 1,$ DJNZ 0,DELAY1 POP 1 ;恢复现场 POP 0 RET DELAY_DISPLAY: ;延时和显示时间子程序 PUSH 1 PUSH 0 push acc loopwait: mov b,#10 mov a,2 div ab mov b,#10 div ab mov r4,#1 mov r5,a LCALL DISLED ;显示秒高位 mov r4,#0 mov r5,b LCALL DISLED ;显示秒低位 mov a,2 jnz loopwait ;延时等待 pop acc POP 0 POP 1 RET LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7' DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F' END
参考链接:http://www.picavr.com/news/2008-01/2745.htm
|