精华内容
下载资源
问答
  • 更多相关内容
  • 要求实现如下功能:(1初始状态下按亮显示8),不显示闪烁。 (2单击K1:标识“低优先级”的数码管依次显示0~9后回到结束符“-”; (3)单击K2:标识“高优先级”的数码管依次显示0~9后回到结束符“-...
  • 1.理解AT89C51单片机中断优先级和优先权。 2.用PROTEUS设计、仿真基于AT89C51单片机的中断优先级实验。 3.掌握中断编程。 优先级实验
  • 5.2 SW1控制LED1亮灭(中断功能

    千次阅读 2019-01-17 12:49:00
    能够产生中断请求的中断源如下: CC2530中断设置步骤:使能端口组中断(IEN)——端口组中具体端口中断使能/禁止(PxIEN)——设置中断触发方式PICTL——使能系统总中断(EA) 下文此思路展开: 1、使能端口...

    中断:CPU收到中断请求后暂停正在执行的程序,而去执行中断服务函数中的程序,处理结束后,继续执行原来的程序。

    能够产生中断请求的中断源如下:

    CC2530中断设置步骤:使能端口组中断(IEN)——端口组中具体端口中断使能/禁止(PxIEN)——设置中断触发方式PICTL——使能系统总中断(EA)

    下文按此思路展开:

    1、使能端口组中断

    IEN2|=0x10;    //10000,设置IEN2的第4位,使能P1端口组中断

    2、使能具体端口中断

    P1IEN|=0x04;    //0100,P1_2口中断

    3、设置中断触发方式

    PICTL|=0x02;   //P_3到P1_1下降沿触发中断,SW1按下,电平由高变低

    4、使能总中断

    EA=1;    

    要想使用中断功能,必须使能中断总开关EA,并且使能各个中断源的自身控制开关IEN。

    具体寄存器详情如下:

    中断服务函数格式:以P1为例。函数体不能带有参数,也不能有返回值

    #pragma vector=P1INT_VECTOR
    __interrupt void P1_INT(void) //注意,interrupt前是两个_
    {
      /*处理程序*/
    }

    中断向量名如下:可查看ioCC2530.h头文件内容

    中断标志位:中断源很多,需要识别触发中断的中断源。

    P0、P1、P2端口组的中断标志位分别是P0IF、P1IF、P2IF。

    P1_2连接着SW1按键,按键按下P1IF值变为1,CPU就去执行P1的中断服务函数。标志位不能自动复位,需要手动清除该中断标志位。

      P1IF=0;  //清除P1端口组中断标志位

    具体是P1中哪一个针脚引起的中断,可以通过PxIFG寄存器的值来判断。当然也需要手动清除具体的针脚标志位(在中断服务函数中)。

      P1IFG&0x04     //判断P1_2的中断标志位是否为1

      P1IFG &=~ 0x04;   //清除P1_2的中断标志位

     清除过程,先小再大。即先关局部再关总闸。

    #include "ioCC2530.h"
    
    #define  LED1   P1_0
    
    /*==================端口初始化函数=====================*/
    void Init_Port()
    {
      //将P1_0设置为通用I/O端口功能
      P1SEL &= ~0x01;   
      //将P1_0的端口传输方式设置为输出
      P1DIR |= 0x01;   
      LED1 = 0;
    }
    /*===============外部中断初始化函数==================*/
    void Init_INTP()
    {
      IEN2 |= 0x10;         //端口1中断使能
      P1IEN |= 0x04;        //端口P1_2外部中断使能
      PICTL |= 0x02;        //端口P1_0到P1_3下降沿触发 
      EA = 1;               //使能总中断
    }
    /*================外部中断1服务函数====================*/
    #pragma vector = P1INT_VECTOR     //外部中断1的向量入口
    __interrupt void Int1_Sevice()
    {
      LED1 = ~LED1;
    /*先清除引脚标志位,再清除端口组标志位,否则会一直进入中断*/
      P1IFG &= ~ 0x04;        //清除P1_2引脚的标志位
      P1IF = 0;               //清除P1端口组的标志位
    }
    /*====================主函数==========================*/
    void main()
    {
      Init_Port();          //初始化通用I/O端口
      Init_INTP();          //初始化外部中断
    }

     

    转载于:https://www.cnblogs.com/xixixing/p/10281634.html

    展开全文
  • 上一篇文章记录了TM1638驱动的显示模块的显示功能C语言程序,详见TM1638显示板(8数码管+8LED+8按键)驱动程序(显示功能),本文分享按键的驱动,以及按键的去抖动等操作。 模块如图: 笔者采用的MCU是STM32F103...

    一、概述

    上一篇文章记录了TM1638驱动的显示模块的显示功能C语言程序,详见TM1638显示板(8数码管+8LED+8按键)驱动程序(显示功能),本文分享按键的驱动,以及按键的去抖动等操作。
    模块如下图:
    在这里插入图片描述
    笔者采用的MCU是STM32F103C8T6,IAR开发环境,使用了HAL库。

    二、驱动程序

    1. 硬件分析

    在这里插入图片描述
    首先,通过上图,可以看出按键是连接到K3上的;
    在这里插入图片描述
    再看上图手册中对按键功能的描述,可知所有按键连接到同一个K引脚上,不能实现组合按键,按键仅能单个使用。读取按键的4个BYTE时,我们需要把K3引脚对应的值取出,即查看每个BYTE的B0和B4位,有一个为1,则对应的键被按下,又因为无法实现组合按键,所以在取4个BYTE中的K3对应的位时,取到第一个1,即认为对应的按键被按下。

    2. 按键读取驱动程序

    按键读取程序如下:

    /*******************************************************************************
      * 函数名:TM1638_ReadKey
      * 功  能:TM1638读按键数据
      * 参  数:无
      * 返回值:读出的数据
      * 说  明:实际该显示板只有8个按键,返回值1~8分别为Key1~Key8;
    			所有按键连接K3,无法实现组合按键,只允许一次按一个键;
    *******************************************************************************/
    uint8_t TM1638_ReadKey(void)
    {
    	uint8_t u8Data[4], i;
    	uint8_t u8Key = 0;
    	TM1638_STBReset();
    	TM1638_WriteData(0x42);
    	for (i = 0; i < 4; i++)
    	{
    		u8Data[i] = TM1638_ReadData();//读BYTE1~BYTE4的数据
    	}
    	TM1638_STBSet();
    	for (i = 0; i < 4; i++)//取出4个BYTE中的键值
    	{
    		if (((u8Data[i] >> 0) & 0x01) == 0x01)//第0位,B0,对应按键为1、3、5、7,计算公式是i*2+1
    		{
    			u8Key = (i * 2 + 1);
    			break;
    		}else
    		{
    			if (((u8Data[i] >> 4) & 0x01) == 0x01)//第4位,B4,对应按键为2、4、6、8,计算公式是i*2+2
    			{
    				u8Key = (i * 2 + 2);
    				break;
    			}
    		}
    	}
    	return u8Key;
    }
    

    程序注释还算详细,应该不需要再说明了。

    3.应用层程序

    这里我们实现如下功能:
    右侧4位数码管显示实际温度,精确到1位小数;左侧4位数码管显示设定温度,精确到1位小数;
    左1按键为设置键,按下时,设定温度闪烁显示,左2键为“+”键,可向上调整设定温度,设置步长为0.1,左3键为“-”键,可向下调整设定温度,设置步长为0.1,再次按设置键,温度设定完成,不再闪烁。
    根据人的按键操作反应时间,程序可20ms左右执行一次,扫描时按键被释放,才将按键值返回,完成按键相应的操作,达到去抖动的效果。该方法简单易懂,但缺点是没有长按、双击等操作(可自行扩展)。主要代码如下:

    #define KEY_NULL								0x00//无
    #define KEY_SET									0x01//设置键
    #define KEY_UP									0x03//向上键
    #define KEY_DOWN								0x05//向下键
    
    typedef union
    {
    	uint8_t byte;
    	struct
    	{
    		uint8_t bSetMode:		1;//0正常,1进入设定模式
    		uint8_t b1:				1;
    		uint8_t b2:				1;
    		uint8_t b3:				1;
    		uint8_t b4:				1;
    		uint8_t b5:				1;
    		uint8_t b6:				1;
    		uint8_t b7:				1;
    	}bt;
    }KeyFlag_tu;
    
    static uint8_t u8Key_Name;//按键名称
    static uint8_t u8KeyState;//按键状态,按下或释放
    static KeyFlag_tu uKey_Flag;
    static uint32_t u32Key_SettingTemper;//正在设定的温度值
    
    #define KEY_RELEASED					0x00//键被释放
    #define KEY_PRESSED						0x01//键被按下
    /*******************************************************************************
      * 函数名:Key_Init
      * 功  能:初始化
      * 参  数:无
      * 返回值:无
      * 说  明:无
    *******************************************************************************/
    void Key_Init(void)
    {
    	u8Key_Name = KEY_NULL;
    	uKey_Flag.byte = 0;
    	u8KeyState = KEY_RELEASED;
    	u32Key_SettingTemper = 0;
    }
    /*******************************************************************************
      * 函数名:Key_ScanProcess
      * 功  能:按键扫描处理
      * 参  数:无
      * 返回值:无
      * 说  明:去抖动,每20ms扫描一次,扫描时按键被释放才会执行案件的操作;
    			仅支持单键、单击
    *******************************************************************************/
    void Key_ScanProcess(void)
    {
    	uint8_t u8KeyNum;
    	u8KeyNum = TM1638_ReadKey();//获取键值
    	if (u8KeyNum != 0)//有键按下
    	{
    		u8KeyState = KEY_PRESSED;
    		u8Key_Name = u8KeyNum;//保存按键值
    	}else
    	{
    		u8KeyState = KEY_RELEASED;
    	}
    	if (u8KeyState == KEY_RELEASED)//按键释放
    	{
    		switch (u8Key_Name)
    		{
    			case KEY_SET://设置键
    			{
    				if (uKey_Flag.bt.bSetMode)
    				{
    					uKey_Flag.bt.bSetMode = 0;//退出设置模式
    					PID_ModifySetTemper(u32Key_SettingTemper);//修改设定温度
    				}else
    				{
    					uKey_Flag.bt.bSetMode = 1;//进入设置模式
    					u32Key_SettingTemper = PID_GetSetTemper();//读取设定温度
    				}			
    			}break;
    			case KEY_UP://向上键
    			{
    				if (uKey_Flag.bt.bSetMode)//设置模式
    				{
    					if (u32Key_SettingTemper < (80 * 100))
    					{
    						u32Key_SettingTemper += 10;
    					}
    				}
    			}break;
    			case KEY_DOWN://向下键
    			{
    				if (uKey_Flag.bt.bSetMode)//设置模式
    				{
    					if (u32Key_SettingTemper > (30 * 100))
    					{
    						u32Key_SettingTemper -= 10;
    					}
    				}
    			}break;
    			default:break;			
    		}
    		u8Key_Name = KEY_NULL;
    	}		
    }
    
    

    4.效果

    在这里插入图片描述

    展开全文
  • 按下按键使得LED呈现“常亮”,“”,“闪烁”的三个状态循环显示。 设计思路:在程序初始化时直接将P1.0置位为高电平,然后使用按键直连P3.3外部中断1的管脚,当按键按下则P3.3脚就会被拉低,从而触发外部中断而...

    一,按键控制外部中断实现LED亮灭

    开机使得P1.0管脚的LED亮

    按下按键使得LED呈现“常亮”,“灭”,“闪烁”的三个状态循环显示。

    设计思路:在程序初始化时直接将P1.0置位为高电平,然后使用按键直连P3.3外部中断1的管脚,当按键按下则P3.3脚就会被拉低,从而触发外部中断而改变LED状态。这里我们可以直接使用查询按键状态的方法来改变LED状态,同时大家也可以使用按键中断的方式来触发条件。

    二,按键控制外部中断实现数码管显示数值加减

    数码管显示任意四位数,当按下按键一这个数值的末位减一,当按下按键二末尾加一

    设计思路:关于这个实验与上面的那个实验都是大同小异,无非是更改了显示方式,那么这个实验笔者就使用外部中断触发的方式来写一遍以示区别。

    附上Proteus原理图

    这是实验一初始化界面
    这是实验一初始化界面
    这是实验二的初始化姐界面
    这是实验二的初始化姐界面
    这里使用共阴数码管

    下面展示一些 实验一

    		ORG		0000H
    		AJMP	START
    		ORG		0100H
    START:			
    		MOV		P1,#01H    			;初始化使能P1.0MOV 	40H,#0H	   			;状态寄存器用于记录LED的状态
    LOOP:
    		ACALL	KEY1
    		
    DISPLAY:
    		CJNE	R7,#0,OFF   		;若为0则表示常亮
    		MOV		P1,#01H  			;常亮
    		
    OFF:	
    		CJNE	R7,#1, SHAN			;若为1则表示灭
    		MOV		P1,#0H
    		
    SHAN:	
    		CJNE	R7,#2, OUT			;若为2则表示闪烁
    		MOV		P1,#01H
    		ACALL	DELAY				;阻塞延时10000us
    		MOV		P1,#0H
    		ACALL	DELAY
    OUT:
    		AJMP	LOOP				;轮询主函数
    		
    KEY1:		
    		JB		P3.3,	KEY1OUT		;若按键按下引脚被拉低,继续执行,否则跳出改函数
    		INC		40H					;LED的状态加一
    		MOV		R7, 40H
    		CJNE	R7, #3,KEY1UP		;LED状态为3则改变为初值
    		MOV		40H, #0
    		MOV		R7, #0
    KEY1UP:								;松手检测
    		JB		P3.3, KEY1OUT		;LED状态不为3且按键松开,则跳出函数,否则等待按键弹起
    		AJMP	KEY1UP
    KEY1OUT:
    		RET
    		
    DELAY:								;延时函数
    		MOV		R4, #200
    L1:		MOV		R5,	#50
    		DJNZ	R5,	$
    		DJNZ	R4, L1
    		RET
    		END
    

    下面展示一些 实验二

    		ORG		0000H
    		AJMP	START
    		ORG     0003H
    		AJMP    IT0P
    		ORG     0013H
    		AJMP    IT1P
    		ORG     0100H
    START:			
    		MOV		40H, #34			;末位数的操作
    		SETB    EX0		
    		SETB    EX1
    		SETB    IT0
    		SETB    IT1
    		SETB    EA					;打开外部中断
    LOOP:								;主循环
    		ACALL	DISPLAY				
    		AJMP	LOOP
    DISPLAY:
    		MOV		DPTR, #LEDCODE		;访问码表
    
    		MOV		P0,	#06H			;固定显示前两位数
    		MOV		P2,	#0FEH
    		ACALL	DELAY
    		MOV		P2, #0FFH
    
    		MOV		P0,	#0x5b
    		MOV		P2,	#0FDH
    		ACALL	DELAY
    		MOV		P2, #0FFH
    		
    		
    		MOV		A, 40H				;取二进制数
    		MOV		B, #10				;8位二进制除以10
    		DIV		AB					
    		MOVC	A, @A+DPTR			;取出十位的数据
    		MOV		P0, A
    		MOV		P2, #0FBH
    		ACALL	DELAY
    		MOV		P2, #0FFH
    		
    		MOV		A, B				;取出个位数据
    		MOVC	A, @A+DPTR
    		MOV		P0, A
    		MOV		P2, #0F7H
    		ACALL 	DELAY
    		MOV		P2, #0FFH
    		RET
    		
    IT0P:								;外部中断0
    		INC		40H					;按键触发,寄存器自加1
    		MOV		R5, 40H
    		CJNE	R5, #100, KEY1OUT	;加满10个数,则重新赋初值
    		MOV		40H, #0
    		RETI
    KEY1OUT:
    		RETI
    	
    IT1P:								;外部中断1
    		DEC		40H					;按键触发,寄存器自减1
    		MOV		R5, 40H
    		CJNE	R5, #0, KEY2OUT	;加满10个数,则重新赋初值
    		MOV		40H, #99
    		RETI		
    KEY2OUT:
    		RETI
    		
    DELAY:								;延时函数
    		MOV		R6, #100
    		DJNZ	R6, $
    		RET
    LEDCODE: 							;码表
    		DB 3fH,06H,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
    			
    		END 
    
    

    在实验二中笔者为什么只是操作最后两位,其实是笔者比较懒,不想扩大加减数值的范围,平时我们使用C语言可以用int来表示16位数(不同位数的单片机不一样),但是在汇编中就得用DPTR来存储高位和低位,而在程序中笔者只是使用了一般的8位寄存器而已,能加到的最大值就255,所以笔者就只是对末尾两位进行加减。

    展开全文
  • 1、实验目的 2、实验设计 3、实验步骤 3.1、方式一:实时检测按键状态,联动控制LED灯 3.1.1、使用 STM32CubeMX 新建项目工程 3.1.2、编写实施代码 3.1.3、配置烧写参数 3.1.4、烧写程序 3.2、方式二:按键...
  • Python编程:Tkinter图形界面设计(2

    千次阅读 2022-01-17 11:52:56
    select为勾选, deselect为勾选 check1.select() # sticky=tk.W 当该列中其他行或该行中的其他列的某一个功能拉长这列的宽度或高度时, # 设定该值可以保证本行保持左对齐,N:北/上对齐 S:南/对齐 W:西/左对齐...
  • 文章目录STM32F103系列芯片的地址和寄存器映射原理、LED轮流闪烁实现1 寄存器介绍 1 寄存器介绍 寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 存放数据...
  • 使用定时器编写led闪烁

    千次阅读 2021-07-16 22:14:23
    提示:文章写完后,目录...一、实现功能 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filt
  • 哪吒人生信条:如果你所学的东西 处于喜欢 才会有强大的动力支撑。 把你的前端拿捏得死死的,每天...1.css3有哪些新特性 圆角border-radius,阴影box-shadow,对文字加特效text-shadow,线性渐变gradient,变化trans
  • 这是所有按键触发方式里最复杂的一个,变量太多,我就分析了,直接练习吧。
  • 还是按照惯例,分析核心代码: ...下面代码的前半部分和之前的一样,也就是说单击按键和之前的实验没有区别,但是如果第一次按下后没有松开,再过1秒,程序就开始间隔为0.25秒的连续触发,直到按键松开。
  • 随着互联网连接技术的日益普及,以及大众环保意识增强,电子纸显示市场不断发展,墨水屏的应用场景也越来越多。墨水屏座位管理器方案具体功耗低,多节点管控,信息实时同步等特点,可应用于智慧办公,智慧零售,智慧...
  • 串口波形显示软件SerialChart的使用

    千次阅读 热门讨论 2020-05-28 09:30:44
    单片机开发过程中串口是最常用的调试手段,可以将代码运行过程中的各种变量通过串口发送出来,以便观察程序的运行状态。 特别是在调试传感器采集数据时,可以通过串口来分析采样数据。但是单纯的看数据很难观察出来...
  • 此程序将实现简单的绘图功能。 一、简单绘图 实现简单的绘图功能,包括点、直线和椭圆的绘制。为了实现这些功能: ⭕⭕1)首先为此程序添加一个子菜单,菜单名称为“绘图”; ⭕⭕2)为其添加四个子菜单项,分别...
  • 2012-03-28 回答1.鼠标事件:所谓鼠标事件,就是在vfp应用程序的运行界面中,用鼠标对其中的对象进行操作所触发和事件.... (3).mousedown和mouseup事件:当鼠标指针指向对象并按下鼠标左键时触发mousedown事...
  • 本节实验我们准备采用黑金提供的AN108模块(AD9280),上面有一颗8位高速ADC芯片,结合PCIe总线实现一个采样率(最大32MS/s)可调节的PCIe数据采集卡,直接插到PC或者工控机或者工业树莓派上使用。
  • 用鼠标左键单击执行状态区的信息栏的盘符字母,弹出的小菜单中可以 对单个 U 盘进行操作:点击“状态”弹出该装置的 FLASH 的状态信息:4) 当状态区的信息栏显示绿色字体信息时,表示量产成功完成,关闭量产...
  • 单片机课程设计-8个LED灯来回点亮

    千次阅读 2021-05-22 08:44:54
    1、目录第一章 绪论-3第二章 设计目的及要求-51.1 设计目的-51.2 设计要求-5第三章 设计电路原理- -73.1 控制部分的设计与选择-73.2 LED显示方案-8第四章 硬件系统-94.1 原件清单-94.2 单片机AT89C51-94...
  • 本节实验我们准备采用黑金提供的AN706模块(AD7606),上面有1颗16位8通道高精度ADC芯片,结合PCIe总线实现8路并行采样率(最大200KS/s)可调节的PCIe数据采集卡,直接插到PC或者工控机或者工业树
  • 双击版的按键实验和单击版按键差别不大,变量上增加了ucKeyTouchCntx和uiKeyIntervalCntx,前者用于记录按键有效按下的次数(在双击间隔时间内有效),后者是双击间隔时间计数器。 代码结构上的改动也不大,增加了...
  • 基于STM32F103的液晶显示电子钟

    万次阅读 多人点赞 2019-10-18 21:18:09
    摘要: ...本设计系统就是以液晶进行显示数字时钟的一个微系统设计,本设计三大部分:分别包括信息处理部分、信息采集部分和信息显示部分。其中,信息处理部分是以单片机为核心,外加一些辅助电...
  • 因此,Sobel算子定义如下: sx={f(x+1,y-1)+2f(x+1,y)+f(x+1,y+1)}-{f(x-1,y-1)+2f(x-1,y)+f(x- 1,y+1)} sy={f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1)}-{f(x-1,y-1)+2f(x,y)+f(x+1,y-1...
  • 1、窗体1、常用属性(1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。(2)WindowState属性: 用来获取或设置窗体的窗口状态。 取值有三种: Normal (窗体正常显示)、 Minimized...
  • 【Qt】QWidget类详解(属性篇)

    千次阅读 2021-03-29 16:26:20
    widget的区域初始状态是未初始化的,在右边的图中表现为红色的对角线方格模型穿过被绘制过的区域,Qt::WA_OpaquePaintArea属性对于需要快速绘制特定内容而需要默认填充背景的widget非常有用。 要想快速的更新拥有...
  • STM32—LED单灯闪烁之软件延时

    千次阅读 2022-03-27 14:58:13
    STM32—LED单灯闪烁之软件延时
  • 8-1中,横躺着那块个头最大的芯片是摩托罗拉公司生产的,型号为MC6845,它的主要功能是产生显示信号,与CRT(阴极射线管)显示器一起协作,把刷新缓冲区中的字符按要求显示在屏幕上。MC6845常称为CRT控制器(CRT ...
  • 文章目录1、创建工程2、配置外设开启SWD调试功能使能外部时钟选择GPIO配置GPIO3、配置时钟系统4、工程输出设置工程设置源码输出设置生成源码工程5、写入用户代码编译下载   STM32Cube 是一个全面的软件平台,包括...
  • 1. 系列介绍 STM32MP157微处理器基于灵活的双Arm® Cortex®-A7内核(工作频率800 MHz)和Cortex®-M4内核(工作频率209 MHz)架构,并配一个专用的3D图形处理单元(GPU)、MIPI-DSI显示接口、以及一个CAN FD接口。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,686
精华内容 1,074
关键字:

要求实现如下功能: (1)初始状态下:按亮(显示8),灭(不显示)闪烁。 (2)单击k1:

友情链接: 逆向工程.rar