P3口键盘输入程序

发布者:芳华逝水最新更新时间:2015-03-12 来源: laogu关键字:P3口  键盘输入  中断 手机看文章 扫描二维码
随时随地手机看文章
;************;
;小灯控制程序;
;************;
;
;************;
;中断入口程序;
;************;
;
ORG 0000H ;程序执行开始地址
LJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口地址
RETI ;中断返回(不开中断)
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
;
;************;
; 初始化程序 ;
;************;
;
CLEAR: MOV 20H,#00H ;20H单元内存清0(闪烁标志清0)
SETB 00H ;20H.0位置1(上电时自动执行闪烁功能1)
RET ;子程序返回
;
;************;
; 主 程 序 ;
;************;
;
START: ACALL CLEAR ;调用初始化映绦?br> MAIN: LCALL KEYWORK ;调用键扫描子程序
JB 00H,FUN0 ;20H.0位为1时执行FUN0
JB 01H,FUN1 ;20H.1位为1时执行FUN1
JB 02H,FUN2 ;20H.2位为1时执行FUN2
JB 03H,FUN3 ;20H.3位为1时执行FUN3
AJMP MAIN ;返回主程序MAIN
;
;************;
; 功能程序 ;
;************;
;第1种闪烁功能程序
FUN0: MOV A,#0FEH ;累加器赋初值
FUN00: MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
JNB ACC.7,MAIN ;累加器最高位为0时转MAIN
RL A ;累加器A中数据循环左移1位
AJMP FUN00 ;转FUN00循环
;
;第2种闪烁功能程序
FUN1: MOV A,#0FEH ;累加器赋初值
FUN11: MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
JZ MAIN ;A为0转MAIN
RL A ;累加器A中数据循环左移1位
ANL A,P1 ;A同P1口值相与
AJMP FUN11 ;转FUN11循环
;
; 第3种闪烁功能程序
FUN2: MOV A,#0AAH ;累加器赋初值
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
CPL A ;A中各位取反
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
AJMP MAIN ;转MAIN
;
;第4种功能程序
FUN3: MOV P1,0FFH
AJMP MAIN

;************;
; 扫键程序 ;
;************;
;
KEYWORK:MOV P3,#0FFH ;置P3口为输入状态
JNB P3.2,KEY0 ;读P3.2口,若为0转KEY0
JNB P3.3,KEY1 ;读P3.3口,若为0转KEY1
JNB P3.4,KEY2 ;读P3.4口,若为0转KEY2
JNB P3.5,KEY3 ;读P3.5口,若为0转KEY3
RET ;子程序返回
;
;闪烁功能0键处理程序
KEY0: LCALL DL10MS ;延时10毫秒消抖
JB P3.2,OUT0 ;P3.2为1,子程序返回(干扰)
SETB 00H ;20H.0位置1(执行闪烁功能1标志)
CLR 01H ;20H.1位清0
CLR 02H ;20H.2位清0
CLR 03H ;20H.3位清0
OUT0: RET ;子程序返回
;
; 闪烁功能1键处理程序
KEY1: LCALL DL10MS
JB P3.3,OUT1
SETB 01H ;20H.1位置1(执行闪烁功能2标志)
CLR 00H
CLR 02H
CLR 03H
OUT1: RET
;
;闪烁功能2键处理程序
KEY2: LCALL DL10MS
JB P3.4,OUT2
SETB 02H ;20H.2位置1(执行闪烁功能3标志)
CLR 01H
CLR 00H
CLR 03H
OUT2: RET
;
;闪烁功能(备用)键处理程序
KEY3: LCALL DL10MS
JB P3.5,OUT3
SETB 03H ;20H.3位置1(执行备用闪烁功能标志)
CLR 01H
CLR 02H
CLR 00H
OUT3: RET
;
;************;
; 延时程序 ;
;************;
;0.5毫秒延时子程序,执行一次时间为513微秒
DL512: MOV R2,#0FFH
LOOP1: DJNZ R2,LOOP1
RET
;
;10毫秒延时子程序(调用20次0.5毫秒延时子程序)
DL10MS: MOV R3,#14H
LOOP2: LCALL DL512
DJNZ R3,LOOP2
RET
;
;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为15×25毫秒)
DL05S: MOV R4,#0FH
LOOP3: LCALL DL25MS
DJNZ R4,LOOP3
RET
;
;25毫秒延时子程序,用调用扫键子程序延时,可快速读出功能按键值
DL25MS: MOV R5,#0FFH
LOOP4: LCALL KEYWORK
DJNZ R5,LOOP4
RET

END ;程序结束 
关键字:P3口  键盘输入  中断 引用地址:P3口键盘输入程序

上一篇:C51中的关键字
下一篇:Keil C51开发系统基本知识1

推荐阅读最新更新时间:2024-03-16 13:54

