OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3353|回复: 6

各位老大:STM32F103驱动64*32点阵屏,为什么上半屏正常,下半屏全亮?

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-3-16
在线时间
7 小时
发表于 2020-8-15 14:01:58 | 显示全部楼层 |阅读模式
1金钱
各位老大,我用STM32F103驱动64*32点阵屏,为什么上半屏正常,下半屏全亮?
  请各位给看看

微1.jpg


///////////////////////////////////
#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点阵屏显示输出
         }       
}

///////////////////////////////////





微3.jpg

微2.jpg

main.zip (3.04 KB, 下载次数: 141)

微1.jpg
微3.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-3-16
在线时间
7 小时
 楼主| 发表于 2020-8-15 19:29:44 | 显示全部楼层
有没有老大回复呀? 有没有人呀!。。。。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-8-17 01:37:33 | 显示全部楼层
确定硬件是好的么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-7-23
在线时间
63 小时
发表于 2020-8-17 09:02:21 | 显示全部楼层
你可以Debug看看在哪行函数,下半部分全亮
回复

使用道具 举报

16

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-7-29
在线时间
19 小时
发表于 2020-8-17 09:54:34 | 显示全部楼层
我猜是坏了
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-3-16
在线时间
7 小时
 楼主| 发表于 2020-8-22 14:10:48 | 显示全部楼层
我用STC15W401AS编写的代码就可以全屏显示,
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-3-16
在线时间
7 小时
 楼主| 发表于 2020-8-22 14:24:04 | 显示全部楼层
我自己编的stc15w408as的64_32点阵屏就可全屏显示,但是芯片容量太小,想换STM32F103的,可下半屏显示有问题,发现消隐没有在每行后开始消隐,改了还是有下半屏全亮的问题 64_32点阵屏.rar (9.65 KB, 下载次数: 17)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 10:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表