前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >蓝桥杯单片机矩阵按键扫描编程

蓝桥杯单片机矩阵按键扫描编程

作者头像
全栈程序员站长
发布于 2021-11-15 08:11:20
发布于 2021-11-15 08:11:20
43500
代码可运行
举报
运行总次数:0
代码可运行

蓝桥杯单片机中的NE555模块的编程,其实是很简单。简单来说就是计算一秒钟之内有多少个频率响应。中间所谓的频率响应也就是计算定时器作为计数器时候溢出的个数而已。能够考察的点就是这样子了,也要稍微了解,之后进行编程,就能够熟练掌握了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;


u8 t1_count;          // 定时一秒的计数变量

u16 t0_count;        // 存放临时得出的频率值
u16 t0_sum;          // 存放一秒的频率最终值


u8 code shuma[12] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};


// 系统初始化函数
void init_system()
{
   
    P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);

	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 0x00;
	P2 = (P2 & 0x1f);
}

	// 外设导通选择函数
void select(u8 local)
{
   
    switch(local)
	{
   
	    case(4): P2 = (P2 & 0x1f) | 0x80; break;
		case(5): P2 = (P2 & 0x1f) | 0xa0; break;
		case(6): P2 = (P2 & 0x1f) | 0xc0; break;
		case(7): P2 = (P2 & 0x1f) | 0xe0; break;
	}
}


void delay()
{
   
    u8 t = 200;
	while(t--);
}

void display(u8 local, u8 num)
{
   
    select(6);
	P0 = 0x80 >> (local - 1);
	P2 = P2 & 0x1f;

	select(7);
	P0 = num;
	P2 = P2 & 0x1f;

	// 数码管简单延时函数
	delay();

}

void close_display()
{
   
    // 消隐数码管
	select(6);
	P0 = 0x00;
	P2 = P2 & 0x1f;
}


void init_t1()
{
   
	TMOD = 0x16;		//定时器 T1 16位定时模式,定时器T0 计数模式

	TL0 = 0xff;
	TH0 = 0xff;

	TL1 = (65535 - 5000) % 256;		//5ms的定时
	TH1 = (65535 - 5000) / 256;		//5ms的定时

	EA = 1;

	ET1 = 1;
	TF1 = 0;		//溢出标志位
	TR1 = 1;		//T1中断开始位

	ET0 =1;
	TR0 = 1;
}

void server_t0() interrupt 1         // T0计数器的服务中断函数
{
   
    t0_count++;

}


void server_t1() interrupt 3        // 定时器T1的服务函数
{
   
    TL1 = (65535 - 5000) % 256;		//重置低八位
	TH1 = (65535 - 5000) / 256;		//重置高八位

	if(++t1_count == 200)         // 定时时间为1S
	{
   
		t0_sum = t0_count;       // 把计算到的频率数保存到t0_sum变量中
		t0_count = 0;
		t1_count = 0;
	}
}


void main()
{
   

	init_system();
	init_t1();
    while(1)
	{
   
	   display(8,0x8e);           // 最高位显示一个大写C
	   display(1, shuma[t0_sum%10]);
	   if(t0_sum > 9){
   display(2, shuma[t0_sum/10%10]);}  // 判断频率是否大于二位数,大于才显示,不大于不显示,后面类似
	   if(t0_sum > 99){
   display(3, shuma[t0_sum/100%10]);}
	   if(t0_sum > 999){
   display(4, shuma[t0_sum/1000%10]);}
	   if(t0_sum > 9999){
   display(2, shuma[t0_sum/10000%10]);}
	   close_display(); 
	}
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115108.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验