独立按键汇编程序
单片机独立按键识别实验报告

桂林电子科技大学
实验报告
2016-2017 学年第一学期
开课单位海洋信息工程学院
适用年级、专业 14级机械设计制造及其自动化
课程名称《单片微型计算机与接口技术-课内实验》
主讲教师周旋
课程序号 BS1615000_03
课程代码 BS1615000 实验名称《独立按键识别》
学号 1416010516 - 17 姓名林亦鹏卢炳荣
独立按键识别实验报告
电路采用无源蜂鸣器,从P1.5口形成脉冲来驱动。
因为单片机开机初始化瞬间,其I/O口为高电平,会有误响动作。
单片机的独立键盘使用的是P1口。
当有键按下时,P1口相应位为低电平。
、查找资料说明按键抖动的原因。
、延时程序是怎么实现延时的?
定义蜂鸣器的连接端口--//。
单片机按键连按长按汇编程序

单片机按键连按长按汇编程序;=============================================================== ;程序编写人:兰建文;编写地点:51hei培训机构;时间:6月7日下午星期日;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时;刻,任何一个按键,若按键连续按键3次,每次间隔时间不大于1秒,循;环显示0到9回到0。
若间隔时间大于1秒,显示加1,低电平亮;P2口实现对数码管的片选功能;=============================================================== ;==========================系统程序============================= ;=========================开始初始化============================ SHUCHU EQU P0 ;定义P0口为输出口PIANXUAN EQU P2 ;定义P2口为片选口SHUZI EQU 30H ;设置处理数据存放地址JIANBIT0 BIT 20H.0 ;设置按键标志位XIAN0 BIT 20H.2 ;显示标志位T_BIT BIT 21H.0 ;设置中断定时器0标志位LIANAN BIT 20H.1 ;设置连按标志位BIT4 BIT 20H.2MODE EQU 01HSHU EQU 40H;========================程序开始==============================ORG 00H ;程序开始LJMP START ;跳到STARTORG 0BH ;中断定时器0入口地址JMP T0_1 ;跳到定时器0服务程序ORG 0030H ;入口地址;=========================主程序=============================== START:MOV SP,#60H ;移开指针MOV SHUZI,#00 ;数据初始化MOV DPTR,#TAB ;查表初始化MOV P1,#0F8H ;设置P1.0口为输入CALL INIT ;开中断CLR JIANBIT0 ;按键标志位清0CLR LIANAN ;连按标志位清0CLR BIT4SETB T_BIT ;中断标志位置1MOV SHU,#0MOV R2,#0MOV R3,#0MOV R4,#0MOV R5,#200MAIN:JNB T_BIT,MAIN ;等待中断CLR T_BIT ;中断标志位清0JB BIT4,VVINC R3CJNE R3,#25,XXMOV R3,#00MOV R2,#0JMP DDXX:CJNE R2,#3,VVSETB LIANANMOV R2,#00DD:CLR BIT4VV:JB LIANAN,XUNHUAN ;判断是否有连按CC:CALL JISUAN ;计算分离十位和个位CALL DISPLAY ;显示个位和十位JNB JIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起JNB P1.3,XIANSHI0 ;若没抬起(P1.3=0)则调到XIANSHI0 SETB BIT4INC R2MOV R3,#0CLR JIANBIT0 ;按键标志位清0CLR XIAN0 ;显示标志位清0JMP MAIN ;返回MAINPANDUAN:JB P1.3,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0 SETB JIANBIT0JMP MAINXIANSHI0:JB XIAN0,MAINSETB XIAN0 ;显示标志位清0CALL JIACHULI ;加处理JMP MAINXUNHUAN:MOV A,SHUCJNE A,#10,KKKMOV SHU,#0CLR LIANANMOV A,SHUKKK: MOVC A,@A+DPTR ;查表MOV SHUCHU,AMOV PIANXUAN,#05INC R4CJNE R4,#50,OUTTINC SHUMOV R4,#0OUTT:JMP MAIN;====================定时中断0服务子程序======================== ;输入:无;输出:无;实现的功能:实现定时20MS,影响标志位T_BIT;=============================================================== T0_1:MOV TMOD,#MODE ;定时器1工作方式1MOV TL0,#0E0H ;设置定时初值MOV TH0,#0B1HSETB T_BIT ;定时标志位清0RETI;========================中断设置子程序========================= ;输入:无;输出:无;实现的功能:初始化设置定时器,设置初值;===============================================================INIT:MOV TMOD,#MODE ;定时器0工作方式1MOV TL0,#0E0HMOV TH0,#0B1HMOV IE,#82H ;开定时器中断0SETB TR0 ;开定时器0RET;========================计算子程序============================= ;输入:30H;输出:"A和B";实现的功能:把30H的数据的十位和个位分离出来;=============================================================== JISUAN:MOV A,SHUZI ;数据放在A中MOV B,#10 ;除数放在B中DIV AB ;商放在A中,余数放在B中RET;========================显示子程序============================= ;输入:"A";输出:"P0口";实现的功能:把A的数输出到P0口显示,十位和个位分开显示;=============================================================== DISPLAY:MOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示十位MOV PIANXUAN,#04H ;片选CALL DELAY ;查表MOV SHUCHU,#0FFH ;关闭数码管MOV A,BMOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示个位MOV PIANXUAN,#05H ;片选CALL DELAY ;延时MOV SHUCHU,#0FFH ;关闭数码管RET;======================加处理子程序============================= ;输入:无;输出:无;实现的功能:把30H地址加1;=============================================================== JIACHULI:MOV A,SHUZICJNE A,#99,L0 ;若A不等于9,则跳到LL MOV A,#00JMP L1L0:INC A ;自加一L1:MOV SHUZI,ARET;========================延时程序===============================;输入;无;输出: 无;实现的功能:延时一段时间;=============================================================== DELAY:MOV R6,#80L7:MOV R7,#80L8:DJNZ R7,L8DJNZ R6,L7RET;=====================共阳查表数据============================== TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;=======================程序结束================================ END一个按键控制一个灯,要求按一下按键,灯亮一直亮,再按一下按键灯灭,要带按键的去抖程序。
精选10个汇编语言程序案例集

