简易电子棋盘程序设计 ORG 0000H AJMP MAIN ORG 000BH AJMP ONEWIN ORG 001BH AJMP RING ORG 0030H ;****************定时器T1 中断子程序 RING: INC R0 CJNE R0,#7FH,RETU SETB P1.2 ;若等待8 秒未按键,则蜂鸣器响 MOV R0,#0 RETU: RETI ;*******************主程序 MAIN: CLR P1.0 ;所有T 触发器复位,所有LED 熄灭 MOV TMOD,#10H MOV TH1,#0 MOV TL1,#0 SETB EA ;中断允许 SETB ET1 ;开定时中断1 SETB ET0 ;开定时中断0 SETB P1.0 ;置位P1.0,T 触发器有效,可以点亮LED MOV DPTR,#7FFFH ;键盘端8255A 初始化 MOV R0,0 ;R0 初始化 MOV A,#90H ;A 口输入模式,B 口输出模式 MOVX @DPTR,A MOV DPTR,#BFFH ;LED 端8255A 初始化 MOV A,#80H ;A、B 口均为输出模式 MOVX @DPTR,A ` SETB TR1 ;开始计时 KEYSCAN:ACALL IFPRESS ;检查是否有按键按下 JZ KEYSCAN ;若无按键按下,返回KEYSCAN 继续等待 ACALL D10MS ;若有按键,延时10ms去抖动处理 ACALL IFPRESS ;再次检查是否有按键 JZ KEYSCAN ;无按键按下,返回KEYSCAN 继续等待 KEY1: MOV R2,#0FEH ;使第0 行为低电平 MOV R5,#00H ;行寄存器清0 KEY2: MOV DPTR,#7FFDH ;扫描行 MOV A,R2 MOVX @DPTR,A MOV DPTR,#7FFCH ;扫描列 MOVX A,@DPTR CPL A ;按键对应位置为1 ANL A,#0FFH JNZ KEY3 ;该行有键按下,转KEY3 MOV A,R5 ;无键按下,行值寄存器R5 加1 ADD A,#01H MOV R5,A MOV A,R2 ;该行无键按下,下一行置为低电平 RL A MOV R2,A JB ACC.0,KEY2 ;8 行未全部扫描完,转KEY2 继续扫描 AJMP KEYSCAN ;8 行已扫描完,转KEYSCAN 等待下一次按键 KEY3: MOV R4,A ;将按键列值(按键为1)存入 R4 CPL A KEY4: ACALL D10MS ACALL IFPRESS JNZ KEY4 ;等待按键释放,避免按一次键重复计算 CLR P1.2 ;关闭蜂鸣器 MOV TH1,#0 ;定时器1 清零 MOV TL1,#0 MOV R0,#0 ;计数寄存器R0 清零 MOV A,R2 CPL A MOV R2,A ;按键对应行值(按键为1)存入 R2 ;*********************点亮 LED 灯 LIGHT: CPL P1.1 ;P1.1 高电平绿灯亮,低电平红灯亮 MOV DPTR,#BFFCH ;按键对应LED 列置1 MOV A,R4 MOV @DPTR,A MOV DPTR,#BFFDH ;按键对应LED 行置1 MOV A,R2 MOV...