蓝桥杯小tips(二)数码管闪烁的另一种底层构建

不知道为什么整体赋值会闪奇怪的值,所以先试试单个数码管赋值的方式

//seg.c

#include "sge.h"

unsigned char seg_dat[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
unsigned char seg_pos[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


void Seg_Disp(unsigned char dat,pos,point)
{
	P0 = 0xff;
	P2 = P2 & 0x1f | 0xe0;
	P2 &= 0x1f;

	P0 = seg_dat[dat];
	P2 = P2 & 0x1f | 0xc0;
	P2 &= 0x1f;
	
	P0 = seg_pos[pos];
	if(point)
		P0 &= 0x7f;
	P2 = P2 & 0x1f | 0xe0;
	P2 &= 0x1f;	
}
//main.c
#include "seg.h"
#include "stdio.h"

unsigned char num;

unsigned char seg_buf[8]={10,10,10,10,10,10,10,10};
unsigned char seg_ponit[8]={0,0,0,0,0,0,0,0};
unsigned char seg_pos;
unsigned char seg_down;
bit seg_disp_flag;
bit seg_spark_flag;
void tm1_isr() interrupt 3
{
	static unsigned int t_400ms;
	if(++seg_down== 500) seg_down = 0;
	if(++seg_pos==8) seg_pos=0;
	Seg_Disp(seg_buf,seg_buf[seg_pos],seg_point[seg_pos]);

	if(++t_400ms==400)
	{
		t_400ms=0;
		seg_disp_flag^=1;
	}
}
void Seg_Proc(void)
{
	//减速写吐了,省略
	//想显示的-?-ffff22.5
	
	float k;
	//如果第7位有小数点
	seg_point[6]=1;
	
	seg_buf[0] = seg_buf[2] = 11;
	seg_buf[1] = num+1;
	seg_buf[5] = (unsigned char)k/10;
	seg_buf[6] = (unsigned char)k%10;
	seg_buf[7] = (unsigned int)(k*10)% 10;
	if(seg_spark_flag==1)
	{
		//全熄灭
		for(unsigned char i=0;i<8;i+)
		{
			seg_buf[i]=10;
		}
	}
	else if(seg_spark_flag==2)
	{
		seg_buf[0]=seg_buf[2]=seg_disp_flag?10:11;
		seg_buf[1]=seg_disp_flag?10:num+1;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值