第一步:引脚的初始化
我用的是AT32F403a的芯片,如图配置引脚即可,因为是两扫的单元板(红色),所以有的引脚是没有用的真正有用的是OE、A、B、ST、CLK、R引脚。配置成推挽输出
void bsp_LED_Unit_board_init ( void )
{
gpio_init_type gpio_init_struct;
/* enable the led clock */
crm_periph_clock_enable ( CRM_IOMUX_PERIPH_CLOCK, TRUE ); //复用时钟使能
crm_periph_clock_enable ( CRM_GPIOB_PERIPH_CLOCK, TRUE );
crm_periph_clock_enable ( CRM_GPIOD_PERIPH_CLOCK, TRUE );
crm_periph_clock_enable ( CRM_GPIOC_PERIPH_CLOCK, TRUE );
/* set default parameter */
gpio_default_para_init ( &gpio_init_struct );
/* configure the led gpio */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_7 | GPIO_PINS_6 | GPIO_PINS_5 ;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init ( GPIOB, &gpio_init_struct );
gpio_pin_remap_config ( SWJTAG_MUX_010, TRUE ); //禁用JTAG功能使能 SWD 功能, PB3 PB4用作普通IO
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_3 ;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init ( GPIOB, &gpio_init_struct );
/* configure the led gpio */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_7 | GPIO_PINS_6 | GPIO_PINS_5;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init ( GPIOD, &gpio_init_struct );
/* configure the led gpio */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_3 | GPIO_PINS_2 | GPIO_PINS_1 | GPIO_PINS_0;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init ( GPIOD, &gpio_init_struct );
/* configure the led gpio */
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_12 | GPIO_PINS_11 | GPIO_PINS_10;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init ( GPIOC, &gpio_init_struct );
OE2_1;
OE1_1;
}
第二步:清屏函数
只是把数据引脚R拉低,然后往里面写入低电平即可,把所有点写完,锁存,然后在显示
void clear_scree_board1 ( void )
{
int i;
R1_0;
OE1_1;
for ( i = 0; i < 32 * 8 * led_board_num1; i++ ) //清屏
{
CLK1_0;
delay_us ( 5 );
CLK1_1;
}
ST1_1;
delay_us ( 2 );
ST1_0;
delay_us ( 2 );
OE1_0;//显示
}
第三步:写数据函数(一个字节一个字节的写)
static void writedata_led_board1 ( uint8_t data )
{
int i;
for ( i = 0; i < 8; i++ )
{
if ( data & 0x01 ) //高位在前,如果想低位在前使用(data&0x80)
{
R1_1;
}
else
{
R1_0;
}
CLK1_0;
delay_us ( 1 );//必须要加一个延时
CLK1_1;
data = data >> 1;
}
}
第四步:显示字符汉字函数
这个函数是根据单元板的扫描逻辑进行编写的,我的板子的扫描逻辑如图所示,我嘴笨说不清楚
我是把要显示的汉字字符放在一个大的数组里面,只要字模取得对,就可以显示,字模取模方式为:如果要显示12X12的汉字字符 :行列式,阴码,顺向,点阵大小12X16
按理来说,显示16X16的汉字也可也显示,我没有测试,工作用不到
void display_12X12_board1 ( void )
{
uint8_t row, lin;
for ( row = 0; row < 2; row++ ) //2行
{
OE1_1;
for ( int i = 0; i < led_board_num1; i++ ) //用于判断几块单元板连级,有几块写几遍,把所有单元板的行都写完,在进行换行,不然会显示错误
{
for ( int p = 0; p < 4; p++ ) //共有4个四列
{
for ( lin = 0; lin < 4; lin++ ) //4列
{
for ( int zi = 0; zi < 2; zi++ ) //每列有两个字
{
uint8_t data;
if ( led_board_num1 == 1 )
{
data = display_board1.write_data_buff[48 - 16 * lin + 2 * zi + 4 * p + row];
writedata_led_board1 ( data );
}
if ( led_board_num1 == 2 )
{
if ( i == 0 ) //写第二块屏上的字
{
data = display_board1.write_data_buff[112 - 16 * lin + 2 * zi + 4 * p + row];
writedata_led_board1 ( data );
}
if ( i == 1 ) //写第一块屏上的字
{
data = display_board1.write_data_buff[48 - 16 * lin + 2 * zi + 4 * p + row];
writedata_led_board1 ( data );
}
}
if ( led_board_num1 == 3 )
{
if ( i == 0 ) //写第三块屏上的字
{
data = display_board1.write_data_buff[176 - 16 * lin + 2 * zi + 4 * p + row];
writedata_led_board1 ( data );
}
if ( i == 1 ) //写第二块屏上的字
{
data = display_board1.write_data_buff[112 - 16 * lin + 2 * zi + 4 * p + row];
writedata_led_board1 ( data );
}
if ( i == 2 ) //写第一块屏上的字
{
data = display_board1.write_data_buff[48 - 16 * lin + 2 * zi + 4 * p + row];
writedata_led_board1 ( data );
}
}
}
}
}
}
ST1_1;
delay_us ( 1 );
ST1_0;
switch ( row )
{
case ( 1 ) : A1_0; B1_1 ; break;
case ( 0 ) : A1_1; B1_0; break;
}
OE1_0; //显示
delay_us ( 10 ); //亮度调节,数值越大,led越亮
}
}