OpenEdv-开源电子网

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

关于08接口点阵驱动的求助,按51程序重写的32但是驱动不了

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-11-7
在线时间
3 小时
发表于 2020-11-15 20:31:01 | 显示全部楼层 |阅读模式
3金钱
led.c
#include "bsp_led.h"

uint8_t display[][32] = {
    { 0x00, 0x7F, 0x40, 0x40, 0x5F, 0x41, 0x41, 0x4F, 0x41, 0x41, 0x41, 0x5F, 0x40, 0x40, 0x7F, 0x40, 0x00, 0xFC, 0x04, 0x04, 0xF4, 0x04, 0x04, 0xE4, 0x04, 0x44, 0x24, 0xF4, 0x04, 0x04, 0xFC, 0x04 }, /*"国",3*/
    { 0x00, 0x01, 0x7E, 0x22, 0x11, 0x7F, 0x42, 0x82, 0x7F, 0x04, 0x07, 0x0A, 0x11, 0x20, 0x43, 0x1C, 0x08, 0xFC, 0x10, 0x10, 0x20, 0xFE, 0x02, 0x04, 0xF8, 0x00, 0xF0, 0x10, 0x20, 0xC0, 0x30, 0x0E }, /*"爱",1*/
    { 0x01, 0x01, 0x01, 0x01, 0x3F, 0x21, 0x21, 0x21, 0x21, 0x21, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x08, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00 }, /*"中",2*/
    { 0x00, 0x7F, 0x40, 0x40, 0x5F, 0x41, 0x41, 0x4F, 0x41, 0x41, 0x41, 0x5F, 0x40, 0x40, 0x7F, 0x40, 0x00, 0xFC, 0x04, 0x04, 0xF4, 0x04, 0x04, 0xE4, 0x04, 0x44, 0x24, 0xF4, 0x04, 0x04, 0xFC, 0x04 }, /*"国",3*/
};//点阵取模

/**
  * @brief  初始化GPIO
  * @param  None
  * @retval None
  */
void LED_GPIO_Config(void)
{

    GPIO_InitTypeDef   GPIO_InitStruct;

    RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);

    GPIO_InitStruct.GPIO_Pin  =  LED_R_GPIO_OE
        | LED_R_GPIO_R1
        | LED_R_GPIO_R2
        | LED_R_GPIO_A
        | LED_R_GPIO_B
        | LED_R_GPIO_C
        | LED_R_GPIO_D
        | LED_R_GPIO_LAT
        | LED_R_GPIO_CLK1;

    GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_Out_PP;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(LED_R_GPIO_PORT,  &GPIO_InitStruct);
}

/**
  * @brief  向SM16106sc写入一个字节(列驱动)
  * @param  None
  * @retval None
  */
void SM16106sch_send_byte(uint8_t data)
{
    uint8_t i;

    for (i = 0; i < 8; i++)//按位取出,判断该输出什么电平
    {
        if (data &= 0x01)
        {
            R1_H;
        }
        else
        {
            R1_L;
        }
        CLK1_L; //时钟信号,上升沿时移位
        delay_us(1);
        CLK1_H;
        delay_us(1);
        data = data >> 1;
    }
}

/**
  * @brief
  * hub08的锁存信号,当所有字节写入后拉高输出字节到输出寄存器
  * @param  
  * @retval None
  */
void SM16106sch_LAT(void)
{
    delay_us(1);  
          LAT_L;
    delay_us(1);
    LAT_H;
    delay_us(1);
}

/**
  * @brief  向SM16106sc多次写入字节
  * @param  len为写入字节的个数
  * @retval None
  */
void SM16106sch_send_multi_byte(uint8_t *data, uint16_t len)
{
    uint8_t i;
//          OE_H ;
                  LAT_L;
    for (i = 0; i < len; i++)
    {
        SM16106sch_send_byte(data);
    }
    SM16106sch_LAT();
//                OE_L ;
}

/**
  * @brief  行选(4-16译码器),row为第几行
  * @param  row为0-15,一次选中1-16行
  * @retval None
  */
void Scanrow(uint8_t row)
{
    switch (row)
    {
    case 0 :
        D_L; C_L; B_L; A_L; break;
    case 1 :
        D_L; C_L; B_L; A_H; break;
    case 2 :
        D_L; C_L; B_H; A_L; break;
    case 3 :
        D_L; C_L; B_H; A_H; break;
    case 4 :
        D_L; C_H; B_L; A_L; break;
    case 5 :
        D_L; C_H; B_L; A_H; break;
    case 6 :
        D_L; C_H; B_H; A_L; break;
    case 7 :
        D_L; C_H; B_H; A_H; break;
    case 8 :
        D_H; C_L; B_L; A_L; break;
    case 9 :
        D_H; C_L; B_L; A_H; break;
    case 10 :
        D_H; C_L; B_H; A_L; break;
    case 11 :
        D_H; C_L; B_H; A_H; break;
    case 12 :
        D_H; C_H; B_L; A_L; break;
    case 13 :
        D_H; C_H; B_L; A_H; break;
    case 14 :
        D_H; C_H; B_H; A_L; break;
    case 15 :
        D_H; C_H; B_H; A_H; break;
    default :
        break;


    }
}

/**
  * @brief
  * 基于SysTick的ns级延时函数
  * (SYSTICK的时钟固定为HCLK时钟的1/8)
  * @param  None
  * @retval None
  */
