#循循渐进学51单片机#函数进阶与按键#not.7

news2024/9/24 17:35:07

1、掌握单片机最小系统三要素电路设计规则。

1)

2)

3)


2、掌握函数间相互调用的方法和规则。

函数的形式参数和实际参数


实参:在调用一个有参数的函数时,函数名后边括号中的参数。


形参:在被调用的函数进行定义时,括号内的参数叫做形式参数。


1、函数定义中指定的形参,在未发生调用时不占用内存,函数调用时分配内存单元,调用结束释放内存。


2,或者复杂的表达式,但是要求必须有确定的值,在调用时传递给形参。c=add(1,a+b);


3、参必须制定数据类型,和变量定义一样。


4参和实参的数据类型应该相同或者赋值兼容。


5、主调函数在调用函数之前,应对被调函数做原型声明。


6、实参向形参的数据传递是单向传递,不能有形参再回传给实参。 


3、会独立按键和矩阵按键的电路设计方法和软件编程思路。

1)

2)

3)

4)按键消抖方法,遍历八个字节,当八个字节在连续时间字节相同,则判定按钮按下

5)按钮按下与否的判断,就是跟按钮前一刻的值判断,当前值与前一刻的值不同,则按钮按下。


4一按实现一个数码管数字从F~0递减的变化程序。

#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;

sbit KeyIn1 = P2^4;
sbit KeyIn2 = P2^5;
sbit KeyIn3 = P2^6;
sbit KeyIn4 = P2^7;

