【Proteus仿真】51单片机矩阵按键+中断+数码管显示+串口输出

news2024/10/6 16:23:08

【Proteus仿真】51单片机矩阵按键+中断+数码管显示+串口输出


  • 📌相关篇《【Proteus仿真】51单片机矩阵按键扫描+外部中断使用》
  • 📍《【Proteus仿真】51单片机串口输出实验》
  • 🎈 《【Proteus仿真】51单片机定时器计数+共阴数码管驱动显示》
  • 🔖Proteus仿真基础实验综合篇 -矩阵按键+中断+数码管显示+串口输出
  • 🌿Proteus8.12平台
  • 🌿本实验代码基于VSM Studio,采用SDCC编译器。
  • 🎬仿真演示:
    在这里插入图片描述

在这里插入图片描述

📝示例代码

/* Main.c file generated by New Project wizard
 *
* Created:  2023-5-22
 * Processor: 80C52
 * Compiler:  SDCC for 8051
 */
#include <mcs51reg.h>
//#include <compiler.h>		//NOP()
//#include <8052.h>
//#include <stc89.h>
#include <stdio.h>

#define FOSC 11059200UL      //System frequency
#define BAUD 9600           //UART baudrate

#define T1MS (65536-FOSC/12/1000)   //1ms timer

#define COL1 (0xEF)
#define COL2 (0xDF)
#define COL3 (0xBF)
#define COL4 (0x7F)

#define wei1 (P2_0)
#define  wei2 (P2_1)
#define LED         (P2_2)

unsigned char key_val[] = {
    COL1, COL2, COL3, COL4
};

unsigned char  __code key_data[] = {
    0xEE, 0xED, 0xEB, 0xE7, // Key  1,  2,  3,  4
    0xDE, 0xDD, 0xDB, 0xD7, // Key  5,  6,  7,  8
    0xBE, 0xBD, 0xBB, 0xB7, // Key  9, 10, 11, 12
    0x7E, 0x7D, 0x7B, 0x77, // Key 13, 14, 15, 16
};
unsigned char __code table[] = {//
    0x3f,0x06,0x5b,0x4f,// 0 1 2 3
    0x66,0x6d,0x7d,0x07,// 4 5 6 7
    0x7f,0x6f // 8 9 
};

unsigned char key_row = 0;
unsigned char key_col = 0;
unsigned char Button_value = 0;
//unsigned int count = 0;

void delayms(unsigned int ms)
{
    unsigned int x;
    unsigned int y;
 
    for (y=ms; y>0; y--)
    {
        for (x=227; x>0; x--)
            ;
    }
}


void uart_init()
{
    SCON |= 0x50;
    TMOD |= 0x20;

 //  TH1 = 0xFD;//波特率9600
 //   TL1 = 0xFD;
	TH1 = (unsigned char)(((65536 - (FOSC/32/BAUD) )>>8)  - 2) ; 
	TL1 =  (unsigned char)(65536- (FOSC/32/BAUD)  - 2) ;
	TR1 = 1;
}

void SendData(char data1)
{
    SBUF = data1;
    while (!TI) ;
    TI = 0;
}

void SendString(unsigned char *buffer)
{
    unsigned char *p = buffer;
    while (*p)
    {
        SendData(*p);
        p++;
    }
}

int putchar(int data1)
{
	SendData(data1);
 return data1;

}

void int0_init()
{
    IT0 = 1; // 下降沿触发
    EX0 = 1; // 开外部中断0
	 EA = 1;                         //open global interrupt switch
}

void key_scan()
{
    unsigned char i = 0;

    for (i=0; i<4; i++)
    {
        key_col = key_val[i];
        P1 = key_col;
		delayms(2);
    }
}

void key_value(unsigned char value)
{
    unsigned char i = 0;
    for (i=0; i<16; i++)
    {
        if (value == key_data[i])
        {
			Button_value = i + 1;
			printf("Keyvalue:%d \r\n",Button_value);           
        }
    }
}
/*------------------------------------------------
                 外部中断(INT0)中断子程序
------------------------------------------------*/
void int0_isr(void) __interrupt 0 __using 1
{
    EX0 = 0;
    delayms(10); // 延时去抖
    key_row = P1;
    key_value(key_row);
    EX0 = 1;
}
void led_off()
{
    wei1= 1;
    wei2= 1;
}