精选10个汇编语言程序案例集摘要:一、汇编语言简介二、案例1:简单算术运算三、案例2:字符串处理四、案例3:逻辑与关系运算五、案例4:循环与条件语句六、案例5:函数调用与参数传递七、案例6:数组与指针操作八、案例7:内存管理九、案例8:输入输出操作十、案例9:操作系统调用十一、案例10:网络编程十二、总结与拓展正文:一、汇编语言简介汇编语言是一种低级编程语言,它与计算机硬件的操作紧密相关。
汇编语言通过对计算机指令进行汇编,实现对计算机资源的控制。
下面将介绍10个汇编语言程序案例。
二、案例1:简单算术运算案例1是一个实现加减乘除算术运算的汇编程序。
通过编写相应的汇编指令,实现对两个整数的加减乘除操作。
三、案例2:字符串处理案例2是一个处理字符串的汇编程序。
通过汇编指令实现字符串的输入、输出、查找、替换等功能。
四、案例3:逻辑与关系运算案例3是一个处理逻辑与关系运算的汇编程序。
通过汇编指令实现逻辑与、逻辑或、逻辑非以及关系运算。
五、案例4:循环与条件语句案例4是一个处理循环与条件语句的汇编程序。
通过汇编指令实现for、while、if-else等循环与条件控制结构。
六、案例5:函数调用与参数传递案例5是一个处理函数调用与参数传递的汇编程序。
通过汇编指令实现函数调用,以及将参数传递给函数。
七、案例6:数组与指针操作案例6是一个处理数组与指针操作的汇编程序。
通过汇编指令实现数组的创建、访问、排序等操作,以及指针的运算与控制。
八、案例7:内存管理案例7是一个处理内存管理的汇编程序。
通过汇编指令实现内存的分配、释放、拷贝等操作。
九、案例8:输入输出操作案例8是一个处理输入输出操作的汇编程序。
通过汇编指令实现键盘输入、显示输出等功能。
十、案例9:操作系统调用案例9是一个处理操作系统调用的汇编程序。
通过汇编指令实现操作系统提供的功能,如文件操作、进程管理等。
十一、案例10:网络编程案例10是一个处理网络编程的汇编程序。
单个按键控制4个LED 实验报告(带程序)

