First
接着上一篇的静态显示
对于上次的显示程序稍稍改进了一下
顺便学了一下怎么改变字体颜色
还挺好玩的
·
直接上效果图:
可能动图看起来效果不咋地,但是程序实际跑起来还是很不错的
思路
主函数延时改变图形:
中断函数主要负责显示
代码
显示函数
#include "led.h"
uchar L_heart[]={0x1e,0x21,0x41,0x82,0x82,0x41,0x21,0x1e};//大心形段选
uchar S_heart[]={0x00,0x1c,0x22,0x44,0x44,0x22,0x1c,0x00};//小心形段选
int led_flag=1;
void led_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitTypeDef gpio_ad;
gpio_ad.GPIO_Pin = 0xff;
gpio_ad.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_ad.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio_ad);//A[7:0]->x,low
gpio_ad.GPIO_Pin = 0xff;
gpio_ad.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_ad.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&gpio_ad);//D[7:0]->y,high
GPIO_ResetBits(GPIOD,0xff);
GPIO_SetBits(GPIOA,0xff);
}
void led_display(void)
{
static int i=0;
static uint n=0x01;
switch(led_flag)
{
case 0: //big heart
GPIO_SetBits(GPIOD,L_heart[i]);//输入y轴数据
GPIO_ResetBits(GPIOA,n);//打开x轴
break;
case 1: //small heart
GPIO_SetBits(GPIOD,S_heart[i]);//输入y轴数据
GPIO_ResetBits(GPIOA,n);//打开x轴
break;
}
delay_ms(10);
n=n<<1;
i++;
if(i==8)
i=0;
if(n==0x100)
n=0x01;
GPIO_SetBits(GPIOA,0xff);//关闭x轴
GPIO_ResetBits(GPIOD,0xff);//清空y轴数据
}
主函数:
#include "main.h"
extern int led_flag;//申明led_flag
int main(void)
{
TIM3_Int_Init(199,719);//100us
lled_init();
while(1)
{
delay_ms(500);//图像修改延时
if(led_flag==1)
led_flag =0;
else
led_flag =1;//修改图像
}
}
优化
经过一晚的深思熟虑
改进了一下程序,考虑到使用中断进行刷新显示,而中断服务程序不能执行过长的语句,所以优化了一下结构,把显示程序的延时去除,改变了显示程序的结构。
上流程图:
是不是有点不一样,欸顺序不一样了,效果更好了
上代码(直接给显示程序了,其他的都没变):
void led_display(void)
{
static int i=0;
static uint n=0x01;
GPIO_SetBits(GPIOA,0xff);//关闭x轴
GPIO_ResetBits(GPIOD,0xff);//清空y轴数据
// GPIO_SetBits(GPIOD,L_heart[i]);//输入y轴数据
// GPIO_ResetBits(GPIOA,n);//打开x轴
// delay_ms(1);
// n=n<<1;
// i++;
//
// if(i==8)
// i=0;
//
// if(n==0x100)
// n=0x01;
// GPIO_SetBits(GPIOA,0xff);//关闭x轴
// GPIO_ResetBits(GPIOD,0xff);//清空y轴数据
switch(led_flag)
{
case 0:
GPIO_SetBits(GPIOD,L_heart[i]);//输入y轴数据
GPIO_ResetBits(GPIOA,n);//打开x轴
break;
case 1:
GPIO_SetBits(GPIOD,S_heart[i]);//输入y轴数据
GPIO_ResetBits(GPIOA,n);//打开x轴
break;
}
// delay_ms(10);
n=n<<1;
i++;
if(i==8)
i=0;
if(n==0x100)
n=0x01;
}