|
发表于 2020-3-21 11:10:41
|
显示全部楼层
本帖最后由 lidawei1 于 2020-3-21 14:27 编辑
下面是从落叶大师的程序中提取出来的,用于测试及显示刷新次数,拷贝后覆盖原main.c文件,运行正常的话,会在屏的第1行显示刷新的次数,每个数字一个颜色,10或20秒后看这个数字是多少,除以秒数就是刷新率了,一般每秒可刷新约200次。
如果显示正常,那屏的接口这部分就没问题了,可以按照落叶大师原贴子的指引制作时钟了。
main.c:
/**
******************************************************************************
* @file Project/STM32F10x_StdPeriph_Template/main.c
* @author MCD Application Team
* @version V3.5.0
* @date 08-April-2011
* @brief Main program body
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>
#define AIN (1<<0X05)// PC5
#define AIN_SET(x) GPIOC->ODR=(GPIOC->ODR&~AIN)|(x ? AIN:0)
#define BIN (1<<0X07)// PC7
#define BIN_SET(x) GPIOC->ODR=(GPIOC->ODR&~BIN)|(x ? BIN:0)
#define CIN (1<<0X04)// PC4
#define CIN_SET(x) GPIOC->ODR=(GPIOC->ODR&~CIN)|(x ? CIN:0)
#define DIN (1<<0X08)// PC8
#define DIN_SET(x) GPIOC->ODR=(GPIOC->ODR&~DIN)|(x ? DIN:0)
#define EIN (1<<0X06)// PC6
#define EIN_SET(x) GPIOC->ODR=(GPIOC->ODR&~EIN)|(x ? EIN:0)
#define CLK (1<<0X07)// PA7
#define CLK_SET(x) GPIOA->ODR=(GPIOA->ODR&~CLK)|(x ? CLK:0)
#define STB (1<<0X09)// PC9
#define STB_SET(x) GPIOC->ODR=(GPIOC->ODR&~STB)|(x ? STB:0)
//#define OE (1<<0X06)// PA6
//#define OE_SET(x) GPIOA->ODR=(GPIOA->ODR&~OE)|(x ? OE:0)
#define OE (1<<0X0a)// PC10
#define OE_SET(x) GPIOC->ODR=(GPIOC->ODR&~OE)|(x ? OE:0)
static unsigned char const DISPdat16x8[]=
{
0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,//"0",0
0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,//"1",1
0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00,//"2",2
0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00,//"3",3
0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00,//"4",4
0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00,//"5",5
0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00,//"6",6
0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00,//"7",7
0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00,//"8",8
0x00,0x00,0x07,0x00,0x08,0x8C,0x10,0x44,0x10,0x44,0x08,0x88,0x07,0xF0,0x00,0x00,//"9",9
0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//".",10
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,//":",11
0x00,0x00,0x02,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x00,//"c",12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空 13
0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04,//"A",14
0x10,0x00,0x1E,0x00,0x11,0xE0,0x00,0x1C,0x00,0x70,0x13,0x80,0x1C,0x00,0x10,0x00,//"V",15
0x1F,0xC0,0x10,0x3C,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x10,0x3C,0x1F,0xC0,0x00,0x00,//"W",16
0x00,0x00,0x0E,0x1C,0x11,0x04,0x10,0x84,0x10,0x84,0x10,0x44,0x1C,0x38,0x00,0x00,//"S",17
0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x17,0xC4,0x10,0x04,0x08,0x18,0x00,0x00,//"E",18
0x18,0x00,0x10,0x00,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x00,0x18,0x00,0x00,0x00,//"T",19
0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00,//"I",20
0x10,0x04,0x1F,0xFC,0x0C,0x04,0x03,0x00,0x00,0xE0,0x10,0x18,0x1F,0xFC,0x10,0x00,//"N",21
0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x1C,0x10,0x00,0x00,//"C",22
0x10,0x04,0x1F,0xFC,0x10,0x84,0x10,0x80,0x10,0x80,0x10,0x80,0x0F,0x00,0x00,0x00,//"P",23
0x10,0x04,0x1F,0xFC,0x10,0x84,0x00,0x80,0x00,0x80,0x10,0x84,0x1F,0xFC,0x10,0x04,//"H",24
0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,//"-",25
};
u8 disphan;
u8 dispram[4096];//外部引用显示内存,在LEDdisp子程序内
void disp_()
{//0.14ms 改为分两段显示,每段69us
u8 kk,temp1;
//TEXTOUT_SET(1);
// if(duanvol==0)
{//扫开始64列
// OE_SET(1);//如不进行这步,有暗光
//不能关,否则会损失亮度,有暗光是由于切换行线时机不对引起的
for(kk=0;kk<64;kk++)
{
GPIO_Write(GPIOB, dispram[kk+disphan*128]);
CLK_SET(0);
CLK_SET(1);
}
}
// if(duanvol==1)
{//扫后64列
for(kk=0;kk<64;kk++)
{
GPIO_Write(GPIOB, dispram[kk+64+disphan*128]);
CLK_SET(0);
CLK_SET(1);
}
OE_SET(1);
STB_SET(0);
STB_SET(1);
temp1=disphan&0x01;
AIN_SET(temp1);
temp1=disphan&0x02;
BIN_SET(temp1);
temp1=disphan&0x04;
CIN_SET(temp1);
temp1=disphan&0x08;
DIN_SET(temp1);
temp1=disphan&0x10;
EIN_SET(temp1);
OE_SET(0);//显示
disphan++;
if(disphan==32)disphan=0;
}
}
void LEDClear(void)
{
u16 i;
for(i=0;i<4096;i++)
{
dispram=0;
}
}
void LEDdisp16x8_2(u16 x,u16 y,u16 kaici,u8 dcolor,u8 bgcolor)
{//逐行式,顺向高位在前,注意颜色不能超过8,没做对错判断,不能输错。
u16 i,j,k,l;
for(j=0;j<8;j++)
{
k=DISPdat16x8[j*2+kaici*16];
if((j+x)<128)
{
for(i=0;i<8;i++)
{
if((k&(1<<(7-i)))!=0)
{
if((i+y)<32)
{
l=dispram[(i+y)*128+j+x]&0xf0;
dispram[(i+y)*128+j+x]=l+dcolor;
}
else
{
l=dispram[(i+y-32)*128+j+x] & 0x0f;
dispram[(i+y-32)*128+j+x]=l+(dcolor<<4);
}
}
else
{
if((i+y)<32)
{
l=dispram[(i+y)*128+j+x]&0xf0;
dispram[(i+y)*128+j+x]=l+bgcolor;
}
else
{
l=dispram[(i+y-32)*128+j+x] & 0x0f;
dispram[(i+y-32)*128+j+x]=l+(bgcolor<<4);
}
}
}
}
k=DISPdat16x8[j*2+1+kaici*16];
if((j+x)<128)
{
for(i=0;i<8;i++)
{
if((k&(1<<(7-i)))!=0)
{
if((i+y+8)<32)
{
l=dispram[(i+y+8)*128+j+x]&0xf0;
dispram[(i+y+8)*128+j+x]=l+dcolor;
}
else
{
l=dispram[(i+y-24)*128+j+x] & 0x0f;
dispram[(i+y-24)*128+j+x]=l+(dcolor<<4);
}
}
else
{
if((i+y+8)<32)
{
l=dispram[(i+y+8)*128+j+x]&0xf0;
dispram[(i+y+8)*128+j+x]=l+bgcolor;
}
else
{
l=dispram[(i+y-24)*128+j+x] & 0x0f;
dispram[(i+y-24)*128+j+x]=l+(bgcolor<<4);
}
}
}
}
}
}
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_15 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭JTAG,由于PA15、PB3、PB4脚默认是JTAG功能脚,所以需关闭才能用,同时需要先开启AFIO时钟才行
}
int main(void)
{
int num=1;
disphan=0;
LED_GPIO_Config();
LEDClear();
while (1)
{
int n;
n=num%1000000;
LEDdisp16x8_2(0,0,n/100000,1,0);
n%=100000;
LEDdisp16x8_2(8,0,n/10000,2,0);
n%=10000;
LEDdisp16x8_2(16,0,n/1000,4,0);
n%=1000;
LEDdisp16x8_2(24,0,n/100,3,0);
n%=100;
LEDdisp16x8_2(32,0,n/10,5,0);
n%=10;
LEDdisp16x8_2(40,0,n,6,0);
LEDdisp16x8_2(56,0,14,7,0);
for(int i=0;i<32;i++)
disp_();
OE_SET(1);
num++;
}
}
|
|