单个按键控制4个LED(入门级实验)实验介绍:通过单个按键控制4个LED灯的亮灭状态。
正常情况下,一个按键控制1个灯。
在本次实验中,要求使用1个按键,控制4个LED灯。
通过按键按下的次数,控制LED的亮灭状态。
按下1次,1个LED灯点亮,按下2次,2个LED 灯点亮,按下3次,3个LED灯点亮,按下4次,4个LED灯点亮,按下5次,所有LED灯都熄灭,如此循环。
如此就可以通过单个按键控制4个LED灯的亮灭。
在照明场所,控制LED灯的点亮个数,就可以控制亮度。
实验目的:在使用单片机等控制器控制周边元件的时候,经常会遇到I/O口不够用的情况。
因此在使用的时候,尽量省着用。
本次实验通过单个按键控制4个LED灯的亮灭状态,正常情况下需要4个按键,因而达到了节省单片机I/O口的目的。
通过此次实验室,学习单片机按键的编程控制方法,学习LED灯输出的控制方法。
学习最简单的输入设备(按键)控制最简单的输出设备(LED灯)的控制方法。
仿真原理图:在仿真软件Proteus中绘制仿真原理图如上图所示。
(注意事项:在进行实物制作时,发光二极管串联的电阻可以省略,因为单片机引脚灌电流的能力有限,限制了通过发光二极管电流的大小。
在仿真过程中,电阻R2~R9的大小要合适,太大LED将无法点亮。
)编程思路:当单片机上电后,所有的I/O口默认高电平,因而四个发光二极管在单片机上电后,都为熄灭状态。
此时,我们按下按键后,就可以调节各个发光二极管的亮灭状态。
当按一次按钮,将P2口的状态进行左移一位,同时将P2的最低位清零,就可以达到按一次按钮后,LED灯多亮一个。
如,当前只有P2口控制的最低位连接的LED点亮,当我们按一次按键,单片机首先将P2的状态循环左移一位,则刚才的最低位变为次低位,也就是倒数第二位点亮,同时将P2口的最低位清零,也就是倒数第一位连接的LED灯点亮,即按一次按钮后,倒数第一位和倒数第二位灯点亮。
其他状态与上述过程类似,这里不再赘述。
单片机按键连按长按汇编程序

