蓝桥杯单片机数码管

依然是使用标准模板写数码管显示,这里写一个简单的数码管显示。

基本思路

  • chuli():把要显示的数字存入数组
  • display():将数组里存的内容显示出来
  • chuli()放在主函数里,display()放在中断服务函数(定时刷新)里

smg.c

#include "smg.h"

uchar wei[8]={
     0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar duan[11]={
     0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar zhi[8]={
     0};//存显示内容的数组

void chuli(uchar d0,d1,d2,d3,d4,d5,d6,d7)//将显示的内容存入数组
{
     
	zhi[0]=d0;
	zhi[1]=d1;
	zhi[2]=d2;
	zhi[3]=d3;
	zhi[4]=d4;
	zhi[5]=d5;
	zhi[6]=d6;
	zhi[7]=d7;
}

void display()//显示
{
     
	static uchar i=0;
	
	Y7;P0=0xff;//消隐
	Y6;P0=wei[i];
	Y0;P0=0xff;//防止最后一位高亮
	Y7;P0=duan[zhi[i]];
	
	i++;
	if(i==8)i=0;
}

smg.h

#ifndef _SMG_H_
#define _SMG_H_

#include "common.h"

void chuli(uchar d0,d1,d2,d3,d4,d5,d6,d7);
void display(void);

#endif

ds.c

#include "ds.h"

extern uchar timer_flag;

void InitTimer0()//定时器初始化
{
     
	TMOD=0x01;
	TH0=(65535-1000)/256;
	TL0=(65535-1000)%256;
	ET0=1;
	TR0=1;
	EA=1;
}

void ServiceTimer0() interrupt 1//定时器0服务函数
{
     
	TH0=(65535-1000)/256;
	TL0=(65535-1000)%256;
	display();//显示函数,每1ms刷新一次
	timer_flag=1;
}

ds.h

#ifndef _DS_H_
#define _DS_H_

#include "common.h"
#include "smg.h"

void InitTimer0(void);

#endif

main.c

#include "main.h"

uchar timer_flag=0;

void main()
{
     
	cls_buzz();
	InitTimer0();
	while(1)
	{
     
		if(timer_flag==1)
		{
     
			//chuli(1,2,10,3,4,10,5,6);//显示12-34-56
			chuli(1,10,2,10,3,10,4,10);//将需要显示的内容在这里写入显示1-2-3-4-,duan[10]数组里第10个存的是是-
			timer_flag=1;
		}
	}
}

main.h

#ifndef _MAIN_H_
#define _MAIN_H_

#include "common.h"
#include "ds.h"
#include "smg.h"

#endif

common.c

#include "common.h"

void cls_buzz()//关闭蜂鸣器、灯光
{
     
	Y4;P0=0xff;
	Y5;P0=0xa0&(P0|0x5f);
}

common.h

#ifndef _COMMON_H_
#define _COMMON_H_

#include "STC15F2K60S2.h"
#include 

#define uchar unsigned char
#define uint unsigned int
	
#define Y4 P2=0x9f&(P2|0xe0);
#define Y5 P2=0xbf&(P2|0xe0);
#define Y6 P2=0xdf&(P2|0xe0);
#define Y7 P2=0xff&(P2|0xe0);
#define Y0 P2=0x1f&(P2|0xe0);

void cls_buzz(void);

#endif

这样写的好处:

  1. 把显示的内容和显示本身分开来写,当显示内容变换的时候,只需要处理显示内容的函数就可以。例如:模式1显示12-34-56,模式2显示1-2-3-4-,此时只需要在主函数中,修改chuli()里存的数组就可以。
  2. 显示display()放在定时器里刷新,基本都可以满足题目要求的显示刷新频率,同时,基本可以避免显示闪烁的问题。
  3. 模板固定,记住就行,无论是哪届蓝桥杯的题目,这个数码管显示都可以用
  4. 显示放在定时器里,对于那种闪烁显示的问题也可以很方便的解决!
    好啦~这部分到这里都结束啦!
    目前我发布的都是基础模块的教程,慢慢积累,后面就可以上真题啦!有问题或者有比较着急要的资料私聊给我评论给我都可以!!我几乎每天都会回复

你可能感兴趣的:(蓝桥杯,单片机,c语言)