驱动点阵,其点阵和开发板相关信息:
**开发板:**ALIENTEK 探索者 STM32F407。其中程序是从stm32l073移植过去的,仅仅是点阵显示的程序。
**点阵信息:**HDLx-2416 Series,5×7Alphanumeric Displays,总共有四个显示点阵,每个5×7。没使用驱动芯片。
引脚定义:
因为无驱动芯片,所以直接引脚点亮。
直接代码:
/*主函数*/
int main(void)
{
u8 key;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz
delay_init(168); //初始化延时函数
dotmatrix_GPIOInit();
TimingInit(); //有关显示的时序引脚初始化
LEDdisplay(3,1); //最左边数字
delay_ms(1);
LEDdisplay(2,2); //从最左边数第二个数字
delay_ms(1);
LEDdisplay(1,3); //从最左边数第三个数字
delay_ms(1);
LEDdisplay(0,4); //最后一个数字
delay_ms(1);
while(1)
{
delay_ms(10);
}
}
/*打开时钟,配置引脚,所有的引脚根据开发板的资源自行配置*/
void dotmatrix_GPIOInit(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能时钟B
GPIO_InitStructure.Pin=CLR_PIN|CE1_PIN|CE2_PIN|CU_PIN; //PB4 PB5 PB3 PB6 CE1_PIN|CE2_PIN|
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; //配置IO频率
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);//配置这些IO是PORTB口的引脚
__HAL_RCC_GPIOC_CLK_ENABLE(); //使能时钟c
GPIO_InitStructure.Pin=WR_PIN|A1_PIN|A0_PIN|D0_PIN|D1_PIN|D2_PIN|D3_PIN; //PC7 PC8 PC6 PC10 PC11 PC12 PC13
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;//配置IO频率
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);//配置这些IO是PORTC口的引脚
__HAL_RCC_GPIOE_CLK_ENABLE(); //使能时钟E
GPIO_InitStructure.Pin=A1_PIN|A0_PIN; //
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;//配置IO频率
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);//配置这些IO是PORTC口的引脚
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能时钟B
GPIO_InitStructure.Pin=D4_PIN|D5_PIN|D6_PIN; //PA13 PA14 PA15
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;//配置IO频率
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//配置这些IO是PORTC口的引脚
AllPinInit();
}
/*数字引脚初始化默认低电平*/
void AllPinInit(void)
{
HAL_GPIO_WritePin(GPIOC,D0_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,D1_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,D2_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,D3_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,D4_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,D5_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,D6_PIN,GPIO_PIN_RESET);
}
/*初始化有关时序的引脚
CE1 and CE2 must be a logic 0 to write to the display
CLR is a logic 0 reset
CU* data is stored in 1= ASCII, 0 = Attribute RAM/Control Register)
WR must be a logic 0 to store data in the display, Data will be latched
into the display on the rising edge of the WR signal. */
void TimingInit(void)
{
CLR_ON; //清除置高,无效
CE1_ON; //初始状态为高电平
CE2_ON; //初始状态为高电平
CU_ON; //默认状态为1: ASCII显示
// WR_ON; //初始化高电平,低电平有效
}
/*点阵显示代码*/
void LEDdisplay(uint8_t x,uint8_t code) //uint8_t x,
{
CE1_OFF; //如果需要显示,CE1低电平, 低电平使能
CE2_OFF; //如果需要显示,CE2低电平, 低电平使能
select(x);
delay_ms(1);
WR_OFF;
delay_ms(1);
displaycode(code); //发送完数据之后,在WR低电平下50纳秒,之后WR置高,40纳秒,让数据锁存。
delay_ms(1);
WR_ON;
delay_ms(1);
CE1_ON; //如果需要显示,CE1低电平, 低电平使能
CE2_ON; //如果需要显示,CE2低电平, 低电平使能
}
/*A0–A1 selects a specific location in the display memory.
Address 00 accesses the far right display location.
Address 11 accesses the far left location. 片选*/
void select(uint8_t x)
{
switch(x)
{
case 0: A0_OFF; A1_OFF; break;
case 1: A0_ON; A1_OFF;break;
case 2:A0_OFF; A1_ON;break;
case 3:A0_ON; A1_ON;break;
default: break;
}
}
/*显示什么字符,显示的字符0-9,A-Z */
void displaycode(uint8_t code)
{
uint8_t AtoOValue=0;
uint8_t PtoZValue=0;
AtoOValue=code-64;
PtoZValue=AtoOValue-16;
AllPinInit();
if((code>=0)&&(code<=9)) //需要显示0-9,D4 D5长亮
{
D5_ON;
D4_ON;
}
else if((AtoOValue>=0)&&(AtoOValue<=15)) //需要显示A-O,D6长亮
{
D6_ON;
}
else if((PtoZValue>=0)&&(PtoZValue<=10)) //P-Z ,长亮D6 D4
{
D4_ON;
D6_ON;
}
switch(code) //|(code-64)|(code-80)
{
case 0:break; //0:0x03 /P D0_OFF,D0_OFF,D0_OFF;D0_OFF; D0_ON;D1_ON;D2_ON;D3_ON;D6_ON;D4_OFF;D5_OFF;
case 1:D0_ON;break; //1:0x13 /A /Q D1_OFF;D2_OFF;D3_OFF;D6_OFF;
case 2:D1_ON;break; //2:0x23 /B /R D0_OFF;D2_OFF;D3_OFF;D6_OFF;
case 3:D0_ON;D1_ON;break; //3:0x33 /C /S
case 4:D2_ON;break; //4:0x43 /D /T
case 5:D2_ON;D0_ON;break; //5:0x53 /E /U
case 6:D2_ON;D1_ON;break; //6:0x63 /F /Y
case 7:D2_ON;D1_ON;D0_ON;break; //7:0x73 /G /W
case 8:D3_ON;break; //8:0x83 /H /X
case 9:D3_ON;D0_ON;break; //9:0x93 /I /Y
case 10:D3_ON;D1_ON;break; //J 0xA4 /Z
case 11:D3_ON;D1_ON;D0_ON;break; //K 0xB4
case 12:D3_ON;D2_ON;break; //L 0xC4
case 13:D3_ON;D2_ON;D0_ON;break; //M 0xD4
case 14:D3_ON;D1_ON;D2_ON;break; //N 0xE4
case 15:D3_ON;D2_ON;D1_ON;D0_ON;break; //O 0xF4
default:break;
}
switch(AtoOValue) //A-O
{
case 0:break; //0:0x03 /P D0_OFF,D0_OFF,D0_OFF;D0_OFF; D0_ON;D1_ON;D2_ON;D3_ON;D6_ON;D4_OFF;D5_OFF;
case 1:D0_ON;break; //1:0x13 /A /Q D1_OFF;D2_OFF;D3_OFF;D6_OFF;
case 2:D1_ON;break; //2:0x23 /B /R D0_OFF;D2_OFF;D3_OFF;D6_OFF;
case 3:D0_ON;D1_ON;break; //3:0x33 /C /S
case 4:D2_ON;break; //4:0x43 /D /T
case 5:D2_ON;D0_ON;break; //5:0x53 /E /U
case 6:D2_ON;D1_ON;break; //6:0x63 /F /Y
case 7:D2_ON;D1_ON;D0_ON;break; //7:0x73 /G /W
case 8:D3_ON;break; //8:0x83 /H /X
case 9:D3_ON;D0_ON;break; //9:0x93 /I /Y
case 10:D3_ON;D1_ON;break; //J 0xA4 /Z
case 11:D3_ON;D1_ON;D0_ON;break; //K 0xB4
case 12:D3_ON;D2_ON;break; //L 0xC4
case 13:D3_ON;D2_ON;D0_ON;break; //M 0xD4
case 14:D3_ON;D1_ON;D2_ON;break; //N 0xE4
case 15:D3_ON;D2_ON;D1_ON;D0_ON;break; //O 0xF4
default:break;
}
switch(PtoZValue) //p-z
{
case 0:break; //0:0x03 /P D0_OFF,D0_OFF,D0_OFF;D0_OFF; D0_ON;D1_ON;D2_ON;D3_ON;D6_ON;D4_OFF;D5_OFF;
case 1:D0_ON;break; //1:0x13 /A /Q D1_OFF;D2_OFF;D3_OFF;D6_OFF;
case 2:D1_ON;break; //2:0x23 /B /R D0_OFF;D2_OFF;D3_OFF;D6_OFF;
case 3:D0_ON;D1_ON;break; //3:0x33 /C /S
case 4:D2_ON;break; //4:0x43 /D /T
case 5:D2_ON;D0_ON;break; //5:0x53 /E /U
case 6:D2_ON;D1_ON;break; //6:0x63 /F /Y
case 7:D2_ON;D1_ON;D0_ON;break; //7:0x73 /G /W
case 8:D3_ON;break; //8:0x83 /H /X
case 9:D3_ON;D0_ON;break; //9:0x93 /I /Y
case 10:D3_ON;D1_ON;break; //J 0xA4 /Z
case 11:D3_ON;D1_ON;D0_ON;break; //K 0xB4
default:break;
}
//////////////////////////////////////////////////////以上显示数字和字母
}
注释估计有点乱,但可以大致看看。显示数字和字符应该对应着说明手册里面的字符编码,每个点阵不一样,再此仅提供思路。