单片机按键连按长按汇编程序;=============================================================== ;程序编写人:兰建文;编写地点:51hei培训机构;时间:6月7日下午星期日;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时;刻,任何一个按键,若按键连续按键3次,每次间隔时间不大于1秒,循;环显示0到9回到0。
若间隔时间大于1秒,显示加1,低电平亮;P2口实现对数码管的片选功能;=============================================================== ;==========================系统程序============================= ;=========================开始初始化============================ SHUCHU EQU P0 ;定义P0口为输出口PIANXUAN EQU P2 ;定义P2口为片选口SHUZI EQU 30H ;设置处理数据存放地址JIANBIT0 BIT 20H.0 ;设置按键标志位XIAN0 BIT 20H.2 ;显示标志位T_BIT BIT 21H.0 ;设置中断定时器0标志位LIANAN BIT 20H.1 ;设置连按标志位BIT4 BIT 20H.2MODE EQU 01HSHU EQU 40H;========================程序开始==============================ORG 00H ;程序开始LJMP START ;跳到STARTORG 0BH ;中断定时器0入口地址JMP T0_1 ;跳到定时器0服务程序ORG 0030H ;入口地址;=========================主程序=============================== START:MOV SP,#60H ;移开指针MOV SHUZI,#00 ;数据初始化MOV DPTR,#TAB ;查表初始化MOV P1,#0F8H ;设置P1.0口为输入CALL INIT ;开中断CLR JIANBIT0 ;按键标志位清0CLR LIANAN ;连按标志位清0CLR BIT4SETB T_BIT ;中断标志位置1MOV SHU,#0MOV R2,#0MOV R3,#0MOV R4,#0MOV R5,#200MAIN:JNB T_BIT,MAIN ;等待中断CLR T_BIT ;中断标志位清0JB BIT4,VVINC R3CJNE R3,#25,XXMOV R3,#00MOV R2,#0JMP DDXX:CJNE R2,#3,VVSETB LIANANMOV R2,#00DD:CLR BIT4VV:JB LIANAN,XUNHUAN ;判断是否有连按CC:CALL JISUAN ;计算分离十位和个位CALL DISPLAY ;显示个位和十位JNB JIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起JNB P1.3,XIANSHI0 ;若没抬起(P1.3=0)则调到XIANSHI0 SETB BIT4INC R2MOV R3,#0CLR JIANBIT0 ;按键标志位清0CLR XIAN0 ;显示标志位清0JMP MAIN ;返回MAINPANDUAN:JB P1.3,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0 SETB JIANBIT0JMP MAINXIANSHI0:JB XIAN0,MAINSETB XIAN0 ;显示标志位清0CALL JIACHULI ;加处理JMP MAINXUNHUAN:MOV A,SHUCJNE A,#10,KKKMOV SHU,#0CLR LIANANMOV A,SHUKKK: MOVC A,@A+DPTR ;查表MOV SHUCHU,AMOV PIANXUAN,#05INC R4CJNE R4,#50,OUTTINC SHUMOV R4,#0OUTT:JMP MAIN;====================定时中断0服务子程序======================== ;输入:无;输出:无;实现的功能:实现定时20MS,影响标志位T_BIT;=============================================================== T0_1:MOV TMOD,#MODE ;定时器1工作方式1MOV TL0,#0E0H ;设置定时初值MOV TH0,#0B1HSETB T_BIT ;定时标志位清0RETI;========================中断设置子程序========================= ;输入:无;输出:无;实现的功能:初始化设置定时器,设置初值;===============================================================INIT:MOV TMOD,#MODE ;定时器0工作方式1MOV TL0,#0E0HMOV TH0,#0B1HMOV IE,#82H ;开定时器中断0SETB TR0 ;开定时器0RET;========================计算子程序============================= ;输入:30H;输出:"A和B";实现的功能:把30H的数据的十位和个位分离出来;=============================================================== JISUAN:MOV A,SHUZI ;数据放在A中MOV B,#10 ;除数放在B中DIV AB ;商放在A中,余数放在B中RET;========================显示子程序============================= ;输入:"A";输出:"P0口";实现的功能:把A的数输出到P0口显示,十位和个位分开显示;=============================================================== DISPLAY:MOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示十位MOV PIANXUAN,#04H ;片选CALL DELAY ;查表MOV SHUCHU,#0FFH ;关闭数码管MOV A,BMOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示个位MOV PIANXUAN,#05H ;片选CALL DELAY ;延时MOV SHUCHU,#0FFH ;关闭数码管RET;======================加处理子程序============================= ;输入:无;输出:无;实现的功能:把30H地址加1;=============================================================== JIACHULI:MOV A,SHUZICJNE A,#99,L0 ;若A不等于9,则跳到LL MOV A,#00JMP L1L0:INC A ;自加一L1:MOV SHUZI,ARET;========================延时程序===============================;输入;无;输出: 无;实现的功能:延时一段时间;=============================================================== DELAY:MOV R6,#80L7:MOV R7,#80L8:DJNZ R7,L8DJNZ R6,L7RET;=====================共阳查表数据============================== TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;=======================程序结束================================ END一个按键控制一个灯,要求按一下按键,灯亮一直亮,再按一下按键灯灭,要带按键的去抖程序。
按键模拟仿真 原理图与程序(汇编+C语言)

