当前位置: 首页 > article >正文

单片机基础模块学习——数码管(二)

一、数码管模块代码

这部分包括将数码管想要显示的字符转换成对应段码的函数,另外还包括数码管显示函数

值得注意的是对于小数点不显示部分的处理方式


由于小数点没有单独占一位,所以这里用到了两个变量i,j用于跳过小数点导致的占据其他字符显示在数码管上的位置


不想让某一位数码管显示的时候,用空格来代替,根据共阳数码管原理图,应将P0引脚全部设为高电平才可熄灭

#include "seg.h"

//段码转换函数
//0xc0
//1100 0000  
//以上分别对应这8位dp g f e d c b a
//共阳数码管为低电平时被点亮
//传入两个数组,第一个为传入的想要转换的数,第二个为相对应的转换后的段码
//之所以为*,因为传进来的不只是一个字符,而是一个字符串或者是一个字符数组
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code)
{
	unsigned char i,j;
	for(i=0,j=0;i<=7;i++,j++)
	{
		switch(pucSeg_Buf[j])
		{
			case '0':
				pucSeg_Code[i]=0xc0;
			break;
			case '1':
				pucSeg_Code[i]=0xf9;
			break;
			case '2':
				pucSeg_Code[i]=0xa4;
			break;
			case '3':
				pucSeg_Code[i]=0xb0;
			break;
			case '4':
				pucSeg_Code[i]=0x99;
			break;
			case '5':
				pucSeg_Code[i]=0x92;
			break;
			case '6':
				pucSeg_Code[i]=0x82;
			break;
			case '7':
				pucSeg_Code[i]=0xf8;
			break;
			case '8':
				pucSeg_Code[i]=0x80;
			break;
			case '9':
				pucSeg_Code[i]=0x90;
			break;
			case 'A':
				pucSeg_Code[i]=0x88;
			break;
			case 'b':
				pucSeg_Code[i]=0x83;
			break;
			case 'C':
				pucSeg_Code[i]=0xc6;
			break;
			case 'd':
				pucSeg_Code[i]=0xa1;
			break;
			case 'E':
				pucSeg_Code[i]=0x86;
			break;
			case 'F':
				pucSeg_Code[i]=0x8e;
			break;
			case ' ':
				pucSeg_Code[i]=0xff;
			break;
		}
		if(pucSeg_Buf[j+1] =='.')
			{
				pucSeg_Code[i]&=0x7F;//0111 1111l与运算,与1不变,与0取反
				j++;
			}
	}
}

void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos)
{
	
		P0 =pucSeg_Code[ucSeg_Pos];	
		P2=P2&0x1F|0xE0;	
		P2=P2&0x1F;
	
		P0 =1<<ucSeg_Pos;//根据ucSeg_Pos的值,只有对应位置为1,实现了对任一个想要点亮的数码管的控制
		P2=P2&0x1F|0xC0;	
		P2=P2&0x1F;
		
}

 二、主函数代码

注意这里面的pucSeg_Buf最保险应该开到17位,因为还包括8个小数点

#include "seg.h"
#include "tim.h"
#include "led.h"
#include "init.h"

//Seg
unsigned char pucSeg_Buf[12],pucSeg_Code[9],pucSeg_Pos=0;//字符数组以/0结尾,所以要有9位
void Seg_Proc(void);

//Timer
unsigned long ulms =0;
unsigned int uiSeg_Dly=0;

void main(void)
{
	Cls_Peripheral();
	Timer0Init();
	EA=1;
	
	while(1)
	{
		Seg_Proc();
	}

}

void Seg_Proc(void)
{
	if(uiSeg_Dly<200)
		return;
	
	uiSeg_Dly =0;
	
	sprintf(pucSeg_Buf,"12345678");//将指定的内容打印到字符数组里
	Seg_Tran(pucSeg_Buf,pucSeg_Code);
}

void Time_0(void) interrupt 1
{
	ulms++;
	uiSeg_Dly++;
	if(ulms % 2==0)
	{
	pucSeg_Pos=(pucSeg_Pos+1)%8;//实现pucSeg_Pos从0-7循环的操作
	Seg_Disp(pucSeg_Code,pucSeg_Pos);
	}
}

知识点

%4.1f

25.654  
25.7\0

8.53
 8.5\0
由于是4位,前面会加一个空格

如果想让上面的数左对齐,加一个负号
%-4.1f

126.34
126.3\0
虽然是4位,但是不满足条件时,也会超过4位


http://www.kler.cn/a/519808.html

相关文章:

  • oracle 分区表介绍
  • css3 svg制作404页面动画效果HTML源码
  • erase() 【删数函数】的使用
  • 「 机器人 」系统辨识实验浅谈
  • Vue入门(Vue基本语法、axios、组件、事件分发)
  • docker部署jenkins
  • 微信阅读网站小程序的设计与实现(LW+源码+讲解)
  • OLMo:开启AI研究新纪元的开放利器
  • 基于java线程池和EasyExcel实现异步导出
  • 如何使用Java爬虫获取AliExpress商品详情:代码示例与实践指南
  • python爬虫框架Scrapy简介
  • C#牵手Blazor,解锁跨平台Web应用开发新姿势
  • 机器人学习的范式转变:从专用走向通用基础模型
  • C# 中使用Hash用于密码加密
  • AI Agent的多轮对话:提升用户体验的关键技巧
  • Linux之Tcp粘包笔记
  • Oracle之Merge into函数使用
  • 蓝桥杯LQ1044 求完数
  • 不同路径(62)
  • 机器学习 ---逻辑回归
  • 手撕B-树
  • python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算
  • 修改 Go 版本后不生效?深入排查与解决方案
  • 代码随想录刷题day16|(哈希表篇)349.两个数组的交集
  • LeetCode hot 热题100 二叉树的层序遍历
  • ollama部署及实践记录,虚拟环境,pycharm等