STM32之点阵显示

驱动点阵,其点阵和开发板相关信息:
**开发板:**ALIENTEK 探索者 STM32F407。其中程序是从stm32l073移植过去的,仅仅是点阵显示的程序。
**点阵信息:**HDLx-2416 Series,5×7Alphanumeric Displays,总共有四个显示点阵,每个5×7。没使用驱动芯片。
引脚定义:
STM32之点阵显示_第1张图片
STM32之点阵显示_第2张图片
因为无驱动芯片,所以直接引脚点亮。
直接代码:

/*主函数*/
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;
	}	
	//////////////////////////////////////////////////////以上显示数字和字母
}

注释估计有点乱,但可以大致看看。显示数字和字符应该对应着说明手册里面的字符编码,每个点阵不一样,再此仅提供思路。

你可能感兴趣的:(单片机,stm32,嵌入式)