按键模拟仿真(入门级实验)实验介绍1:利用单片机控制一个按键以及一个LED灯,通过程序控制上述两个原件,模拟简单的按键控制LED电路。
当按键按下的时候LED灯点亮,当按键松开的时候LED熄灭。
(拓展:可以对该实验进行一定的拓展,例如当按键按下一段时间后,LED灯才开始点亮,或当按键松开后,LED灯点亮一段时间后再熄灭等等)实验目的:通过对简单的按键控制LED电路的模拟,掌握单片机读入数字量的过程以及单片机对数字量进行判断(按键按下或松开)。
仿真原理图:在仿真软件Proteus中绘制仿真仿真原理图如上图所示。
(注意事项:在上图中按键使用了“button”,该元件类似于带复位功能的按钮,当鼠标按下该按键时接通,当鼠标松开后,按键自动复位,变为断开状态。
在此原理图中也可使用“switch”元件,该元件的类似于带自锁功能的按钮,当鼠标点击一次该元件,按键接通并自锁,此时松开鼠标,按键也不能复位,当再次使用鼠标单击该按键时,按键才能处于复位状态。
)程序HEX代码如下::0300000002003BC0:0C003B00787FE4F6D8FD75810702000014:020********E50:0B00300020A204C2A080F9D2A080F53D:00000001FF程序HEX使用方法:1)新建txt文档2)将HEX代码复制到txt文档中,保存3)将该txt文档另存为“程序名.hex”,例如:pro.hex4)在仿真软件中打开即可实现仿真。
汇编语言代码以及C语言代码如下:汇编语言代码:ORG 0HJMP MAINORG 30HMAIN:JB P2.2,X1CLR P2.0JMP MAINX1:SETB P2.0JMP MAINEND注意:该程序较为简单,一般不易出错。
需要注意的是程序需要重复执行!C语言代码:#include <reg52.h>sbit P20=P2^0;sbit P22=P2^2;void main(){while(1){ if(P22==0)P20=0; //点亮LEDelseP20=1; //熄灭LED}}上述程序完成的是当按键按着的时候灯亮,而当按键松开后灯灭。
51单片机16键电子琴汇编程序

KEYL EQU 30H ; 定义KEYL变量,用于键盘扫描KEYR EQU 31H ; 定义KEYR变量,用于键盘扫描VAL EQU 32H ; 定义键值变量VALORG 00HJMP START ; 主程序入口ORG 0BHJMP INT_T0 ; Timer 0中断入口START:MOV TMOD,#01H ; Timer 0作定时器,模式1LSCAN: ; 键盘按键判断MOV P2,#0F0H ; 列全为1L1: ; 判断第1行JNB P2.0,L2CALL DELAYJNB P2.0,L2MOV KEYL,#00HJMP RSCANL2: ; 判断第2行JNB P2.1,L3CALL DELAYJNB P2.1,L3MOV KEYL,#01HJMP RSCANL3: ; 判断第3行JNB P2.2,L4CALL DELAYJNB P2.2,L4MOV KEYL,#02HJMP RSCANL4: ; 判断第4行JNB P2.3,L1CALL DELAYJNB P2.3,L1MOV KEYL,#03HRSCAN:MOV P2,#0FH ; 键盘行输出1C1: ; 判断第1列JNB P2.4,C2MOV KEYR,#00HJMP CALCUC2: ; 判断第2列JNB P2.5,C3MOV KEYR,#01HJMP CALCUC3: ; 判断第3列JNB P2.6,C4MOV KEYR,#02HJMP CALCUC4: ; 判断第4列JNB P2.7,C1MOV KEYR,#03HCALCU: ; 计算按键号MOV A,KEYLMOV B,#04HMUL ABADD A,KEYRMOV VAL,AMOV DPTR,#TABLE ; 装表MOV B,#2MUL ABMOV R1,AMOVC A,@A+DPTR ; 把表中计数初始值装入累加器AMOV TH0,AINC R1MOV A,R1MOVC A,@A+DPTRMOV TL0,AMOV IE,#82H ; 使能Timer 0中断SETB TR0 ; 启动TimerW0: ; 等待按键释放MOV A,P2CJNE A,#0FH,W1CLR TR0 ; TRO清0JMP LSCANW1:MOV A,P2CJNE A,#0F0H,W2MOV P0,#00HCLR TR0JMP LSCANW2:JMP W0;Timer 0中断服务程序,输出某一频率的方波.INT_T0:MOV DPTR,#TABLEMOV A,VALMOV B,#2MUL ABMOV R1,AMOVC A,@A+DPTRMOV TH0,AINC R1MOV A,R1MOVC A,@A+DPTRMOV TL0,ACPL P1.0 ; 清P1.0口RETIDELAY:MOV R6,#10D1:MOV R7,#250DJNZ R7,$DJNZ R6,D1RETTABLE: ; 16个琴键发音频率的计数初始值DW 64021,64103,64260,64400DW 64524,64580,64684,64777DW 64820,64898,64968,65030DW 65058,65110,65157,65178END。
汇编语言单片机外部中断按键执行不同