void Display()
{
			TR0 = 0;                        //timer0 STOP
			wei1=0,wei2=1;
            P0= table[Button_value/10];
			delayms(6);
//			NOP();NOP();NOP();NOP();
			led_off();

			delayms(1);	//消隐
			NOP();NOP();
			wei1=1,wei2=0;
			P0= table[Button_value%10];
//			NOP();NOP();NOP();NOP();
			delayms(6);
//			NOP();NOP();
			led_off();
			delayms(1);	//消隐
			TR0 = 1;                        //timer0 start running
}
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
	
	TMOD |=  0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    TL0 = T1MS;                     //initial timer0 low byte
    TH0 = T1MS >> 8;                //initial timer0 high byte
    TR0 = 1;                        //timer0 start running
    ET0 = 1;                        //enable timer0 interrupt
    EA = 1;                         //open global interrupt switch
}

/*------------------------------------------------
                 定时器0中断子程序
------------------------------------------------*/
void Timer0_isr(void) __interrupt 1 __using 2
{
	  TL0 = T1MS;                     //reload timer0 low byte
    TH0 = T1MS >> 8;                //reload timer0 high byte
	Display();
     LED = ! LED;    //指示灯反相,可以看到闪烁		


}
void main(void)
{

    Init_Timer0();
    int0_init();
    uart_init();
    while (1)
    {
	        // 键盘扫描
        key_scan();
		
    }
}

📚仿真资源

链接: https://pan.baidu.com/s/184Fl5bKJRg4HmRVFqSzW2g
提取码: vetd

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

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

相关文章

PMP-敏捷管理知识总结

敏捷管理 敏捷管理 01敏捷开发是一种以人为核心、迭代、循序渐进的开发方法&#xff0c;在敏捷开发中&#xff0c;项目的构建被切分成多个子项目&#xff0c;各个子项目的成果都经过测试&#xff0c;具备集成和可运行的特征 。 敏捷项目管理简化了繁琐的流程和文档管理&…

考研考公太卷了,出国留学能弯道超车吗?

这届年轻人太难了&#xff01; 国内高考人数越来越多&#xff0c;考上好大学的难度很大。2022年&#xff0c;高考报名人数是1193万&#xff0c;但考上本科的只有466万&#xff0c;考上双一流大学的不足50万&#xff0c;上双一流大学考生的比例不到5%。 高考只是卷的开始&…

软件代码设计-小优化(五)

产品需求&#xff1a; 按照天统计策略信收信人数和收信次数。以前策略信只有发送是没有收集的&#xff0c;现在要数据咋办&#xff0c;得收集啊。 设计方案&#xff1a; 因为策略信的发送是在一个单独的工程里&#xff0c;没有连接数据库。于是收集策略信放到了redis的list里&a…

第03章 流程控制语句

流程控制语句是用来控制程序中各语句执行顺序的语句&#xff0c;可以把语句组合成能完成一定功能的小逻辑模块。 程序设计中规定的三种流程结构&#xff0c;即&#xff1a; 顺序结构 程序从上到下逐行地执行&#xff0c;中间没有任何判断和跳转。 分支结构 根据条件&#xff0…

软件测试理论----测试设计方法论

1、测试用例格式 &#xff08;1&#xff09;用例编号&#xff1a;用例的唯一标识&#xff0c;要求具有易识别性和易维护性&#xff0c;能能够根据用例编号识别用例的目的和作用&#xff0c;一般格式为&#xff1a;A-B-C-D 其中 A&#xff1a;一般表示产品或者项目名称B&#…

Linux的启动流程

文章目录 Linux的启动流程BIOS、boot loader与kernel加载BIOSboot loader加载内核检测硬件与 initramfs 的功能 Linux的启动流程 本文章参考&#xff1a; [Uncertainty!!]的Linux的启动流程 Linux的启动流程是一个非常复杂的过程&#xff0c;下面是对Linux启动流程的详细分析&a…

JDBC-Java与数据库之间的桥梁

1、JDBC 1.1、数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c; 数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多通过各种关系数…

IO流详解

IO流 1. 文件 1.1 什么是文件 文件对大家来说都不陌生&#xff1a; 文件是保存数据的地方&#xff0c;它可以保存文字、图片、视频等等例如大家平时使用的word文档、Excel文档、PPT文档等都是文件 1.2 文件流 文件在程序中是以流的形式来操作的流是指数据在数据源&#x…

mydumper - 备份恢复工具

文章目录 介绍部署安装功能 参数详解mydumpermyloader配置文件 实际示例操作性能验证 补充definerlock 总结相关链接 介绍 部署安装 # 当前最新 release wget https://github.com/mydumper/mydumper/releases/download/v0.14.4-8/mydumper-0.14.4-8.el7.x86_64.rpm# 安装 rpm…

