STM8L 液晶數碼管驅動,溫度計液晶屏顯示

啓動液晶驅動 stm8 支持 4com 28 seg  可以顯示 28*4=112點的液晶

void LCD_Configuration(void)
{
	/* Enable RTC CLK */
	CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);
	/* Choice CLK Source, HSI_Freq = 16M, RTC_Freq = 500Khz*/
	CLK_RTCClockConfig(CLK_RTCCLKSource_HSI,CLK_RTCCLKDiv_32); 

	/* Enable LCD CLK */
	CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);


	/* Frequence = 500K/(32+16)? Frame_Freq = Frequence/Duty = 60Hz */
	LCD_Init(LCD_Prescaler_32, LCD_Divider_16, LCD_Duty_1_4,
	LCD_Bias_1_3, LCD_VoltageSource_Internal);
	/* Enable PM */
	LCD_PortMaskConfig(LCD_PortMaskRegister_0, 0xFF);
	LCD_PortMaskConfig(LCD_PortMaskRegister_1, 0x0F);
	LCD_PortMaskConfig(LCD_PortMaskRegister_2, 0x00);
	LCD_PortMaskConfig(LCD_PortMaskRegister_3, 0x00);
	LCD_PortMaskConfig(LCD_PortMaskRegister_4, 0x00);
	LCD_PortMaskConfig(LCD_PortMaskRegister_5, 0x00);
	/*??LCD_Contrast_Level_7: Medium Density / High Density Maximum Voltage = 3.30V / 3.51V */
	LCD_ContrastConfig(LCD_Contrast_Level_7);
	/* No dead time */
	LCD_DeadTimeConfig(LCD_DeadTime_0);
	/*?LCD_PulseOnDuration_7: Pulse ON duration = 7/CLKprescaler */
	LCD_PulseOnDurationConfig(LCD_PulseOnDuration_7);
	LCD_Cmd(ENABLE);

	
}

根據 lcd 佈線 做位表

#define CS(com,seg)	(com*28+seg)
#define SMG(NUM)	CS(3,2+NUM*2),CS(2,2+NUM*2),CS(1,2+NUM*2),CS(0,1+NUM*2),CS(1,1+NUM*2),CS(3,1+NUM*2),CS(2,1+NUM*2)	//第一個數碼管
const INT8U DispBitTab[]={
	SMG(0),
	SMG(1),
	SMG(2),
	SMG(3),
};

創建數碼管對應的字符表

#define BIT0    0
#define BIT1    1
#define BIT2    2
#define BIT3    3
#define BIT4    4
#define BIT5    5
#define BIT6    6
#define BIT7    7


#define LedSeg_a  ( 1<<BIT0 )
#define LedSeg_b  ( 1<<BIT1 )
#define LedSeg_c  ( 1<<BIT2 )
#define LedSeg_d  ( 1<<BIT3 )
#define LedSeg_e  ( 1<<BIT4 )
#define LedSeg_f  ( 1<<BIT5 )
#define LedSeg_g  ( 1<<BIT6 )
#define LedSeg_h  ( 1<<BIT7 )    

#define LedPin	0

// 編碼計算
#define LedChar_0 LedPin ^ ( LedSeg_a |LedSeg_b |LedSeg_c |LedSeg_d |LedSeg_e |LedSeg_f )
#define LedChar_1 LedPin ^ ( LedSeg_b |LedSeg_c )
#define LedChar_2 LedPin ^ ( LedSeg_a |LedSeg_b |LedSeg_d |LedSeg_e |LedSeg_g )
#define LedChar_3 LedPin ^ ( LedSeg_a |LedSeg_b |LedSeg_c |LedSeg_d |LedSeg_g )
#define LedChar_4 LedPin ^ ( LedSeg_b |LedSeg_c |LedSeg_f  |LedSeg_g )
#define LedChar_5 LedPin ^ ( LedSeg_a |LedSeg_c |LedSeg_d | LedSeg_f  |LedSeg_g )
#define LedChar_6 LedPin ^ ( LedSeg_a |LedSeg_c |LedSeg_d | LedSeg_e |LedSeg_f |LedSeg_g )
#define LedChar_7 LedPin ^ ( LedSeg_a |LedSeg_b |LedSeg_c )
#define LedChar_8 LedPin ^ ( LedSeg_a |LedSeg_b |LedSeg_c | LedSeg_d |LedSeg_e |LedSeg_f |LedSeg_g )
#define LedChar_9 LedPin ^ ( LedSeg_a |LedSeg_b |LedSeg_c | LedSeg_d |LedSeg_f  |LedSeg_g )
const unsigned char lednumTab[]={LedChar_0,LedChar_1,LedChar_2,LedChar_3,LedChar_4,LedChar_5,LedChar_6,LedChar_7,LedChar_8,LedChar_9,0x00};

顯示數碼管的程序

void dis_bcd(INT8U led_id, INT8U num)			//顯示子程序
{
	INT8U i,pos;
	led_id*=7;
	num=lednumTab[num];
	for(i=0;i<7;i++)
	{
		pos=DispBitTab[led_id];
		if(num&1)	
			LCD->RAM[pos/8]|=BitTab[pos%8];
		else
			LCD->RAM[pos/8]&=~BitTab[pos%8];
		++led_id;
		num>>=1;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章