void delay_us(u32 nus)
{
    u32 temp;
    SysTick->LOAD = 9 * nus; //重装载寄存器(1/9M)
    SysTick->VAL = 0X00; //清空计数器
    SysTick->CTRL = 0X01; //使能,减到零是无动作,采用外部时钟源
    do
    {
        temp = SysTick->CTRL; //读取当前倒计数值
    }while ((temp & 0x01) && (!(temp & (1 << 16)))); //CTRL寄存器第一位(使能)为0且第16位(状态位)为1跳出循环,计时结束
    SysTick->CTRL = 0x00; //关闭计数器
    SysTick->VAL = 0X00; //清空计数器
}
led.h

#ifndef __BSP_LDE_C
#define __BSP_LDE_C

#include "stm32f10x.h"

#define LED_R_GPIO_OE    GPIO_Pin_0
#define LED_R_GPIO_R1    GPIO_Pin_10
#define LED_R_GPIO_R2    GPIO_Pin_2
#define LED_R_GPIO_A     GPIO_Pin_3
#define LED_R_GPIO_B     GPIO_Pin_4
#define LED_R_GPIO_C     GPIO_Pin_5
#define LED_R_GPIO_D     GPIO_Pin_6
#define LED_R_GPIO_LAT   GPIO_Pin_7
#define LED_R_GPIO_CLK1  GPIO_Pin_8  
#define LED_R_GPIO_PORT  GPIOC                                                                                                                                                                                                                                                                                                                           
#define LED_R_GPIO_CLK   RCC_APB2Periph_GPIOC


#define A_H     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_A,Bit_SET);
#define A_L     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_A,Bit_RESET);
#define B_H     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_B,Bit_SET);
#define B_L     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_B,Bit_RESET);
#define C_H     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_C,Bit_SET);
#define C_L     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_C,Bit_RESET);
#define D_H     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_D,Bit_SET);
#define D_L     GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_D,Bit_RESET);

#define OE_H    GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_OE,Bit_SET);
#define OE_L    GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_OE,Bit_RESET);
#define LAT_H   GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_LAT,Bit_SET);
#define LAT_L   GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_LAT,Bit_RESET);
#define CLK1_H  GPIO_WriteBit(LED_R_GPIO_PORT, LED_R_GPIO_CLK1,Bit_SET);
#define CLK1_L  GPIO_WriteBit(LED_R_GPIO_PORT, LED_R_GPIO_CLK1,Bit_RESET);
#define R1_H    GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_R1,Bit_SET);
#define R1_L    GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_R1,Bit_RESET);
#define R2_H    GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_R2,Bit_SET);
#define R2_L    GPIO_WriteBit(LED_R_GPIO_PORT,LED_R_GPIO_R2,Bit_RESET);


void LED_GPIO_Config(void);
void SM16106sch_send_byte(uint8_t data);
void SM16106sch_send_multi_byte(uint8_t *data, uint16_t len);
void SM16106sch_LAT(void);
void Scanrow(uint8_t row);
void SM16106sch_LAT(void);
void delay_us(u32 nus);

#endif /*__BSP_LDE_C*/

main.c
#include "stm32f10x.h"
#include "bsp_led.h"

uint8_t data_send[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };//输出缓存数组,暂存取出来的点阵数据
extern uint8_t display[][32];
uint16_t hang =0;                                                                                                                                                                                               
int main(void)
{
    LED_GPIO_Config();
//    LAT_L;
            OE_L;
    while (1)
    {
//                        hang = 3;
        for (hang = 0; hang < 16; hang++)//循环点亮16行,利用视觉暂留显示图像
        {
            data_send[7] = display[3][hang];     //将完整的一行的点阵取模缓存进输出缓存数组
            data_send[6] = display[3][hang + 16];
            data_send[5] = display[2][hang];
            data_send[4] = display[2][hang + 16];
            data_send[3] = display[1][hang];
            data_send[2] = display[1][hang + 16];
            data_send[1] = display[0][hang];
            data_send[0] = display[0][hang + 16];
            SM16106sch_send_multi_byte(data_send, 8);//点亮对应列
            Scanrow(hang);//点亮对应行
                                       
//                                          delay_us(80);
         }
    }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-11-7
在线时间
3 小时
 楼主| 发表于 2020-11-15 20:34:07 | 显示全部楼层
附上列驱动芯片的时序图
3WZ8P{$[)C@ZBY$_U5)E)CY.png
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-11-7
在线时间
3 小时
 楼主| 发表于 2020-11-15 20:38:35 | 显示全部楼层
引脚的定义及作用
`Z%8V)RH)9MLT~_3Q4~]DJ3.png
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-11-7
在线时间
3 小时
 楼主| 发表于 2020-11-15 20:41:04 | 显示全部楼层
_ZQ([4)0%QPFZ]PZ5@SVAZ2.png 引脚定义
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-11-7
在线时间
3 小时
 楼主| 发表于 2020-11-15 20:44:41 | 显示全部楼层
实际效果,我不清楚到底哪里错了,有知道的大哥们,有时间的话帮忙看两眼,谢谢
IMG_20201115_203509.jpg

点阵程序.zip

5.39 MB, 下载次数: 13

回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-11-7
在线时间
3 小时
 楼主| 发表于 2020-12-2 22:29:04 来自手机 | 显示全部楼层
解决了,列写入问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 06:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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