儿童智能书包(五)-----------触摸屏课程录入设计

        通过之前设计好的虚拟键盘,书包可在按下KEY1后进入触摸屏屏课程录入设计功能。在编写此部分的代码前,为保险起见需在触摸屏库里找到tp_dev.init();结构体函数,里面的TP_Adjust()重新来出来手动执行一遍,因为之前在测试的时候就发现过触摸屏时不时的就无法触摸,原因是正点原子在程序里写入过触摸屏校准测试,测试不通过是无法打上驱动函数的,而tp_dev.init();结构体函数放在触摸屏初始化函数里,有时候掉电通电是不会执行该程序,故保险起见我选择多执行一次再也没有出现触摸屏无法使用的情况。

        在录入课程的程序设计里,我之前预留了那些功能函数加在了虚拟按键的行列扫描里,只需在“矩阵键盘”算出对应的键值里进行if判断,通过AT24CXX_Write(count,(u8*)TEXT_Buffer,SIZE);函数填入已写好好的课程数组和宏定义即可根据for循环内count的改变自动填写下一个AT24C02的课程地址。在每选中一个键值的时候会产生改变lessoncount的局部变量值,该值用于表示选中何种课程,在if判断中除了要判断lessoncount以外还需与运算queren变量(防止用户误触),if运算成立后进入功能函数,此时queren和lessoncount同时归零预备下一次选课,执行功能函数写入AT24C02后由程序break手动退出for循环内if判断功能函数外的while(1)死循环,做到“一输入一步"。