【MSP430】定时中断
中断的开关 中断这个,我试了好像不太好用,定时中断还是会启动~ // disable global interrupt关中断 __bic_SR_register(GIE); // enable global interrupt开中断 __bis_SR_register(GIE); _DINT();//关总中断 (可用于保护不希望受到中断打断的程序) _()NOP; //在保护程序之前与关中断之间最少有一步操作 _EINT(); //开总中断 定时中断 TA0R = 0; TA0CCR0 = 32768; // 1s = 32768 * (1 /32768) TA0CTL = TASSEL__ACL
[单片机]
STM32基础设计(5)---ADC转换(中断方式)
本文简单介绍了STM32F103C8,通过中断方式读取电压,不过最后楼主读取参考电压失败,还没有找到错误,所以读取的电压只能十六进制显示,如有不便请忽略本文! 本文的介绍按照一般流程来走: 1,串口的初始化 2,ADC初始化 3,中断初始化 4,编写中断函数 5,编写主函数 接下来详细介绍: 1,串口的初始化: void usart_init() { GPIO_InitTypeDef Uart_A; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE); Uart_A.GPIO_Pin = GPIO_Pin_9; Uar
[单片机]
STM32使用freertos时在中断中调用系统函数的注意点
CORTEX内核的优先级是数值越小优先级越高,即0是最高优先级。FreeRTOS正好相反,为了满足某些应用对中断实时性要求高的需求,使得中断优先级高于某个值之后,就不能调用操作系统的内核函数来提高实时性。而我们经常所犯的错误就是将中断的优先级设置的高于这个值,却还在中断中调用操作系统提供的API引起的。当把优先级改小也就是数值改大之后,程序能够正常运行。 注意点: 1:首先要将中断的嵌套设置为抢占优先级。 2:将freertos系统内核中断(configKERNEL_INTERRUPT_PRIORITY)的优先级设置成最低。 3:将freertos的最大系统调用中断优先级(configMAX_SYSCALL_IN
[单片机]
ARM 中断状态和SVC状态的堆栈切换 (异常)
基础知识: Arm的寄存器使用规则以及寻址指令: R13 Sp 堆栈寄存器 R14 Lr 连接寄存器 R15 PC 程序计数器 多寄存器寻址: LDMIA R0!,{R1-R4} 执行以后的效果 R1 R2 R3 R4 堆栈寻址: STMFD入栈指令,相当于STMDB STMFD SP!,{R2-R4} 注意这个 ! 的使用,在使用和不使用的情况下会有不一样的效果,在后面的代码中具体分析。 R4 R3 R2 LDMFD出栈指令,相当于LDMIA LDMFD SP!,{R6-R8} R6 R7
[单片机]
ARM <font color='red'>中断</font>状态和SVC状态的堆栈切换 (异常)
s3c2440外部中断
上文用到了pwm控制蜂鸣器,实现了蜂鸣器频率的改变,有一点不好就是蜂鸣器一直响,可以用一个交互的方式来关闭蜂鸣器。这里就选择按键,开发板上一共4个按键,对应这4个外部中断EINT0,EINT1,EINT2和EINT4(为什么不是EINT0~3呢,让人蛋疼) 要使用外部中断,首先要初始化外部中断。外部中断跟外部引脚F和G复用。要把相应的引脚配置为中断模式: 配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK 有些位对应着多个外部中断; 由于存在位对应着多个外部中断,如上图 EINT4~7 EINT8~23 对
[单片机]
s3c2440外部<font color='red'>中断</font>
中断扫描实现计算器程序
单片机小制作时写的一些小程序,在最小系统上运行成功,采用的是中断键盘扫描. //****键值表如下: // 1 2 3 4 // 5 6 7 8 // 9 + - * // / = CLR //*************// #include reg51.h #define unint unsigned int #define unchar unsigned char sbit P3_4=P3^4; sbit P3_5=P3^5; unchar code table ={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0
[单片机]
51单片机2个外部中断的应用
;51单片机的P1口上接有8只LED。 ;在外部中断0输入引脚P3.2接有一只按钮开关K1。 ;在外部中断1输入引脚P3.3接有一只按钮开关K2。 ;要求K1和K2都未按下时,P1口的8只LED呈流水灯显示, ;仅K1(P3.2)按下时,左右4只LED交替闪烁。 ;仅按下K2(P3.3)时,P1口的8只LED全部闪亮。 ;两个外中断的优先级相同。 ;============================================= ;用 PROTSUE 仿真界面如下: ;下列程序,可以满足要求. ORG 0000H SJMP MAIN ORG 0003H SJMP X0_INT ORG 0
[单片机]
51单片机2个外部<font color='red'>中断</font>的应用
STM32 (Cortex-M3) 中NVIC(嵌套向量中断控制)的理解
一、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(
[单片机]
STM32 (Cortex-M3) 中NVIC(嵌套向量<font color='red'>中断</font>控制)的理解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved