小码农教你玩真正的数码管

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

教你玩真正的数码管

我们最终目标就是偷懒,一起工作是看你认真工作,我偷懒就是享受,所以为了偷懒框架式编程是必会的,以后我的博客里面希望人人都是框架式编程,那种无规则的就认真勤奋吧,我们太懒不配你们来看:joy:,记住我们是懒人族,就应该学懒的东西。

本次不玩虚的,没有什么数码管的概念了,我太懒不想找了,直接上干货

image-20211002094753239

上面那副图也就让你先大概了解一下,详细看下面

首先上面的文件你先创建好,然后再看代码与电路我说过只给懒人看,那写文件都没建好的你适合勤奋

image-20210930214127001

image-20211002095445294

image-20211002095902628

我这套板子个数码管芯片是SN74LS244(SN是厂家名字),

74LS244是三态八缓冲器

逻辑图

image-20211002100232513

这款芯片是用来驱动的,一句话他的驱动能力要比单片机IO驱动能力要大,也就是8位数码管同时工作的时候依旧生龙活虎

他用了很多IO口,但是方便了代码,也就是我们不怎么需要学这个芯片的代码,不需要看时序图,这对那些不太喜欢看时序图的是非常友好的,这个和HC595这款芯片有很大区别,我们老师那款就是这个芯片

为了你可以更懒我找一下那个逻辑图和时序图来给你们看看 串行输入转并行输出

逻辑图

image-20211002102342522

时序图

image-20211002102023787

代码

image-20211002102716173

要是不知道IO口原理可以看这篇文章,他是我哥哥写的 单片机IO口.

SN74LS244_Drive.c

#include "all.h"

u8 SN74LS244_Write_Buffer[2] = {0};
void SN74LS244_IO_Mode()
{
	P4M1 = 0;
	P4M0 = 0;
	//P4 = SN74LS244_Write_Buffer[0];//位选
	P7M1 = 0;
	P7M0 = 0;
	//P7 = SN74LS244_Write_Buffer[1];//段选
}
复制代码

SN74LS244_Drive.h

#ifndef SN74LS244_Drive
#define SN74LS244_Drive


//外部声明
extern u8 SMG_Write_Buffer[8];
extern u8 SN74LS244_Write_Buffer[2];


extern void SN74LS244_IO_Mode();
//extern void SN74LS244_Write_Data_Drive();


#endif
复制代码

实际上上面代码如果all.h文件没有问题是不会报错的,但是all.h有问题的话报错是报SN74LS244_Drive.h的错误,以后我会详细讲解这种类型的错误,今天只玩数码管

这时也就到了中层部分服务层

image-20211002112241885

image-20211002111825484

image-20211002112048871

image-20211002123940101


image-20211002130748018

image-20211002131403005

代码

SMG_Ser.c

#include "all.h"
u8 SMG_Write_Buffer[8] = {0xff,0xff,0xff,0xff,
                         0xff,0xff,0xff,0xff};//数码管缓存
//数码管段选
u8 code SMG_SEG[] = {0xC0,0xF9,0xA4,0xB0,  //0 1 2 3 
                     0x99,0x92,0x82,0xF8,  //4 5 6 7
                     0x80,0x90,0x88,0x83,  //8 9 a b
                     0xC6,0xA1,0x86,0x8E}; //c d e f 
//数码管位选
u8 code SMG_GRID[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


void delay()
{
	u8 i = 0;
	for(i = 0;i<100;i++);
}

//数码管显示服务
void SMG_Display_Ser()
{
	static u8 count = 0;
	switch(count)
	{
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		case 7:
			SN74LS244_Write_Buffer[1] = ~SMG_GRID[count];
			SN74LS244_Write_Buffer[0] = SMG_SEG[SMG_Write_Buffer[count]];
			P4 = SN74LS244_Write_Buffer[1];
			P7 = SN74LS244_Write_Buffer[0];
		    delay();
		    break;
	}
	count++;
	count = count%8;	
	
}
复制代码

SMG_Ser.h

#ifndef SMG_Ser
#define SMG_Ser

//外部声明
extern u8 code SMG_SEG[];
extern void SMG_Display_Ser();


#endif

复制代码

最后就到了主文件了

image-20211002132711660

刚开始时


运行一段时间后


上面就是死等的垃圾之处,就好像傲娇女一样,看见就来气

代码

main.c

#include "all.h"
sbit LED1 = P3^2;
sbit LED2 = P3^3;

//数码管分配
void SMG_Allot()//数码管需要进入服务层很快,
	//但数组是没必要一直刷,所以我们可以降低,刷新次数
{
	static xdata u16 count = 0;//放到外部RAM上面,降低内部ROM的空间
	count++;
	if(count>200)
	{
		count = 0;
		SMG_Write_Buffer[0] = 9;
		SMG_Write_Buffer[1] = 8;
		SMG_Write_Buffer[2] = 7;
		SMG_Write_Buffer[3] = 6;
		SMG_Write_Buffer[4] = 5;
		SMG_Write_Buffer[5] = 4;
		SMG_Write_Buffer[6] = 3;
		SMG_Write_Buffer[7] = 2;
	}	
	SMG_Display_Ser();
}
//void SN74LS244__Allot()
//{
//	static xdata u8 count = 0;
//	count++;
//	if(count>200)
//	{
//		count = 0;
//		SN74LS244_Write_Buffer[0] = 0xf0;
//	}
//}
//看门狗
void WDT_CONTR_Allot()
{
	static xdata u16 count = 0;
	count++;
	if(count>1000)
	{		
		count = 0;//超过1000计数器清零
		WDT_CONTR=0x34;	//启动看门狗和喂狗
	}
}

void main()
{
	SN74LS244_IO_Mode();
	WKTCH = 0xff;//掉电唤醒定时器高字节
	WKTCL = 0xff;//掉电唤醒定时器低字节
	PCON |= 0x02;
	
	while(1)
    {
		SMG_Allot();
		//WDT_CONTR_Allot();
	}
}
复制代码

项目脊梁

image-20211001013324843

代码

all.h

#include <STC15.h>


typedef unsigned char     u8;
typedef unsigned short    u16;
typedef unsigned long     u32;


#include "SN74LS244_Drive.h"
#include "SMG_Ser.h"
复制代码

猜你喜欢

转载自juejin.im/post/7033539460490854407