1、单片机的汇编交通灯程序/* 描述: * AT89S52液晶演示 数据p0,控制p2 * 功能: * 万年历、频率计、密码锁、点阵屏 * 作者: * 哥不在江湖 * 技术支持: * 湖南工学院 * * * * * * * * */;*;系统起始程序区 ORG 0000H START: LJMP MAIN ORG 000BH LJMP TIME ORG 001BH LJMP TIME2;*;系统监控程序区 ORG 0030H MAIN: MOV SP, #80H ;确立堆栈区 MOV PSW, #00H ; MOV TMOD, #01H ;定时器初始化,定时器0以工作方式1工作 CLR F0 ;判
2、断表格首地址标志位 CLR EA MOV R0, #20H ;RAM区首地址 MOV R7, #96 ;RAM区单元个数ML: MOV R0, #00H INC R0 DJNZ R7, MLTSF: MOV DPTR, #DISBH ;系统初始化后提示符“P.”字符代码表首地址 MOV R5, #08H MOV R0, #78HDISPTSF:CLR A MOVC A, A+DPTR MOV R0, A INC R0 INC DPTR DJNZ R5, DISPTSFFUN: ACALL DISP ;调显示子程序显示提示符“P.” ACALL KEY ;调用键扫描程序 JB 20H.0, JT
3、 ;S2键按下,则执行交通灯的程序 JB 20H.1, SZAJ2 ;S3键按下,则执行数字按键的程序 LJMP FUNSZAJ2: LJMP SZAJ;*;交通灯程序入口 JT: MOV IE, #82H ;定时器0初始化 MOV TMOD, #01H ;(1秒钟定时) MOV TH0, #3CH MOV TL0, #0B0H MOV R4, #20 CLR 21H.0 CLR TR1 CLR TR0;*; ONE: MOV R3, #15 ;第一个状态,主绿次红 MOV P3, #0DEH ;灯亮, R3为秒计数;*;TSF1: MOV DPTR, #DISBH MOV R5, #08H
4、MOV R0, #78HDISPTSF1:CLR A ;数码管显示缓存区扫描 MOVC A, A+DPTR MOV R0, A INC R0 INC DPTR DJNZ R5, DISPTSF1 MOV 78H, #05H ;数码管显示缓存区付初值 MOV 79H, #01H ;主绿次红,初值15 SETB TR0 ;开定时;*;HA1: ACALL DISP JNB 21H.0, HUI1 CLR 21H.0 ;15秒倒计时程序 DJNZ 78H, HUIQU1 MOV R6, 79H CJNE R6, #00H, TEN LJMP HUIQU1TEN: ACALL DISP JNB 21H
5、.0, TEN MOV 78H, #09H MOV 79H, #00H DEC R3 CLR 21H.0 LJMP HUIQU1HUI1: LJMP HA1HUIQU1: DJNZ R3, HA1;*; CLR TR0 ;第二个状态,主黄次红;*;TWOTWO: MOV IE, #88H ;定时器1初始化 MOV TMOD, #10H ;(0.5秒定时器) MOV TH1, #3CH MOV TL1, #0B0H MOV R4, #10;*; TWO: MOV R3, #5 ;R3还是秒计数 MOV P3, #0DDH ;灯亮;*;TSF2: MOV DPTR, #DISBH MOV R5,
6、#08H MOV R0, #78H ;数码管显示缓存区扫描DISPTSF2:CLR A MOVC A, A+DPTR MOV R0, A INC R0 INC DPTR DJNZ R5, DISPTSF2 ;数码管显示缓存区付初值 MOV 78H, #05H ;主黄次红,初值05 MOV 79H, #00H ;*; CLR 22H.0 SETB TR1 ;开定时器1 MOV R7, #00HHA2: ACALL DISP JNB 22H.0, HA2 ;执行两次0.5秒定时,则计1秒 INC R7 CLR 22H.0 CJNE R7, #02H, HA2 DEC 78H MOV R7, #00
7、H;*; CJNE R3, #4, HUIQU2 ;当倒计时剩下3秒时,执行主行道黄灯闪烁的程序;*;SHAN21: CLR 22H.0LIANG2: JB 22H.0, SHAN22 MOV P3, #0DFH ;主行道闪烁程序 ACALL DISP LJMP LIANG2SHAN22: CLR 22H.0MIE2: JB 22H.0, SHAN2 MOV P3, #0DDH ACALL DISP LJMP MIE2SHAN2: DEC 78H DEC R3 CJNE R3, #1, SHAN21 LJMP TIAO2 HUIQU2: DJNZ R3, HA2HUI2: LJMP HA2TI
8、AO2: NOP;*; CLR TR1 ;第三个状态,主红次绿 CLR TR0 ;定时器的选择SANSAN: MOV IE, #82H MOV TMOD, #01H MOV TH0, #3CH MOV TL0, #0B0H MOV R4, #20 ;*; SAN: MOV R3, #5 MOV P3, #0F3H;*;TSF3: MOV DPTR, #DISBH MOV R5, #08H MOV R0, #78HDISPTSF3:CLR A MOVC A, A+DPTR MOV R0, A INC R0 INC DPTR DJNZ R5, DISPTSF3 MOV 78H, #05H MOV
9、79H, #00H;*; SETB TR0 ;开定时HA3: ACALL DISP JNB 21H.0, HA3 ;5秒倒计时程序 CLR 21H.0 DEC 78H DJNZ R3, HA3;*; CLR TR0 ;选择定时器1,即0.5秒定时器SISI: MOV IE, #88H MOV TMOD, #10H MOV TH1, #3CH MOV TL1, #0B0H MOV R4, #10 ;*; SI: MOV R3, #5 MOV P3, #0EBHTSF4: MOV DPTR, #DISBH MOV R5, #08H MOV R0, #78HDISPTSF4:CLR A MOVC A
10、, A+DPTR MOV R0, A INC R0 INC DPTR DJNZ R5, DISPTSF4 MOV 78H, #05H MOV 79H, #00H CLR 22H.0 SETB TR1 HA4: ACALL DISP JNB 22H.0, HA4 INC R7 CLR 22H.0 CJNE R7, #02H, HA4 DEC 78H MOV R7, #00H ;*; CJNE R3, #4, HUIQU4 ;*;SHAN41: CLR 22H.0LIANG4: JB 22H.0, SHAN42 MOV P3, #0FBH ACALL DISP LJMP LIANG4SHAN42:
11、 CLR 22H.0MIE4: JB 22H.0, SHAN4 MOV P3, #0EBH ACALL DISP LJMP MIE4SHAN4: DEC 78H DEC R3 CJNE R3, #1, SHAN41 LJMP TIAO4 HUIQU4: DJNZ R3, HA4HUI4: LJMP HA4TIAO4: NOP LJMP JT;*; SZAJ: MOV P3, #0FFH ;数据初始化 MOV 78H, #10H MOV 79H, #10H MOV 7AH, #10H MOV 7BH, #10H MOV 7CH, #10H MOV 7DH, #10H MOV 7EH, #10H
12、MOV 7FH, #10HXS: ACALL DISP ACALL KEY JB 20H.0, KEY00 ;是S2键,转KEY00执行 JB 20H.1, KEY11 ;是S3键,转KEY11执行 JB 20H.2, KEY22 ;是S4键,转KEY22执行 JB 20H.3, KEY33 ;是S5键,转KEY33执行 JB 20H.4, KEY44 ;是S6键,转KEY44执行 JB 20H.5, KEY55 ;是S7键,转KEY55执行 JB 20H.6, KEY66 ;是S8键,转KEY66执行 JB 20H.7, KEY77 ;是S9键,转KEY77执行 LJMP OUTKEY00:
13、 LCALL JIAOHUAN MOV 7FH, #00H LCALL DISP LJMP OUTKEY11: LCALL JIAOHUAN MOV 7FH, #01H LCALL DISP LJMP OUT KEY22: LCALL JIAOHUAN MOV 7FH, #02H LCALL DISP LJMP OUTKEY33: LCALL JIAOHUAN MOV 7FH, #03H LCALL DISP LJMP OUTKEY44: LCALL JIAOHUAN MOV 7FH, #04H LCALL DISP LJMP OUTKEY55: LCALL JIAOHUAN MOV 7FH,
14、 #05H LCALL DISP LJMP OUTKEY66: LCALL JIAOHUAN MOV 7FH, #06H LCALL DISP LJMP OUTKEY77: LCALL JIAOHUAN MOV 7FH, #07H LCALL DISP OUT: LJMP XSTIME: MOV TH0, #3CH MOV TL0, #0B0H DEC R4 CJNE R4, #0, ZHUAN SETB 21H.0 MOV R4, #20 ZHUAN: RETITIME2: MOV TH1, #3CH MOV TL1, #0B0H DEC R4 CJNE R4, #0, ZHUAN2 SET
15、B 22H.0 MOV R4, #10 ZHUAN2: RETIDISBH: DB 11H,10H,10H,10H,10H,10H,10H,10H,10H ;提示符“P.”字符序号;显示字符段选码表(共阳极代码)TAB: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H ;0-8 DB 90H, 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH ;9,A,B,C,D,E,F,灭,p.;*;键扫描子程序KEY: LCALL KEYCHULI ;调P1口数据处理子程序 JZ EXIT ;没有键按下,转返回 LCALL DISP ;调显示子
16、程序去抖动 LCALL DISP LCALL KEYCHULI ;调P1口数据处理子程序 JZ EXIT ;没有键按下,转返回 MOV B, 20H ;保存取反后的键值KEYSF: LCALL KEYCHULI ;调P1口数据处理子程序 JZ KEY1 ;键释放,则将键值转移并保存 LCALL DISP ;调显示子程序延时 LJMP KEYSF ;等待释放KEY1: MOV 20H, B ;键值送20H保存EXIT: RET ;子程序返回;P1口按键数据处理子程序KEYCHULI: PUSH PSW ;保护现场 CLR RS1 ;改变当前寄存器组为组1 SETB RS0 MOV P1, #0F
17、FH ;先向P1口写1 MOV A, P1 ;读P1口数据 CPL A ;P1口数据取反 MOV 20H, A ;保存取反后的键值 CLR RS1 ;恢复当前寄存器组为组0 CLR RS0 POP PSW ;恢复现场 RET ;子程序返回;数码管显示子程序DISP;入口:7FH,7EH,7DH,7CH,7BH,7AH,79H,78H (LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0) DISP: PUSH DPH PUSH DPL PUSH ACC PUSH PSW CLR RS1 ;改变当前寄存器组为组1 SETB RS0 MOV R1, #78H ;显示缓冲
18、存储单元首地址 MOV R2, #0FEH ;从右至左显示 MOV R5, #08H ;循环次数,即驱动数码管的位数 DISP1: MOV A, R1 MOV DPTR, #TAB MOVC A, A+DPTR MOV P0, A ;送段控 MOV P2, R2 ;送位控 LCALL DL MOV A, R2 ;延时1毫秒 RL A ;获得新的位控码 MOV R2, A ;保存新的位控码 INC R1 ;获得新的显示缓冲单元地址 DJNZ R5, DISP1 ;循环没有结束则继续 DISP2: POP PSW ;恢复当前寄存器组的组号 POP ACC POP DPL POP DPH RET;延时1ms子程序(晶振频率12MHz)DL DL: MOV R7, #02H DL1: MOV R6, #0FFH DL2: DJNZ R6, DL2 DJNZ R7, DL1 RET ;将78至7EH单元的内容交换子程序JIAOHUAN: MOV 78H, 79H MOV 79H, 7AH MOV 7AH, 7BH MOV 7BH, 7CH MOV 7CH, 7DH MOV 7DH, 7EH MOV 7EH, 7FH RET END
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1