int main(void) { u8 key; u16 i=0; u8 datatemp[SIZE]; SystemInit(); delay_init(72); //延时初始化 NVIC_Configuration(); uart_init(9600); LED_Init(); KEY_Init(); LCD_Init(); AT24CXX_Init(); //IIC初始化 POINT_COLOR=RED;//设置字体为蓝色 LCD_ShowString(60,50,"Mini STM32"); LCD_ShowString(60,70,"IIC TEST"); LCD_ShowString(60,90,"ATOM@ALIENTEK"); LCD_ShowString(60,110,"2011/1/1"); while(AT24CXX_Check())//检测不到24c02 { LCD_ShowString(60,130,"24C02 Check Failed!"); delay_ms(500); LCD_ShowString(60,130,"Please Check! "); delay_ms(500); LED0=!LED0;//DS0闪烁 } LCD_ShowString(60,130,"24C02 Ready!"); //显示提示信息 LCD_ShowString(60,150,"KEY0:Write KEY2(WK_UP):Read"); POINT_COLOR=BLUE;//设置字体为蓝色 while(1) { key=KEY_Scan(); if(key==1)//KEY0按下,写入24C02 { LCD_Fill(0,170,239,319,WHITE);//清除半屏 LCD_ShowString(60,170,"Start Write 24C02...."); AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE); LCD_ShowString(60,170,"24C02 Write Finished!");//提示传送完成 } if(key==3)//KEY_UP按下,读取字符串并显示 { LCD_ShowString(60,170,"Start Read 24C02.... "); AT24CXX_Read(0,datatemp,SIZE); LCD_ShowString(60,170,"The Data Readed Is: ");//提示传送完成 LCD_ShowString(60,190,datatemp);//显示读到的字符串 } i++; delay_ms(10); if(i==20) { LED0=!LED0;//提示系统正在运行 i=0; } } }
AT24CXX_RESULT confEEPROM(void) { eeprom.i2c = &i2c_handle; eeprom.AT24CXX_ADDRESS = 0xA0; eeprom.AT24CXX_CLOCK = 100000; eeprom.AT24CXX_I2Cx = I2C1; eeprom.TIMEOUT = 1000; if (AT24CXX_Init(&eeprom) != AT24CXX_RES_OK) { return AT24CXX_RES_ERROR; } return AT24CXX_RES_OK; }
//外部中断初始化函数 void Touch_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; //中断 GPIO_InitTypeDef GPIO_InitStructure; //GPIO EXTI_InitTypeDef EXTI_InitStructure; //外部中断线 //注意,时钟使能之后,对GPIO的操作才有效 //所以上拉之前,必须使能时钟.才能实现真正的上拉输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_0|GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入 GPIO_Init(GPIOC, &GPIO_InitStructure); Read_ADS(&Pen_Point.X,&Pen_Point.Y);//第一次读取初始化 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1); EXTI_InitStructure.EXTI_Line = EXTI_Line1; //外部线路EXIT1 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部中断触发沿选择:设置输入线路下降沿为中断请求 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能外部中断新状态 EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 #ifdef ADJ_SAVE_ENABLE AT24CXX_Init();//初始化24CXX if(Get_Adjdata())return;//已经校准 else //未校准? { LCD_Clear(WHITE);//清屏 Touch_Adjust(); //屏幕校准 Save_Adjdata(); } Get_Adjdata(); #else LCD_Clear(WHITE);//清屏 Touch_Adjust(); //屏幕校准,带自动保存 #endif }
//外部中断初始化函数 void Touch_Init(void) { //注意,时钟使能之后,对GPIO的操作才有效 //所以上拉之前,必须使能时钟.才能实现真正的上拉输出 RCC->APB2ENR|=1<<4; //PC时钟使能 RCC->APB2ENR|=1<<0; //开启辅助时钟 GPIOC->CRL&=0XFFFF0000;//PC0~3 GPIOC->CRL|=0X00003883; GPIOC->CRH&=0XFF0FFFFF;//PC13 GPIOC->CRH|=0X00300000;//PC13推挽输出 GPIOC->ODR|=0X200f; //PC0~3 13 全部上拉 Read_ADS(&Pen_Point.X,&Pen_Point.Y);//第一次读取初始化 MY_NVIC_Init(2,0,EXTI1_IRQChannel,2); RCC->APB2ENR|=0x01; //使能io复用时钟 AFIO->EXTICR[0]|=0X0020; //EXTI13映射到PC1 EXTI->IMR|=1<<1; //开启line1上的中断 EXTI->EMR|=1<<1; //不屏蔽line1上的事件 EXTI->FTSR|=1<<1; //line1上事件下降沿触发 #ifdef ADJ_SAVE_ENABLE AT24CXX_Init();//初始化24CXX if(Get_Adjdata())return;//已经校准 else //未校准? { LCD_Clear(WHITE);//清屏 Touch_Adjust(); //屏幕校准 Save_Adjdata(); } Get_Adjdata(); #else LCD_Clear(WHITE);//清屏 Touch_Adjust(); //屏幕校准,带自动保存 #endif // printf("Pen_Point.xfac:%f\n",Pen_Point.xfac); // printf("Pen_Point.yfac:%f\n",Pen_Point.yfac); // printf("Pen_Point.xoff:%d\n",Pen_Point.xoff); // printf("Pen_Point.yoff:%d\n",Pen_Point.yoff); }
//触摸屏初始化 //返回值:0,没有进行校准 // 1,进行过校准 //触摸屏初始化 //返回值:0,没有进行校准 // 1,进行过校准 u8 TP_Init(void) { //注意,时钟使能之后,对GPIO的操作才有效 //所以上拉之前,必须使能时钟.才能实现真正的上拉输出 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE); //使能PB,PF端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2; // PB1,PB2端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_2);//上拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // PF9端口配置 推挽输出 GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_SetBits(GPIOF,GPIO_Pin_9);//P9 上拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_10; // PF8.PF10端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(GPIOF, &GPIO_InitStructure); TP_Read_XY(&tp_dev.x,&tp_dev.y);//第一次读取初始化 AT24CXX_Init();//初始化24CXX if(TP_Get_Adjdata())return 0;//已经校准 else //未校准? { LCD_Clear(WHITE);//清屏 TP_Adjust(); //屏幕校准 TP_Save_Adjdata(); } TP_Get_Adjdata(); return 1; }