sbit KeyOut1 = P2^3;
sbit KeyOut2 = P2^2;
sbit KeyOut3 = P2^1;
sbit KeyOut4 = P2^0;
unsigned char code LedChar[] = {  //ÊýÂë¹ÜÏÔʾ×Ö·ûת»»±í
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

 bit i = 1,Key = 1;
unsigned int cnt = 0;
void main()
{
	EA = 1;
	KeyOut4 = 0;
	ENLED = 0;
	addr3 = 1;
	TMOD = 0x01;
	TH0 = 0xF8;
	TL0 =0xcb;
	addr1 = 0;
	addr2 = 0;
	addr0 = 0;
	ET0 = 1;
	TR0 = 1;
P0 = LedChar[cnt];
  while(1)
{
 if(Key != i)
 {
	if(i == 0)
	{
	P0 = LedChar[cnt];
	cnt++;
		if(cnt >= 15)
		{
		cnt = 0;
		}
	}
	i = Key;
 }
}	
}

void InterruptTimer0() interrupt 1
{
  static unsigned int arr = 0xff;
	TH0 = 0xF8;
	TL0 =0xcb;
	arr = (arr << 1) |  KeyIn2;
	if(arr == 0xff)
	{
	Key = 1;
	}
	else if(arr == 0x00)
	{
	Key = 0;
	}
	else {}
}	


5、用矩阵按键做一个简易减法计算器。

#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;

sbit KeyIn1 = P2^4;
sbit KeyIn2 = P2^5;
sbit KeyIn3 = P2^6;
sbit KeyIn4 = P2^7;

sbit KeyOut1 = P2^3;
sbit KeyOut2 = P2^2;
sbit KeyOut3 = P2^1;
sbit KeyOut4 = P2^0;
unsigned char code LedChar[] = { 
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {  
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char code KeyCodeMap[4][4] = {
    { 0x31, 0x32, 0x33, 0x26 },
    { 0x34, 0x35, 0x36, 0x25 }, 
    { 0x37, 0x38, 0x39, 0x28 }, 
    { 0x30, 0x1B, 0x0D, 0x27 }  
};
unsigned char KeySta[4][4] = { 
    {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}
};

void KeyDriver();
void main()
{
	EA = 1;       
    ENLED = 0;   
    addr3 = 1;
    TMOD = 0x01;  
    TH0  = 0xFC;  
    TL0  = 0x67;
    ET0  = 1;     
    TR0  = 1;     
    LedBuff[0] = LedChar[0];  
	
    while (1)
    {
        KeyDriver();   
    }
	
}


	

void ShowNumber(long num)
	{
	 signed char i;
    unsigned char sign;
    unsigned char buf[6];
    
    if (num < 0) 
    {
        sign = 1;
        num = -num;
    }
    else
    {
        sign = 0;
    }
    for (i=0; i<6; i++)   
    {
        buf[i] = num % 10;
        num = num / 10;
    }
    for (i=5; i>=1; i--) 
    {
        if (buf[i] == 0)
            LedBuff[i] = 0xFF;
        else
            break;
    }
    if (sign != 0)        
    {
        if (i < 5)        
        {
            LedBuff[i+1] = 0xBF;
        }
    }
    for ( ; i>=0; i--)  
    {
        LedBuff[i] = LedChar[buf[i]];
    }
	}
void KeyAction(unsigned char keycode)
{
    static char oprt = 0;    
    static long result = 0;  
    static long addend = 0;  
    
    if ((keycode>=0x30) && (keycode<=0x39)) 
    {
        addend = (addend*10)+(keycode-0x30); 
        ShowNumber(addend);  
    }
    else if (keycode == 0x26) 
    {
        oprt = 0;              
        result = addend;      
        addend = 0;            
        ShowNumber(addend);    
    }
    else if (keycode == 0x28) 
    {
        oprt = 1;              
        result = addend;
        addend = 0;           
        ShowNumber(addend);    
    }
    else if (keycode == 0x0D)  
    {
        if (oprt == 0)
        {
            result += addend;  
        }
        else
        {
            result -= addend;  
        }
        addend = 0;
        ShowNumber(result);    
    }
    else if (keycode == 0x1B)  
    {
        addend = 0;
        result = 0;
        ShowNumber(addend);  
    }
}
void KeyDriver()
{
    unsigned char i, j;
    static unsigned char backup[4][4] = {  
        {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}
    };
    
    for (i=0; i<4; i++)  
    {
        for (j=0; j<4; j++)
        {
            if (backup[i][j] != KeySta[i][j])  
            {
                if (backup[i][j] != 0)           
                {
                    KeyAction(KeyCodeMap[i][j]); 
                }
                backup[i][j] = KeySta[i][j];     
            }
        }
    }
}
	



	void KeyScan()
{
  static	unsigned char add = 0;
	 unsigned char j ;
  static unsigned char keybuf[4][4] = {  
        {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}
    };
	    keybuf[add][0] = (keybuf[add][0] << 1) | KeyIn1;
			keybuf[add][1] = (keybuf[add][1] << 1) | KeyIn2;
			keybuf[add][2] = (keybuf[add][2] << 1) | KeyIn3;
			keybuf[add][3] = (keybuf[add][3] << 1) | KeyIn4;
		for(j = 0;j <4;j++)
		{
		if( (keybuf[add][j] & 0x0F) == 0x00 )
		{
		  KeySta[add][j] = 0;
		}
		else if((keybuf[add][j] & 0x0F) == 0x0f)
		{
			KeySta[add][j] = 1;
		}
		}
    add++;
		add = add & 0x03;
		switch(add)
		{
			case 0:KeyOut4 = 1;KeyOut1 = 0;break;
			case 1:KeyOut1 = 1;KeyOut2 = 0;break;
			case 2:KeyOut2 = 1;KeyOut3 = 0;break;
			case 3:KeyOut3 = 1;KeyOut4 = 0;break;
			default:break;
		}
}
void LedScan() 
{
 static unsigned char i = 0;
	P0 = 0xff;
	switch(i)
	{
		    case 0:addr2 = 0;addr1 = 0;addr0 = 0;i++;P0 = LedBuff[0];break;
				case 1:addr2 = 0;addr1 = 0;addr0 = 1;i++;P0 = LedBuff[1];break;
				case 2:addr2 = 0;addr1 = 1;addr0 = 0;i++;P0 = LedBuff[2];break;
				case 3:addr2 = 0;addr1 = 1;addr0 = 1;i++;P0 = LedBuff[3];break;
				case 4:addr2 = 1;addr1 = 0;addr0 = 0;i++;P0 = LedBuff[4];break;
				case 5:addr2 = 1;addr1 = 0;addr0 = 1;i=0;P0 = LedBuff[5];break;
		default:break;
	}
}	
void InterruptTimer0() interrupt 1
{
    TH0 = 0xFC;  
    TL0 = 0x67;
    LedScan();   
    KeyScan();  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NB!移动端APP自动化安全分析平台

工具介绍 MobSF是一款自动化的一体化移动应用程序 (Android/iOS/Windows) 渗透测试、恶意软件分析和安全评估框架&#xff0c;能够执行静态和动态分析。 MobSF 支持移动应用程序二进制文件&#xff08;APK、XAPK、IPA 和 APPX&#xff09;以及压缩源代码&#xff0c;并提供 R…

9.15 QT作业

头文件 #ifndef MYCK_H #define MYCK_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class myck; } QT_END_NAMESPACEclass myck : public QWidget {Q_OBJECTpublic:myck(QWidget *parent nullptr);~myck();private:Ui::myck *ui; }; #endif // MYCK_H 源文件…

Linux服务器部署常用命令记录【持续更新】

介绍&#xff1a;最近服务器被人频繁攻击&#xff0c;留下一堆垃圾文件。重装后需要重新部署&#xff0c;才发现Linux的命令怎么这么碎。于是乎就产生了写这篇文章的想法。本文旨在记录常用的Linux部署需要使用的命令&#xff0c;另一篇关于Linux docker安装常用软件的文章&…

OpenCV(四十六):特征点匹配

1.特征点匹配的定义 特征点匹配是一种在两幅图像中寻找相互对应的特征点&#xff0c;并建立它们之间的对应关系的过程。具体而言&#xff0c;首先通过特征检测算法在两幅图像中寻找相互对应的特征点&#xff0c;然后&#xff0c;对于每个特征点&#xff0c;通过描述子提取算法计…

ipad手写笔有必要买吗?好用的平板触控笔

众所周知&#xff0c;随着Apple pencil的出现&#xff0c;市面上出现越来越多平替电容笔的出现&#xff0c;无论是价格和功能&#xff0c;几乎都很接近。很多小伙伴不知如何下手&#xff0c;不知道如何从众多品牌中挑选出适合自己的电容笔&#xff0c;今天我为大家总结一下网上…

网络安全含金量有多高?网络安全工程师技术好学吗?网络安全怎么入门?

随着科学技术的发展&#xff0c;互联网等行业急需网络安全人才。各大企业和个人越来越重视网络安全技术。行业市场也催生出很多网络安全需求方向&#xff0c;为网络安全从业者提供了更多就业方向及机会。那么网络安全含金量有多高&#xff1f; 网络安全含金量有多高&#xff1…

MySQL数据库之表的约束

目录 前言 一、空属性 二、默认值 三、列描述 四、zerofill 五、主键 六、自增长 七、唯一键 八、外键 前言 数据库表的约束是用来规定表中的数据规则的。如果存在违反约束的数据行为&#xff0c;行为会被约束终止。约束可以保证数据库中数据的准确性和可靠性。 一、空属性 两…

【Proteus仿真】【STM32单片机】基于stm32的智能书桌设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后&#xff0c;默认为手动模式&#xff0c;当检测有人&#xff0c;可通过K2键开关灯&#xff0c;如果姿势不对&#xff0c; 警示灯亮&#xff0c;否则灭&#xff1b;可通过K3和K4键调节桌子高度&…

模板初阶(函数模板和类模板)

文章目录 1.函数模板1.1函数模板定义格式1.2关于模板实例化的一些小问题 2.类模板2.1 类模板的定义格式 1.函数模板 1.1函数模板定义格式 模板源于C语言一些短板没有解决 #include <stdio.h> #include<iostream> using namespace std; void Swap(int& left,…

Matlab图像处理-HSV

HSV HSV(色调、饱和度、数值)是人们从颜色轮或调色板中挑选颜色(即颜料或油墨)时所用的几种彩色系统之一。这种彩色系统与RGB系统相比&#xff0c;更加接近于人们的经验和描述彩色感觉时所用的方式。在艺术领域&#xff0c;色调、饱和度和数值分别称为色泽、明暗和调色。 HSV…

硬件预取之空间预取

《data prefetching techniques in computer system》翻译之空间预取器 2 Spatial prefetching 数据预取器需要在应用程序运行时预测处理器未来的内存访问。为此&#xff0c;它们通常依赖于数据访问之间的循环模式或相关性。在处理器上运行时&#xff0c;应用程序的数据访问中…

Vulnhub系列靶机-THM-ContainMe-v4

文章目录 Vulnhub系列靶机-THM-ContainMe-v41. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用4. 权限提升 Vulnhub系列靶机-THM-ContainMe-v4 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.188端口扫描出来了&#…

Python 扩展后的赋值运算符

视频版教程 Python3零基础7天入门实战视频教程 以下&#xff0c;假设变量a为10&#xff0c;变量c为21&#xff1a; 实例代码&#xff1a; c a print("ca c", c)c - a print("c-a c", c)c * a print("c*a c", c)c / a print("c/a c"…

【Java基础夯实】枚举类回炉重造

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Ja…

如何开发你的第一个Vue.js插件:完整指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

思科路由器:NAT的基础配置

一直以来&#xff0c;对于华为、H3C、锐捷交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;三家交换机的配置命令容易弄混&#xff0c;经常在实际项目配置中出错&#xff0c;因此&#xff0c;找几个基础的示例来练练。 R1配置 Router>en Router>enable Rout…

STM32单片机——串口通信(轮询+中断)

STM32单片机——串口通信&#xff08;轮询中断&#xff09; 串口通信相关概念HAL库解析及CubeMX工程配置与程序设计常用函数介绍CubeMX工程配置HAL库程序设计&#xff08;轮询中断&#xff09;轮询数据收发中断收发数据 固件库程序设计及实现固件库配置流程结构体配置及初始化程…

Python 基础知识结构

一、关键字 二、内置函数 三、运算符 1、算数运算符 加 数字与字符串拼接 - 减 * 乘 数字与字符串重复 / 除 返回浮点数 % 取模 返回除法的余数 奇偶判断 ** 幂次 // 整除 返回商的整数部分&#xff0c;向下取整数&#xff0c;注意&#xff1a;-10//3,出现负数时的情况只要参…

Java反序列化和php反序列化的区别

文章目录 PHP反序列化漏洞反序列化漏洞什么是反序列化漏洞&#xff1f;修改序列化后的数据&#xff0c;目的是什么&#xff1f; Java反序列化漏洞反序列化漏洞 PHP反序列化漏洞 序列化存在的意义是为了传输数据/对象&#xff0c;类是无法直接进行传输的。通过序列化后转换为字…

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN)

文章目录 1、服务概述1.1 HDFS1.1.1 架构解析1.1.1.1 Block 数据块1.1.1.2 NameNode 名称节点1.1.1.3 Secondary NameNode 第二名称节点1.1.1.4 DataNode 数据节点1.1.1.5 Block Caching 块缓存1.1.1.6 HDFS Federation 联邦1.1.1.7 Rack Awareness 机架感知 1.1.2 读写操作与可…