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);
}
}
}
|