void lurukecheng()
{
        int Cancel = 0 ;
        int count = 0;
        int flag = 0;
        LCD_Clear(WHITE);//清除屏幕所有内容
        load_keyboard(0,170,(u8**)kbd_menu);//加载虚拟键盘
        while(1)
        {
            LessonDisplay();//显示界面
            for(count=87;count<255;)//60-228,一共3*56=168个,开始录入AT24C02里面的64个地址   一节课三个地址,一天八节课,一周有七天
            {
                //每次都+3后再进入判断写入则会造成以下问题:取消的时候多了一次,导致后面数据填写出错,于是把count+=3;放在每次选择后的break前,问题未解决。
                //在写数据的过程中,每成功写入一个字节E2PROM的存储空间地址就会+1,加到0XFF后又重新0X00,因此每次写完一次课程后导致的后面一个课程数据丢失
                //原因在于写完后地址自动+1了,解决方法,不判断首位
                //LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);LCD_ShowString(16+6+64,16,90,16,16,"Monday");
                switch(count)
                {
                    case 87:LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);printf("count is %d\r\n",count);LCD_ShowString(16+6+64,16,90,16,16,"Monday");break;
                    case 111:LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);printf("count is %d\r\n",count);LCD_ShowString(16+6+64,16,90,16,16,"Tuesday");break;
                    case 135:LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);printf("count is %d\r\n",count);LCD_ShowString(16+6+64,16,90,16,16,"Wednesday");break;
                    case 159:LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);printf("count is %d\r\n",count);LCD_ShowString(16+6+64,16,90,16,16,"Thursday");break;
                    case 183:LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);printf("count is %d\r\n",count);LCD_ShowString(16+6+64,16,90,16,16,"Friday");break;
                    case 207:LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);printf("count is %d\r\n",count);LCD_ShowString(16+6+64,16,90,16,16,"Saturday");break;
                    case 231:LCD_Fill(16+2+64,16,16+6+64+100,32,WHITE);printf("count is %d\r\n",count);LCD_ShowString(16+6+64,16,90,16,16,"Sunday");break;
                    default:break;
                }
                queren = 0;//归零
                printf("从168个地址中退出\r\n");
                lessoncount = 0;//归零,避免填入空课
                if(flag == 1)
                {
                    break;
                }
                while(1)//强制输入才让走,不然则很快走完64轮
                {
                    LCD_ShowString(16+6+64,48,90,16,16,"Completed!");
                    printf("退出到了while(flag != 1)\r\n");
                    if(flag == 1)
                    {
                        break;
                    }
                    Cancel = GET_NUM();//开始扫描虚拟按键的输入情况
                    printf("queren:%d Cancel:%d lessoncount:%d now_select_lesson:%d\r\n",queren,Cancel,lessoncount,now_select_lesson);
                    if(Cancel == 15 && queren == 1)//取消录入课程,回退主界面
                    {
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"Cancel.......");
                        printf("开始退出\r\n");
                        flag = 1;//设置标志位,再也无法进入该循环,取消录入课程
                        now_select_lesson = 0;
                        queren = 0;
                        lessoncount = 0; 
                        break;//普通的break不会导致再也进不来,出了while(flag != 1)后会再经过0-63轮进入
                    }
                    if(lessoncount == 1 && queren == 1)//switch按键负责跳过(填空课)
                    {
                        printf("你选择填入空课\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"CHOSE:NON");
                        AT24CXX_Write(count,(u8*)TEXT_Buffer,SIZE);
                        delay_ms(200);
                        lessoncount = 0;
                        queren = 0;
                        lessoncount = 0; 
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    if(queren == 1 && now_select_lesson==1)//queren是原DEL
                    {
                        printf("你选择填入数学\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"CHOSE:MATH!");
                        AT24CXX_Write(count,(u8*)Math,MathSIZE);//数学写入AT24C02的地址count,一共写入7x8=64个,一周有七天,每天都有八节课
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==2)//通过now_select_lesson区分不同的写入内容
                    {
                        printf("你选择填入语文\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"CHINESE");
                        AT24CXX_Write(count,(u8*)Chinese,ChineseSIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==3)
                    {
                        printf("你选择填入英语\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"ENGLISH");
                        AT24CXX_Write(count,(u8*)English,EnglishSIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==4)
                    {
                        printf("你选择填入物理\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"PHYSICS");
                        AT24CXX_Write(count,(u8*)Physics,PhysicsSIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==5)
                    {
                        printf("你选择填入生物\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"BIOLOGY");
                        AT24CXX_Write(count,(u8*)Biology,BiologySIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==6)
                    {
                        printf("你选择填入化学\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"CHEMISTRY");
                        AT24CXX_Write(count,(u8*)Chemistry,ChemistrySIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==7)
                    {
                        printf("你选择填入地理\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"GEOGRAPHY!");
                        AT24CXX_Write(count,(u8*)Geography,GeographySIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==8)
                    {
                        printf("你选择填入政治\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"POLITICS");
                        AT24CXX_Write(count,(u8*)Politics,PoliticsSIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                    else if(queren == 1 && now_select_lesson==9)
                    {
                        printf("你选择填入历史\r\n");
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        LCD_ShowString(16+6+64,48,90,16,16,"HISTORY");
                        AT24CXX_Write(count,(u8*)History,HistorySIZE);
                        delay_ms(200);
                        queren = 0;
                        lessoncount = 0; 
                        now_select_lesson = 0;
                        LCD_Fill(16+2+64,46,16+6+64+100,64,WHITE);
                        count+=3;
                        break;
                    }
                }//while(1) 作用范围结尾
                
                if(flag == 1)
                {
                    printf("从168个地址的if(flag == 1)退出\r\n");
                    break;
                }
            }
            if(flag == 1)
            {
                break;
            }
            Cancel = 0;//结束录入并归位Cancel
        }//最外面的while(1)作用范围结尾
        flag = 0;
        LCD_Clear(WHITE);
        printf("即将回到主界面函数\r\n");

}


       除了完成输入外,我还做了一个人机交互的结果反馈,在上半屏幕的地方有个switch用于判断当前输入的AT24C02中的课程内容属于星期几,还多加了一个显示completed的状态查询,该显示函数放在退出if....功能函数的后面即将退出时,用于显示写入状态同时也能给到用户反馈不然总觉得点了后也没啥反应有点空虚啥的,不知道输没输入。

        为什么要设置for循环内有一个while(1)死循环卡住,并且手动break退出?因为执行的是for(count=87;count<255;)的一个循环,不加入限制条件则用户在按下输入或并未输入的时候就已经循环结束,没有时间录入所有课程。同时,在用户不想输入课程时可以用过虚拟键盘的”取消录入“功能设立falg标志位,由此标志位进行各个循环的if......break;彻底退出录入课程功能,返回主界面的三大功能待选:

while(1)

{
    {
        while(1)
        {
            xingqiji = riqixianshi();
            LCD_ShowString(60+24+32,120,200,16,16,"-");
            LCD_ShowString(60+24+54,120,200,16,16,"-");                
            LCD_ShowString(60+24+16,175,200,16,16,":");    
            LCD_ShowString(60+24+28+12,175,200,16,16,":");    
            LCD_ShowNum(60+24,120,calendar.w_year,4,16);                                      
            LCD_ShowNum(100+24,120,calendar.w_month,2,16);                                      
            LCD_ShowNum(124+24,120,calendar.w_date,2,16);    
            LCD_ShowNum(60+24,175,calendar.hour,2,16);                                      
            LCD_ShowNum(84+24,175,calendar.min,2,16);                                      
            LCD_ShowNum(108+24,175,calendar.sec,2,16);
            key=KEY_Scan(0);

            LCD_ShowString(16+6+64+6,64,70,16,16,"Welcome");

            LCD_ShowString(16+60,222,100,16,16,"KEY0 - CHECK");

            LCD_ShowString(16+60,238,100,16,16,"KEY1 - IPUT");

            LCD_ShowString(16+60,254,100,16,16,"KEY_UP - GPS");

            if(key==KEY1_PRES)//KEY1 进入课表输入功能
            {
                tp_dev.init();
                TP_Adjust();
                TP_Init();
                lurukecheng();
            }
            else if(key==KEY0_PRES)//KEY0进入课表查询功能
            {
                chakankecheng();
            }
            else if(key==WKUP_PRES)//发送GPS短信
            {
                LCD_ShowString(16+60,100,100,16,16,"SEND GPS.....");
                hujiu(Jing,Wei);
                LCD_Fill(16+60,100,176,116,WHITE);
            }
        }
    }
}

        需要注意的,每次写入AT24C02后EEPROM寄存器内指针都会自动向后+1,故写入的三个数据只有后两位能进行判断用,所幸后两位的差别也足以满足九种课程判断索性不再更改。由此我们可以完成触摸屏录入一周课表的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值