记录一下3

项目场景:

单个数码管,实现动态显示


问题描述

使用delay函数实现的话,是对每个数码管的段进行操作,但是这些引脚没在同一端口,要使用定时器实现就遇到了问题。

#ifndef _MAIN_C_
#define _MAIN_C_

#include "include/ca51f155_config.h"		
#include "include/ca51f155sfr.h"
#include "include/ca51f155xsfr.h"
#include "include/gpiodef_f155.h"
#include "include/system_clock.h"

#include "include/uart.h"
#include "include/lcd_led.h"
#include "include/delay.h"
#include <intrins.h>
		

#define SMIT_EN(N)		(N<<6)		
#define SINK(N)			(N<<3)		
#define SINK_EN(N)		(N<<2)		
#define DRV(N)			(N<<1)		
#define SR(N)			(N<<0)		


void main(void)
{
	unsigned char i;
	P31F = 2;
	P30F = 2;P34F = 2;P17F = 2;P35F = 2;P13F = 2;P14F = 2;P15F = 2;P16F = 2;
	for(i = 0; i < 9; i++)
	{
		INDEX = i;
		LXDAT = 0;
	}
	LXDIVH = 0;															
	LXDIVL = 112;	
	LXCFG =	 COMHV(COM_L) | SEGHV(SEG_H) | BLNK(0) | LDRV(LDRV_7);		
	LXCON =  LEN(LEN_IRCH) | LMOD(LMOD_led);	 					
	
	while(1)
	{
		P16=1;P15=1;P34=1;P14=1;P13=1;P17=1;P30=0;P35=0;
		Delay_ms(1000);
		P16=0;P15=1;P34=1;P14=0;P13=0;P17=0;P30=0;P35=0;
		Delay_ms(1000);
		P16=1;P15=1;P34=0;P14=1;P13=1;P17=0;P30=1;P35=0;
		Delay_ms(1000);
		P16=1;P15=1;P34=1;P14=1;P13=0;P17=0;P30=1;P35=0;
		Delay_ms(1000);
		P16=0;P15=1;P34=1;P14=0;P13=0;P17=1;P30=1;P35=0;
		Delay_ms(1000);
		P16=1;P15=0;P34=1;P14=1;P13=0;P17=1;P30=1;P35=0;
		Delay_ms(1000);
		P16=1;P15=0;P34=1;P14=1;P13=1;P17=1;P30=1;P35=0;
		Delay_ms(1000);
		P16=1;P15=1;P34=1;P14=0;P13=0;P17=0;P30=0;P35=0;
		Delay_ms(1000);
		P16=1;P15=1;P34=1;P14=1;P13=1;P17=1;P30=1;P35=0;
		Delay_ms(1000);
		P16=1;P15=1;P34=1;P14=1;P13=0;P17=1;P30=1;P35=0;
		Delay_ms(1000);
	}
}
#endif

解决方案:

对数码管各段排列进行编码,并把它放在一个数组中,利用位操作对每一个引脚进行判断,使其电平发生变化,在定时中断函数中使指标进行累加,从而实现动态显示,具体可见“记录一下2”。

#ifndef _MAIN_C_
#define _MAIN_C_
/*********************************************************************************************************************/
#include "include/ca51f155_config.h"		
#include "include/ca51f155sfr.h"
#include "include/ca51f155xsfr.h"
#include "include/gpiodef_f155.h"
#include "include/system_clock.h"

#include "include/uart.h"
#include "include/lcd_led.h"
#include "include/delay.h"
#include <intrins.h>
		

#define SMIT_EN(N)		(N<<6)		
#define SINK(N)			(N<<3)		
#define SINK_EN(N)		(N<<2)		
#define DRV(N)			(N<<1)		
#define SR(N)			(N<<0)		

unsigned char gsmg_code[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
void lighten_duan (unsigned char a)
{
	P35=a&(1<<0);P30=a&(1<<1);P17=a&(1<<2);P13=a&(1<<3);P14=a&(1<<4);P34=a&(1<<5);P15=a&(1<<6);P16=a&(1<<7);
}


void main(void)
{	
	unsigned char i;
	
	P31F = 2;//3&8
	P30F = 2;P34F = 2;P17F = 2;P35F = 2;P13F = 2;P14F = 2;P15F = 2;P16F = 2;//other
	P43F = 2;P43(0);P42F=2;P41F=2;P37F=2;//3LED
	
	for(i = 0; i < 9; i++)
	{
		INDEX = i;
		LXDAT = 0;
	}
	LXDIVH = 0;															
	LXDIVL = 112;	
	LXCFG =	 COMHV(COM_L) | SEGHV(SEG_H) | BLNK(0) | LDRV(LDRV_7);		
	LXCON =  LEN(LEN_IRCH) | LMOD(LMOD_led);	 						
	
	while(1)
	{
		for(i=0;i<10;i++){
			lighten_duan(gsmg_code[i]);
			Delay_ms(1000);
		}
	}
}
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值