给出屏的初始化程序和M453 RTC的初始化设置,记得要打开RTC时钟
void InitLCD_ST7567(void)
{
FT12864_SDAT = FT12864_SCLK = FT12864_CD = FT12864_RST = FT12864_CS = 0;
//这里片选拉低后,就不再操作它了
delay_lcd(1000);
//待测此时间
//timer(30);//复位前的延时必须大于3ms
FT12864_RST = 1;
//timer(10);//复位完成后写入操作命令前的延时必须大于150ms
delay_lcd(1000*30);
//待测此时间,此时间应大于150ms
//0xE2
wlc(LCD_RESET);
//注意这里COM的输出要设置成反向 否则显示不对
//2018.6.30
wlc(SEG_DIRECTION_NORMAL);
wlc(DISPLAY_NORMAL);
wlc(COMOUTPUT_REVERSE);
//0xA2
wlc(LCDBIAS_1_9_SET);
//wlc(0x2C);
//wlc(0x2E);
//0x2F
wlc(POWER_CONTROL);
//0x23
wlc(DUIBIDU_CU_ADJUST_4);
//0x81 0x30
wlc(DUIBIDU_XI_ADJUST);
wlc(DUIBIDU_XI_VALUE);
//0x40 0xB0 0x00 0x10
wlc(STARTLINE_SET|0x00);
wlc(PAGEADDR_SET|0x00);
wlc(COLUMNADDR_LOW4BITS_SET|0x00);
wlc(COLUMNADDR_HIGH4BITS_SET|0x00);
//0xAF
wlc(DISPLAY_ON);
}
其中各个指令宏的定义如下
//command st7567
#define DISPLAY_ON 0xAF
#define DISPLAY_OFF 0xAE
#define STARTLINE_SET 0x40
//使用时为 STARTLINE_SET | 0x00 - STARTLINE_SET | 0x3F
#define PAGEADDR_SET 0xB0
//使用时为 PAGEADDR_SET | 0x00 - PAGEADDR_SET | 0x08 (PAGE 0-8)
//page8 is icon page
#define COLUMNADDR_LOW4BITS_SET 0x00
#define COLUMNADDR_HIGH4BITS_SET 0x10
//使用时为 COMMAND | 0x00 - COMMAND | 0x83 (column 0-131)
#define SEG_DIRECTION_NORMAL 0xA0
//normal
#define SEG_DIRECTION_REVERSE 0xA1
//reverse
#define DISPLAY_NORMAL 0xA6
//反显
#define DISPLAY_REVERSE 0xA7
#define DISPLAY_ALLPOINTS_OFF 0xA4
#define DISPLAY_ALLPOINTS_ON 0xA5
//1/65 duty, 1/9 bias
#define LCDBIAS_1_9_SET 0xA2
//1/65 duty, 1/7 bias
#define LCDBIAS_1_7_SET 0xA3
#define LCD_RESET 0xE2
#define COMOUTPUT_NORMAL 0xC0
#define COMOUTPUT_REVERSE 0xC8
#define POWER_CONTROL 0x2F
//booster circuit on
//voltage regulator circuit on
//voltage follower circuit on
#define DUIBIDU_CU_ADJUST_1 0x20
#define DUIBIDU_CU_ADJUST_2 0x21
#define DUIBIDU_CU_ADJUST_3 0x22
#define DUIBIDU_CU_ADJUST_4 0x23
#define DUIBIDU_CU_ADJUST_5 0x24
#define DUIBIDU_CU_ADJUST_6 0x25
#define DUIBIDU_CU_ADJUST_7 0x26
#define DUIBIDU_CU_ADJUST_8 0x27
//double-byte command
#define DUIBIDU_XI_ADJUST 0x81
#define DUIBIDU_XI_VALUE 0x30
//test with 45 first
//0x2D = 45
//value range: 0x00 - 0x3F(0 - 64)
在SYS_Init()加入
/* Enable RTC module clock*/
CLK_EnableModuleClock(RTC_MODULE);
CLK_SetModuleClock(RTC_MODULE, CLK_CLKSEL3_RTCSEL_LXT, 0);
void RTC_Init(void)
{
if((RTC->INIT & RTC_INIT_ACTIVE_Msk) == 0)//判断RTC是否是第一次上电
{
//如果VBAT上电初始化RTC
/* Enable RTC NVIC */
NVIC_EnableIRQ(RTC_IRQn);
/* Open RTC and start counting */
sWriteRTC.u32Year = 2018;
sWriteRTC.u32Month = 6;
sWriteRTC.u32Day = 22;
sWriteRTC.u32DayOfWeek = RTC_FRIDAY;
sWriteRTC.u32Hour = 11;
sWriteRTC.u32Minute = 10;
sWriteRTC.u32Second = 00;
sWriteRTC.u32TimeScale = RTC_CLOCK_24;
RTC_Open(&sWriteRTC);
/* Enable RTC tick interrupt, one RTC tick is 1 second */
RTC_EnableInt(RTC_INTEN_TICKIEN_Msk);
RTC_SetTickPeriod(RTC_TICK_1_SEC);
}
else
{
//芯片复位但是VBAT未断电,读取RTC的值
RTC_GetDateAndTime(&sReadRTC);
}
}
|