新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2020-3-16
- 在线时间
- 7 小时
|
1金钱
各位老大,我用STM32F103驱动64*32点阵屏,为什么上半屏正常,下半屏全亮?
请各位给看看
///////////////////////////////////
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
/************************************************
STM32F103 测试64*32点阵屏
点阵数据发送方式:
/ 0 区 / / 1 区 / / 2 区 / / 3 区 / / 4 区 / / 5 区 / / 6 区 / / 7 区 /
1行扫-> 0组 8行0字节,8行1字节, 0行0字节,0行1字节) 1组: (8行2字节,8行3字节, 0行0字节,0行1字节) 2组 8行4字节,8行5字节, 0行4字节,0行5字节) 3组: (8行6字节,8行7字节, 0行6字节,0行7字节)
上半屏 8扫(1扫2行) = 16行
下半屏 同上半屏 8扫 = 16行,
************************************************/
#define IA PBout(10) //行选 IA,IB,IC
#define IB PBout(11)
#define IC PBout(12)
#define R1 PAout(0) //R1,G1,B1,上半屏引脚
#define G1 PAout(1)
#define B1 PAout(2)
#define R2 PAout(13) //R2,G2,B2,上半屏引脚
#define G2 PAout(14)
#define B2 PAout(15)
#define SCK PBout(7) //时钟
#define LE PBout(8) // 锁存
#define OE PBout(9) // 使能
#define scan0 {IA=0;IB=0;IC=0;}
#define scan1 {IA=1;IB=0;IC=0;}
#define scan2 {IA=0;IB=1;IC=0;}
#define scan3 {IA=1;IB=1;IC=0;}
#define scan4 {IA=0;IB=0;IC=1;}
#define scan5 {IA=1;IB=0;IC=1;}
#define scan6 {IA=0;IB=1;IC=1;}
#define scan7 {IA=1;IB=1;IC=1;}
//////////////////////////////////////////////////////
u8 BUFF[32][8]; //红色 全屏缓存
u8 BUFF1[32][8]; //绿色 全屏缓存
u8 BUFF2[32][8]; //蓝色 全屏缓存
u8 line; //
u8 number1[11][5] ={ // 11改10
0x00,0xFE,0x82,0x82,0xFE,//0
0x00,0x84,0xFE,0x80,0x00,//1
0x00,0xF2,0x92,0x92,0x9E,//2
0x00,0x92,0x92,0x92,0xFE,//3
0x00,0x1E,0x10,0x10,0xFE,//4
0x00,0x9E,0x92,0x92,0xF2,//5
0x00,0xFE,0x92,0x92,0xF2,//6
0x00,0x02,0x02,0x02,0xFE,//7
0x00,0xFE,0x92,0x92,0xFE,//8
0x00,0x9E,0x92,0x92,0xFE,//9
}; //最后1行未赋值的 默认为0
void clear (void);
void scan(unsigned char Value);
void txd_data(void);
void transform(u8 xa,u8 ya, u8 chang,u8 kuan, u8 *bmp,u8 color);
void display(void);
void txd_data2(void);
///////////////////////////////////////////////////////////
void scan(unsigned char Value) //8行扫
{
switch(Value)
{
case 0: scan0; break;
case 1: scan1; break;
case 2: scan2; break;
case 3: scan3; break;
case 4: scan4; break;
case 5: scan5; break;
case 6: scan6; break;
case 7: scan7; break;
default:break;
}
}
void txd_data(void) //点阵屏显示数据
{
u8 Nex1[4]={ 0,2,4,6};
u8 Nex2[4]={ 1,3,5,7};
u8 s,k;
u8 tempr1,tempr2,tempg1,tempg2,tempb1,tempb2; //上半屏 RGB 0位
u8 tempr1_2,tempr2_2,tempg1_2,tempg2_2,tempb1_2,tempb2_2; //上半屏 RGB+1位
u8 tempr3,tempr4,tempg3,tempg4,tempb3,tempb4; //下半屏 RGB 0位
u8 tempr3_2,tempr4_2,tempg3_2,tempg4_2,tempb3_2,tempb4_2;//下半屏 RGB+1位
/////////////////////////////////
for(line=0;line<8;line++) //共8行
{
for(s=0;s<4;s++) //发送1行 4组 (上下屏)
{
//顺序 值 u8 BUFF[32][8]; u8 BUFF1[32][8];
tempr1 =BUFF[line+8][Nex1]; //0 0 8行 0区0位 红 上半屏
tempr1_2=BUFF[line+8][Nex2]; //1 1 8行 0区1位
tempr2 =BUFF[line][Nex1]; //2 0 0行 1区0位
tempr2_2=BUFF[line][Nex2]; //3 1 0行 1区1位
tempr3 =BUFF[line+24][Nex1]; //0 24行 0区0位 红 下半屏 同时发
tempr3_2=BUFF[line+24][Nex2]; //1 24行 0区1位
tempr4 =BUFF[line+16][Nex1]; //2 16行 1区0位
tempr4_2=BUFF[line+16][Nex2]; //3 16行 1区1位
tempg1 =BUFF1[line+8][Nex1]; //0 绿 上半屏
tempg1_2=BUFF1[line+8][Nex2]; //1
tempg2 =BUFF1[line][Nex1]; //2
tempg2_2=BUFF1[line][Nex2]; //3
tempg3 =BUFF1[line+24][Nex1]; //0 绿 下半屏 同时发
tempg3_2=BUFF1[line+24][Nex2]; //1
tempg4 =BUFF1[line+16][Nex1]; //2
tempg4_2=BUFF1[line+16][Nex2]; //3
tempb1 =BUFF2[line+8][Nex1]; // 蓝 上半屏
tempb1_2=BUFF2[line+8][Nex2];
tempb2 =BUFF2[line][Nex1];
tempb2_2=BUFF2[line][Nex2];
tempb3 =BUFF2[line+24][Nex1]; // 蓝 下半屏 同时发
tempb3_2=BUFF2[line+24][Nex2];
tempb4 =BUFF2[line+16][Nex1];
tempb4_2=BUFF2[line+16][Nex2];
OE=1; //点阵屏使能 0使能 1关闭使能
for(k=0;k<8;k++) // 0区 0位
{
SCK=0;
R1= tempr1&0x01 ; //发送上半屏 红
R2= tempr3&0x01 ; //发送下半屏 红
tempr1=tempr1>>1;
tempr3=tempr3>>1;
G1= tempg1&0x01 ; //发送上半屏 绿
G2= tempg3&0x01 ; //发送下半屏 绿
tempg1=tempg1>>1;
tempg3=tempg3>>1;
B1= tempb1&0x01 ; //发送上半屏 蓝
B2= tempb3&0x01 ; //发送下半屏 蓝
tempb1=tempb1>>1;
tempb3=tempb3>>1;
SCK=1;
}
for(k=0;k<8;k++) // 0区 1位
{
SCK=0;
R1= tempr1_2&0x01 ;
R2= tempr3_2&0x01 ;
tempr1_2=tempr1_2>>1;
tempr3_2=tempr3_2>>1;
G1= tempg1_2&0x01 ;
G2= tempg3_2&0x01 ;
tempg1_2=tempg1_2>>1;
tempg3_2=tempg3_2>>1;
B1= tempb1_2&0x01 ;
B2= tempb3_2&0x01 ;
tempb1_2=tempb1_2>>1;
tempb3_2=tempb3_2>>1;
SCK=1;
}
//////////////////////////////
for(k=0;k<8;k++) // 1区 0位
{
SCK=0;
R1= tempr2&0x01 ;
R2= tempr4&0x01 ;
tempr2=tempr2>>1;
tempr4=tempr4>>1;
G1= tempg2&0x01 ;
G2= tempg4&0x01 ;
tempg2=tempg2>>1;
tempg4=tempg4>>1;
B1= tempb2&0x01 ;
B2= tempb4&0x01 ;
tempb2=tempb2>>1;
tempb4=tempb4>>1;
SCK=1;
}
for(k=0;k<8;k++) // 1区 1位
{
SCK=0;
R1= tempr2_2&0x01 ;
R2= tempr4_2&0x01 ;
tempr2_2=tempr2_2>>1;
tempr4_2=tempr4_2>>1;
G1= tempg2_2&0x01 ;
G2= tempg4_2&0x01 ;
tempg2_2=tempg2_2>>1;
tempg4_2=tempg4_2>>1;
B1= tempb2_2&0x01 ;
B2= tempb4_2&0x01 ;
tempb2_2=tempb2_2>>1;
tempb4_2=tempb4_2>>1;
SCK=1;
}
}
scan(line);
LE=1;
LE=0;//锁存
OE=0; //点阵屏使能 0使能 1关闭使能
delay_us(100); //每行延时亮度
}
delay_us(10); //最后一行 延时亮度
//////// 每一行的消隐 和最后的消隐 时间长短
OE=1;
delay_ms(10); //关闭延时,12ms以内不闪
}
///// 调节字符数据 /////////////////////////////////////////////////////////
//参1:起始X点(横看),参2:起始Y点(竖看),参3:字符有几行, 参4:字符每行几个字节, 参5:发送的字符,参6 颜色(0-6)
void transform(u8 xa,u8 ya, u8 chang,u8 kuan, u8 *bmp,u8 color) //
{
u8 temp;
// u8 cs1,cs2,cs3,cs4,cs5,cs6;
u8 j,i;
if(kuan==8)
for( j=0;j<8;j++)
{
for(i=0;i<chang;i++) //字符宽度,
{
temp=*(bmp+i); //
if(color==0)
{
if((temp>>j)&0x01) {
BUFF [ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8)); //u8 BUFF[32][8];
// cs1 = BUFF [ya+j][(xa+i)/8];
}
else {
BUFF [ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8)); //反向
}
BUFF1[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8)); //u8 BUFF1[32][8];
BUFF2[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8)); //u8 BUFF1[32][8];
// cs2 = BUFF [ya+j][(xa+i)/8];
// cs3 = BUFF1[ya+j][(xa+i)/8];
}
else if(color==1)
{
if((temp>>j)&0x01) {
BUFF1[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
}
else {
BUFF1[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
BUFF [ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
BUFF2[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
else if(color==2)
{
if((temp>>j)&0x01) {
BUFF2[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
}
else {
BUFF2[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
BUFF [ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
BUFF1[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
else if(color==3)
{
if((temp>>j)&0x01)
{
BUFF [ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
BUFF1[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
}
else
{
BUFF [ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
BUFF1[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
BUFF2[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
else if(color==4)
{
if((temp>>j)&0x01)
{
BUFF [ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
BUFF2[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
}
else
{
BUFF [ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
BUFF2[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
BUFF1[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
else if(color==5)
{
if((temp>>j)&0x01)
{
BUFF1[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
BUFF2[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
}
else
{
BUFF1[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
BUFF2[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
BUFF [ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
else // if(color==6)
{
if((temp>>j)&0x01)
{
BUFF [ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
BUFF1[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
BUFF2[ya+j][(xa+i)/8]|=(0x01<<((xa+i)%8));
}
else
{
BUFF [ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
BUFF1[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
BUFF2[ya+j][(xa+i)/8]&=~(0x01<<((xa+i)%8));
}
}
}
}
else{;}
}
void display(void) //需要显示的内容
{
// 横向Xa
transform(6,8,5,8,number1[0],0); // 52,8,5,8,number1[1],1 sec%10 transform(u8 xa,u8 ya, u8 chang,u8 kuan, u8 *bmp,u8 color)
transform(58,0,5,8,number1[3],4); // number1[4]选的是列== number1[4][] ; 就是数字4 第5行
transform(52,8,5,8,number1[5],3); // 1
transform(0,24,5,8,number1[0],0);
transform(27,8,5,8,number1[6],2);
}
/////////////////////////////////////////////////////////////////
void clear (void) //数据缓存清空
{
u8 i,j;
for(i=0;i<32;i++)
for(j=0;j<8;j++)
{
BUFF[j]= 0x00;
BUFF1[j]= 0x00;
BUFF2[j]= 0x00;
}
}
void Led64_32_Init(void)
{
GPIO_InitTypeDef GPIO_InitOpenA;
GPIO_InitTypeDef GPIO_InitOpenB;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitOpenB.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitOpenB.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitOpenB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB , &GPIO_InitOpenB);
GPIO_InitOpenA.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitOpenA.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // 改
GPIO_InitOpenA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitOpenA);
}
////////////////////////////////////////////////////////
int main(void)
{
delay_init();
Led64_32_Init();
while(1)
{
display(); //显示的内容
txd_data(); // 64*32点阵屏显示输出
}
}
///////////////////////////////////
main.zip
(3.04 KB, 下载次数: 141)
|
-
-
|