真正的数码管
Posted 小码农U
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了真正的数码管相关的知识,希望对你有一定的参考价值。
文章目录
联动文章 强者的回首–时钟心脏.
教你玩真正的数码管
我们最终目标就是偷懒,一起工作是看你认真工作,我偷懒就是享受,所以为了偷懒框架式编程是必会的,以后我的博客里面希望人人都是框架式编程,那种无规则的就认真勤奋吧,我们太懒不配你们来看😂,记住我们是懒人族,就应该学懒的东西。
本次不玩虚的,没有什么数码管的概念了,我太懒不想找了,直接上干货
上面那副图也就让你先大概了解一下,详细看下面
首先上面的文件你先创建好,然后再看代码与电路我说过只给懒人看,那写文件都没建好的你适合勤奋
我这套板子个数码管芯片是SN74LS244(SN是厂家名字),
74LS244是三态八缓冲器
逻辑图
这款芯片是用来驱动的,一句话他的驱动能力要比单片机IO驱动能力要大,也就是8位数码管同时工作的时候依旧生龙活虎
他用了很多IO口,但是方便了代码,也就是我们不怎么需要学这个芯片的代码,不需要看时序图,这对那些不太喜欢看时序图的是非常友好的,这个和HC595这款芯片有很大区别,我们老师那款就是这个芯片
为了你可以更懒我找一下那个逻辑图和时序图来给你们看看 串行输入转并行输出
逻辑图
时序图
代码
要是不知道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的错误,以后我会详细讲解这种类型的错误,今天只玩数码管
这时也就到了中层部分服务层
代码
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
最后就到了主文件了
刚开始时
运行一段时间后
上面就是死等的垃圾之处,就好像傲娇女一样,看见就来气
代码
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();
}
}
项目脊梁
代码
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"
联动文章 强者的回首–时钟心脏.
以上是关于真正的数码管的主要内容,如果未能解决你的问题,请参考以下文章