汇编语言单片机外部中断按键执行不同汇编语言中,单片机的外部中断是通过外部的触发事件来通知单片机执行相应的程序。
其中,按键外部中断是一种常见的外部中断方式,通过按下按钮或按键来触发相应的中断事件。
在单片机外部中断的实现过程中,按键的动作(按下或释放)会引发不同的中断响应,从而使单片机执行不同的程序。
以下是一个示例汇编代码,展示了如何根据按键的不同动作执行不同的程序。
首先,我们需要初始化单片机的外部中断函数,并设置相关的中断向量和中断优先级等参数。
```assemblyORG0某0000;设置中断向量JMP MainORG0某0004;外部中断1的中断向量JMP Int1_Handler```接下来,定义Main程序,在其中等待中断事件的发生,并根据按键的不同动作进行相应的处理。
```assemblyMain:MOVP3,B;配置P3口的高8位为输入SETBP3.4;设置P3.4为上拉输入MOVIE,B;允许中断MOVTCON,B;设置外部中断1的边沿触发方式SJMP$Int1_Handler:CPLP1.0;翻转P1.0的电平RETI;返回中断END```在上述代码中,我们使用P3.4口作为外部中断1触发的口线,当P3.4从高电平变为低电平时,会触发外部中断1的中断事件。
当中断事件发生时,程序会执行Int1_Handler处理函数,该函数会将P1.0口的电平进行翻转操作。
我们可以根据实际需求,在Int1_Handler中添加其他的处理程序,来执行不同的操作。
以上是一个简单的示例,展示了如何在汇编语言中实现按键外部中断执行不同的程序。
在实际应用中,我们可以根据具体的需求,进一步优化代码,并添加其他的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
急求独立按键汇编程序我自己写的一个拷面包炉的程式,可以给你参考。
我的QQ:597430854;........................................................K1 BIT P3.0 ;定义向下键在p3.0K2 BIT P3.1 ;定义向上键在p3.1K3 BIT P3.2 ;定义取消键在p3.2K4 BIT P3.3 ;定义半烤键在p3.3K5 BIT P3.4 ;定义开始键在P3.4 ;........................................................LED1 BIT P1.6 ;定义LED1在P1.6LED2 BIT P1.5 ;定义LED2在P1.5LED3 BIT P1.4 ;定义LED3在P1.4LED4 BIT P1.3 ; ...LED5 BIT P1.2 ; ...LED6 BIT P1.1 ; ...LED7 BIT P1.0 ; ...;........................................................RY1 BIT P3.5 ;继电器1半烤定义在P3.5口RY2 BIT P3.7 ;继电器2定义在P3.7口SPK BIT P1.7 ;喇叭定义在P3.4口SS EQU 200 ;秒数值5MS*200=1秒TSEC EQU 30H ;秒数变量ID EQU 31H ;ID变量TCOUNT EQU 32H ;秒数计数器ORG 0HJMP START0ORG 0BHJMP SET0START0:CLR RY1 ;继电器1释放CLR RY2 ;继电器2释放MOV TCOUNT,#00H ;TO计数清0MOV TSEC,#00H ;秒数清0MOV ID,#00H ;ID清0MOV P1,#01110111B 1口开始时为01110111MOV ID,#00H ;ID清0MOV A,IDADD A,#04HMOV ID,AMOV TCOUNT,#00HMOV TMOD,#00000001BMOV TL0,#236MOV TH0,#120SETB TR0LOOP:JB K1,M1 ;判断K1是否按下,BIT=1时,转M1,BIT=0时,继续LCALL DELAY ;JB K1,LOOP ;JMP START ;M1:JB K2,M2 ;判断K2是否按下,BIT=1时,转M2,BIT=0时,继续LCALL DELAY ;JB K2,M1;JMP START1M2:JB K5,M3 ;开始键盘按下LCALL DELAY ;JB K5,LOOP ;MOV A,IDJMP SET0M3:JB K4,M4LCALL DELAY ;JB K4,LOOP ;CPL RY1CALL BZJNB K4,$M4:JMP LOOP ;;向下键..................................................START:INC ID ;ID加1MOV A,ID ;ID放入ACJNE A,#08H,REL ;如果A=8,继续,否则转RELMOV A,#0HADD A,#07HJMP IS6START1EC ID ;ID减1MOV A,ID ;ID放入ACJNE A,#00H,REL ;如果A=0,继续,否则转RELMOV A,#0HADD A,#01HJMP IS6REL: CALL BZREL1:CJNE A,#01H,IS0 ;如果A不等于1,转IS0MOV P1,#00111111B ;JMP IS6 ;IS0: CJNE A,#02H,IS1 ;MOV P1,#01011111BJMP IS6 ;IS1: CJNE A,#03H,IS2 ;MOV P1,#01101111BJMP IS6IS2: CJNE A,#04H,IS3 ;MOV P1,#01110111B ;JMP IS6 ;IS3: CJNE A,#05H,IS4 ;MOV P1,#01111011BJMP IS6 ;IS4: CJNE A,#06H,IS5 ;MOV P1,#01111101BJMP IS6 ;IS5: CJNE A,#07H,IS6 ;MOV P1,#01111110BJMP IS6IS6:MOV ID,AJNB K1,$JNB K2,$JMP LOOP;0.5秒钟延时子程式...................................DELAY1S:MOV R5,#50D2:CALL DELAYDJNZ R5,D2RET;10ms延时............................................DELAY: MOV R6,#20 ;延时10ms 子程序L1: MOV R7,#248DJNZ R7,$DJNZ R6,L1RET;喇叭哗一声..........................................BZ:MOV R2,#248B1:CALL DEXCPL SPKDJNZ R2,B1CLR SPKRET ;....................................................DEX:MOV R4,#38DE1:NOPDJNZ R4,DE1RET;喇叭哗三声..........................................BZ1:MOV R3,#15C2:MOV R2,#248C1:CALL DEXCPL SPKDJNZ R2,C1DJNZ R3,C2CLR SPKRET;定时结束............................................TIME_END: ;定时时间结束MOV P1,#01111111B ;CLR RY1 ;继电器1为OFFCLR RY2 ;继电器2为OFF CALL DELAY ;延时10msCALL BZ1 ;喇叭响一声MOV R1,#2BXX1:CALL DELAY1SCALL BZ1DJNZ R1,BXX1CALL DELAY1SJNB K5,$ ;等待K5松开MOV A,#0HMOV A,IDMOV TSEC,#00HJMP REL1 ;跳到REL1SET0:SETB RY2JMP SET1SET1:CJNE A,#01H,SET2MOV ID,ABB1:CALL COMCPL LED1CJNE A,#90,BB1 ;90秒定时时间JMP TIME_ENDSET2:CJNE A,#02H,SET3MOV ID,ABB2:CALL COMCPL LED2CJNE A,#110,BB2JMP TIME_ENDSET3:CJNE A,#03H,SET4MOV ID,ABB3:CALL COMCPL LED3CJNE A,#130,BB3JMP TIME_ENDSET4:CJNE A,#04H,SET5MOV ID,ABB4:CALL COMCPL LED4CJNE A,#150,BB4JMP TIME_ENDSET5:CJNE A,#05H,SET6MOV ID,ABB5:CALL COMCPL LED5CJNE A,#170,BB5JMP TIME_ENDSET6:CJNE A,#06H,SET7MOV ID,ABB6:CALL COMCPL LED6CJNE A,#190,BB6JMP TIME_ENDSET7:CJNE A,#07H,SBMOV ID,ABB7: CALL COMCPL LED7CJNE A,#210,BB7JMP TIME_ENDSB:JMP LOOPCOM:CALL AA1JNB TF0,COM ;TF0=1,继承,否则返回XX1 CLR TF0 ;清除TF0为0MOV TL0,#120 ;加载低字节,5MS定时MOV TH0,#236 ;加载高字节,5MS定时SETB TR0 ;开启定时器INC TCOUNT ;计数器加1MOV A,TCOUNTCJNE A,#SS,COM ;5ms*(SS)200=1秒,1秒时间到 MOV TCOUNT,#00H ;计数器清0INC TSEC ;秒数加1MOV A,TSECRETAA1:JB K3,M01 ;K3取消按下,继续,否则转M01LCALL DELAY ;JB K3,M01 ;JMP TIME_END ;M01:JNB K5,M02 ;K5开始弹起没按下,继续,否则转M02LCALL DELAY ;JNB K5,M02 ;JMP TIME_END ;M02:JB K4,M03 ;K4半烤键按下,继续,否则转M01LCALL DELAY ;JB K4,M03 ;CPL RY1CALL BZJNB K4,$ ;等待K4松开M03:RETEND。