项目场景:
单个数码管,实现动态显示
问题描述
使用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