Linux 之 firewalld 防火墙

目录 firewalld概述firewalld 与 iptables 的区别&#xff1a;firewalld 区域的概念firewalld防火墙预定义了9个区域:firewalld 数据处理的流程 firewalld防火墙的配置方法&#xff1a;永久保存配置 firewalld概述 firewalld防火墙是Centos7系统默认的防火墙管理工具&#xff…

数据分析与预处理常用的图和代码

1.训练集和测试集统计数据描述之间的差异作图&#xff1a; def diff_color(x):color red if x<0 else (green if x > 0 else black)return fcolor: {color}(train.describe() - test.describe())[features].T.iloc[:,1:].style\.bar(subset[mean, std], alignmid, colo…

国内做校园信息化的龙头企业公司有哪些?

随着数字化转型的加速&#xff0c;越来越多的学校开始寻求校园信息化的解决方案&#xff0c;相比于传统信息化模式&#xff0c;国内有哪些做校园信息化做得比较好的企业&#xff1f;他们采用的又是什么样的方式&#xff1f; 一文带你了解&#xff0c;零代码平台搭建校园信息化…

Android 14 又来了?别扶!抬起我来吧!

Android 14 又来了&#xff1f;别扶&#xff01;抬起我来吧&#xff01; 大家好&#xff0c;好久不见&#xff0c;从去年底写完年终总结之后就再也没有更新过文章&#xff0c;之前最多也就间隔一两个月时间&#xff0c;但这回间隔时间确实有点长&#xff0c;基本快半年了&…

每日一练 | 网络工程师软考真题 Day7

1、如果希望别的计算机不能通过ping命令测试效劳器的连通情况&#xff0c;可以 &#xff08;1&#xff09; 。如果希望通过默认的Telnet端口连接效劳器&#xff0c;那么下面对防火墙配置正确的选项是 &#xff08;2&#xff09; 。 &#xff08;1&#xff09; A&#xff0…

为什么说2023年是学华为认证的最佳时机?学华为认证有什么优势?

华为认证数通方向2016年以前叫数通&#xff0c;2017年开始改为R&S&#xff08;路由交换&#xff09;&#xff0c;2021年正式升级为Datacom。 新版数通认证更聚焦于技术在现实工作场景中的应用&#xff0c;并融入了大量新技术新应用&#xff0c;实用价值更高。 通过系统学…

用java带你了解IO模型

目录 1.BIO1.1 简述1.2 代码示例1.3优点和缺点1.4 思考 2. NoBlockingIO2.1 简述2.2 代码示例2.3 优点和缺点2.4 思考 3. NIO&#xff08;NewIO&#xff09;3.1 简述3.2 代码示例3.3 优点和缺点3.3 思考 4. 扩展select/poll、epoll4.1 简述4.2 select/poll4.3 epoll4.4 扩展话题…

设计模式之【备忘录模式】,“后悔药”是可以有的

文章目录 一、什么是备忘录模式1、备忘录模式使用场景2、备忘录模式优缺点3、备忘录模式的三大角色4、白箱备忘录和黑箱备忘录5、思考&#xff1a;备份频率快&#xff0c;备份对象大的备忘录应该如何设计 二、实例1、备忘录模式的一般写法2、使用栈管理富文本编辑器3、游戏状态…

【Linux】shell编程—sed编辑器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、sed编辑器1.sed工作流程2.sed工作场景3.sed常用选项 二、sed编辑器基本用法1.打印操作2.打印行号3.增加操作4.插入操作5.替换操作7.字符转换 一、sed编辑器 sed…

RabbitMQ(2)

一、MQ的问题 基于上篇存在的问题 1. 问题说明 MQ在分布式项目中是非常重要的&#xff0c; 它可以实现异步、削峰、解耦&#xff0c;但是在项目中引入MQ也会带来一系列的问题。 今天我们要解决以下几个常见的问题&#xff1a; 消息可靠性问题&#xff1a;如何确保消息被成功送…

编译flink1.6源码并打包成CDH6.3.2的parcel

说明&#xff1a;scala &#xff1a;2.12&#xff0c;maven:3.6.1, java:1.8&#xff0c;macOS 1、指定scala,maven的环境变量 sudo vi ~/.bash_profile export PATH$PATH:$M2_HOME/bin:/Users/admin/Documents/softwares/scala-2.12.17/bin2、克隆flink代码 git clone https…