1、1、倒计时交通灯源程序:CMD_8279 EQU 0BF01DATA_8279 EQU 0BF00ORG OOOOHLJMP MAINORG 000BHLJMP INT_T0ORG 0040HMAIN: MOV SP,#50H LCALL INIT8279MOV 30H,#16MOV 31H,#16MOV 20H,#0MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HMOV IE,#82HCLR TR0MOV 40H,#00H;主循环用于检测有没有键按下,并取键值STAR: LCALL DISPLAYSTAR0: LCALL SCAN_KEYJNC STAR0STAR
2、1: LCALL KEY_NUMCJNE A,#0AH,NEQMOV A,30HSWAP AADD A,31HMOV 50H,ALCALL JIAOTONGNEQ: JNC KEY_BSJMP DATAKEYKEY_B: CJNE A,#0BH,STAR0SETB 20H.1LJMP STARDATAKEY:MOV 30H,31HMOV 31H,ALJMP STAR;交通灯控制程序 JIAOTONG:MOV P1,#7EHLCALL DISPLAY30SJB 20H.1,MAINMOV P1,#0BDHLCALL DISPLAY2SJB 20H.1,MAINMOV P1,#0DBHLCALL
3、DISPLAY30SJB 20H.1,MAINMOV P1,#0BDHLCALL DISPLAY2SJB 20H.1,MAINSJMP JIAOTONG;8279 初始化程序INIT8279:MOV DPTR,#CMD_8279MOV A,#34HMOVX DPTR,AMOV A,#90HMOVX DPTR,AINIT8279_1:LCALL CLEARMOV A,#90HMOVX DPTR,ARETCLEAR: MOV A,#0DEHMOV DPTR,#CMD_8279MOVX DPTR,AWAIT1: MOVX A,DPTRJB ACC.7,WAIT1RET;扫描键盘并取键值子程序;键值存
4、放在 A 中SCAN_KEY:MOV DPTR,#CMD_8279MOVX A,DPTRREAD_FIFO:ANL A,#7JZ NO_KEYREAD: MOV A,#40HMOVX DPTR,AMOV DPTR,#DATA_8279MOVX A,DPTRSETB CSCAN_KEY1:RETNO_KEY: CLR CSJMP SCAN_KEY1KEY_NUM:ANL A,#3FHRET;显示子程序DISPLAY:PUSH 07HMOV R0,#30HMOV DPTR,#LED_TABMOV P2,#0BFHMOV R1,#01HMOV A,#90HMOVX R1,AMOV R1,#00HMO
5、V R7,#2DISPLAY1:MOV A,R0MOVC A,A+DPTRMOVX R1,AINC R0DJNZ R7,DISPLAY1POP 07HRET;共阳极 LED 字形码表LED_TAB: DB 0C0H,0F9H,0A4H,0b0h,99h,92h,82h,0f8h;DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH;DB 0FFH;中断服务子程序INT_T0: PUSH ACCMOV TH0,#3CHMOV TL0,#0B0HINC 40HMOV A,40HCJNE A,#20,INT_T01MOV 40H,#00HCLR CCLR AMOV A,#9AH
6、SUBB A,#01HADD A,60HDA AMOV 60H,AINT_T01: POP ACCRETI;延时 30S 并显示子程序DISPLAY30S:MOV 60H,50HLCALL DECSECRET;延时 2S 并显示子程序DISPLAY2S:MOV 60H,#02HLCALL DECSECRET;自减 1 子程序DECSEC: SETB TR0MOV A,60HMOV R0,#31HLCALL P_BCDLCALL DISPLAYLCALL SCAN_KEYJC XIUGAICONTINUE:MOV A,60HCJNE A,#00H,DECSECMOV R0,#31HLCALL P
7、_BCDLCALL DISPLAYSJMP OUTOUT: RET;拆字子程序P-BCD: MOV R0,AANL A,#0FHXCH A,R0DEC R0SWAP AANL A,#0FHMOV R0,ADEC R0RETENDZ8279 EQU 0FF82H ;8279 状态/命令口地址D8279 EQU 0FF80H ;8279 数据口地址LEDMOD EQU 00H ;左边输入 八位字符显示;外部译码键扫描方式,双键互锁LEDFEQ EQU 33H ;扫描速率LEDCLS EQU 0C1H ;清除显示 RAMLEDWR0 EQU 80H ;设定的将要写入的显示 RAM 地址ORG 000
8、0HLJMP STARTORG 0003H ;INT 0 中断入口地址LJMP INT_0ORG 001BH ;T1 中断入口地址LJMP INT_T1ORG 0040HSTART:MOV SP,#60HMOV TMOD,#10H ;置 T1 为方式 1 SETB EX0 ;INT 0 中断有效SETB IT0SETB EA MOV TL1,#00H ;延时 50mS常数MOV TH1,#4cHMOV R0,#2 ;延时 100mS常数SETB TR1 ;启动 T1SETB ET1setb pt1 ;必须设置定时器1 的中断优先级高于外部中断 0LCALL INIT8279 ;初始化 8279
9、LCALL STATUS0 ;初始状态(都是红灯)CIRCLE:LCALL STATUS1 ;南北绿灯,东西红灯LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯LCALL STATUS3 ;南北红灯,东西绿灯LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯LJMP CIRCLEINT_0:PUSH PSW ;保护现场PUSH 2PUSH 90H clr ex0 MOV P1,#0FH ;南北,东西都亮红灯 MOV R2,#100 ;延时 10 秒LCALL DELAY_DISPLAYsetb ex0POP 90H ;恢复现场 POP 2POP PSWRETIINT_T1:PUS
10、H ACCPUSH PSWCLR TR1MOV TL1,#00H ;延时 50mS 常数MOV TH1,#4CH SETB TR1DJNZ R0,EXITMOV R0,#2 ;延时 100ms常数DEC R2EXIT:POP PSWPOP ACCRETISTATUS0: ;南北红灯,东西红灯 MOV P1,#0FH MOV R2,#10 ;延时 1 秒LCALL DELAY_DISPLAYRETSTATUS1: ;南北绿灯,东西红灯 MOV P1,#96H ;南北绿灯,东西红灯 MOV R2,#200 ;延时 20 秒LCALL DELAY_DISPLAYRETSTATUS2: ;南北绿灯闪转
11、黄灯 ,东西红灯 MOV R3,#03H ;绿灯闪 3 次FLASH:MOV P1,#9FH MOV R2,#03HLCALL DELAY_DISPLAYMOV P1,#96H MOV R2,#03HLCALL DELAY_DISPLAYDJNZ R3,FLASHMOV P1,#06H ;南北黄灯,东西红灯 MOV R2,#10 ;延时 1 秒LCALL DELAY_DISPLAYRETSTATUS3: ;南北红灯,东西绿灯 MOV P1,#69H MOV R2,#200 ;延时 20 秒LCALL DELAY_DISPLAYRETSTATUS4: ;南北红灯,东西绿灯闪转黄灯 MOV R3,
12、#03H ;绿灯闪 3 次FLASH1:MOV P1,#6FH MOV R2,#03HLCALL DELAY_DISPLAYMOV P1,#69H MOV R2,#03HLCALL DELAY_DISPLAYDJNZ R3,FLASH1MOV P1,#09H ;南北红灯,东西黄灯 MOV R2,#10 ;延时 1 秒LCALL DELAY_DISPLAYNOPRETINIT8279: ;8279 初始化子程序PUSH DPH ;保存现场PUSH DPLPUSH ACCLCALL DELAY ;延时MOV DPTR ,#Z8279MOV A,#LEDMOD ;置8279 工作方式MOVX DPT
13、R,AMOV A,#LEDFEQ ;置键盘扫描速率MOVX DPTR,AMOV A,#LEDCLS ;清除 LED 显示MOVX DPTR,ALCALL DELAY ;延时POP ACC ;恢复现场POP DPLPOP DPHRET;显示字符子程序;输入: R4,位置 R5,值DISLED:PUSH DPH ;保存现场PUSH DPLPUSH ACCMOV A,#LEDWR0 ;置显示起始地址ADD A,R4 ;加位置偏移量MOV DPTR,#Z8279MOVX DPTR,A ;设定显示位置MOV DPTR,#LEDSEG ;置显示常数表起始位置MOV A,R5MOVC A,A+DPTR ;查
14、表MOV DPTR,#D8279MOVX DPTR,A ;显示数据POP ACC ;恢复现场POP DPLPOP DPHRETDELAY: ;延时子程序PUSH 0 ;保存现场PUSH 1MOV 0,#0HDELAY1:MOV 1,#0HDJNZ 1,$DJNZ 0,DELAY1POP 1 ;恢复现场POP 0RETDELAY_DISPLAY: ;延时和显示时间子程序 PUSH 1PUSH 0push accloopwait: MOV b,#10MOV a,2div abMOV b,#10div ab MOV r4,#1MOV r5,aLCALL DISLED ;显示秒高位MOV r4,#0MOV r5,bLCALL DISLED ;显示秒低位MOV a,2jnz loopwait ;延时等待pop acc POP 0POP 1 RETLEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0,1,2,3,4,5,6,7DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8,9,A,B,C,D,E,F END