c51上跑smallrtos 之lcd1602任务

来源:互联网 发布:千方百计软件下载 编辑:程序博客网 时间:2024/06/13 04:42

 c51上跑smallrtos 之lcd1602任务

                                                                       /***********************************************************************  **                       LCD1602          **  ************************************************************************/#define uchar unsigned char                                                #define uint unsigned int                                                                                                                             sbit LCD_RS = P3^5;                                                        sbit LCD_RW = P3^6;                                                        sbit LCD_EN = P3^7;                                                                                                                                                                                /*******************************************************************/      /*                                                                         /*检查LCD忙状态                                                            /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。              /*                                                                         /*******************************************************************/                                                                                 uint8 lcd_busy()                                                             {    static uint8 result;                                                                                                                                           LCD_RS = 0;                                                                LCD_RW = 1;                                                                LCD_EN = 1;                                                                _nop_();_nop_();_nop_();_nop_();                                                                  result = (P2&0x80)>>7;                                                  LCD_EN = 0;                                                                return result;                                                         }                                                                                                                                                     /*******************************************************************/      /*                                                                         /*写指令数据到LCD                                                          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                                     /*                                                                         /*******************************************************************/                                                                                 void lcd_wcmd(uchar cmd)                                                   {     while(lcd_busy()){OSWait(K_TMO,2);};OS_ENTER_CRITICAL();                                LCD_RS = 0;                                                                LCD_RW = 0;                                                                LCD_EN = 0;                                                                _nop_();_nop_();                                                                  P2 = cmd;                                                                  _nop_();_nop_();_nop_();_nop_();                                                               LCD_EN = 1;                                                                _nop_();_nop_();_nop_();_nop_();                                                               LCD_EN = 0; OS_EXIT_CRITICAL();                                                            }                                                                                                                                                     /*******************************************************************/      /*                                                                         /*写显示数据到LCD                                                          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                                       /*                                                                         /*******************************************************************/                                                                                 void lcd_wdat(uchar dat)                                                   {  while(lcd_busy()){OSWait(K_TMO,2);};OS_ENTER_CRITICAL();                                  LCD_RS = 1;                                                                LCD_RW = 0;                                                                LCD_EN = 0;                                                                P2 = dat;                                                                  _nop_();_nop_();_nop_();_nop_();                                                            LCD_EN = 1;                                                                _nop_();_nop_();_nop_();_nop_();                                                            LCD_EN = 0;OS_EXIT_CRITICAL();                                                            }                                                                                                                                                     /*******************************************************************/      /*                                                                         /*  设定显示位置                                                           /*                                                                         /*******************************************************************/                                                                                 void lcd_pos(uchar pos)                                                    {                                                                             lcd_wcmd(pos|0x80);      //数据指针=80+地址变量                         }                                                                                                                                                    /*******************************************************************/      /*                                                                         /*  主程序                                                                 /*                                                                         /*******************************************************************/                                        unsigned char disTempstr[4];                            void num2char(int num ,unsigned char len){static uchar data i=0;i = (sizeof disTempstr)-1;    // 与这里的字符串长度相对应,从最后一个字符位开始。i-=(i-len);disTempstr[i]='\0';while(i>0){i = i -1;disTempstr[i] = num%10+'0';       //这里加上 ‘0’ 就是字符了!num/=10;} ;}void strAddChar(unsigned char a[],unsigned char b){   static unsigned char data la;static unsigned char data ll;  ll= sizeof disStr;la =0;while(a[la] !='\0'){la+=1;}if(ll<la+1){a[la]='E';la++;a[la]='\0';}else{   a[la]=b;la++; a[la]='\0';}}void strAdd(unsigned char a[],unsigned char b[]){   static unsigned char data la,lb;static unsigned char data ll;  ll= sizeof disStr;la =0;lb=0;while(a[la] !='\0'){la+=1;}while(b[lb] !='\0'){lb+=1;}if(ll<la+lb+1){a[la]='E';la++;a[la]='\0';}else{lb=0;do{   a[la]=b[lb];la++;lb++;}while(b[lb] !='\0');a[la]='\0';}}void desplay_char(unsigned char x,unsigned char y,unsigned char p)//在指定位置显示一个字符。{    if(y>0)   {       lcd_pos(x|0x40);   } else{lcd_pos(x);}    //lcd_wcmd(0x06);          //移动光标lcd_wdat(p);} unsigned char data lcdX=0;unsigned char data waitI=0;void LCD1602Wait(unsigned int t){waitI=t;while(waitI>0){waitI--; _nop_();}   }void LCD1602DesktopLine1()                                                                     {    disStr[0]='\0';/*disStr[0]='1';disStr[1]='2';disStr[2]='3';disStr[3]='4';disStr[4]='5';disStr[5]='6';disStr[6]='7';disStr[7]='8';disStr[8]='9';disStr[9]='a';disStr[10]='b';disStr[11]='c';disStr[12]='d';disStr[13]='e';disStr[14]='f';disStr[15]='g';disStr[16]='\0';   */ ;strAdd(disStr,ModeName());if(ModeID()>0){strAdd(disStr,"    "); strAdd(disStr,ModeState());}lcdX = 0;                                                         while(disStr[lcdX] != '\0')                                                {                                                                     lcd_wdat(disStr[lcdX]);         //显示字符"        "             lcdX++;     LCD1602Wait(20);                                                           }} void LCD1602DesktopLine2()                                                                     { uint8 i=0;disStr[0]='\0';if(ModeID()>0){if(StateHasInit()==0){//已经读出数据//第1字节为循环次数,第2-4字节为时间,第五字节为指向 MODE_DATA的索引值//第6字节为ACT_NAME_LIST字符串的第n个字符;表示当前正在执行的动作if(ModeIsAct()){if(ModeActionIsLoop()){//显示剩余循环数和时间for(i=0;i<4;i++){num2char((int)MODE_DATA_CURR[i],2);strAdd(disStr,disTempstr);if(i==0){ strAdd(disStr,"T ");}else if(i==1){  strAdd(disStr,":");  //h} else if(i==2){  strAdd(disStr,":"); //m}else if(i==3){  strAdd(disStr," "); //s}}strAdd(disStr," ");}else{//无数据strAdd(disStr,"--T --:--:--  ");}strAddChar(disStr,ModeCurrAction());strAdd(disStr," ");//num2char((int)MODE_DATA_CURR[5],1);//strAdd(disStr,disTempstr);}else{strAdd(disStr,"Pres A Act | Stp");}}else{//reading...strAdd(disStr,"Reading data.");}} else{   strAdd(disStr,"Pres B Slct Mode");}lcdX = 0;                                                        while(disStr[lcdX] != '\0')                                                {                                                                     lcd_wdat(disStr[lcdX]);         //显示字符"        "             lcdX++; LCD1602Wait(20);                                                              }       }                                                                                      void LCD1602Show()                                                                     {                                                                       static uchar data i=0;Temperature=0;                                                              //LCD初始化设定-------begin                                                              OSWait(K_TMO,2);                      //等待LCD电源稳定                           lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据                      OSWait(K_TMO,2);                                                                  lcd_wcmd(0x38);                                                            OSWait(K_TMO,2);                                                                  lcd_wcmd(0x38);                                                            OSWait(K_TMO,2);                                                                                                                                              lcd_wcmd(0x0c);          //显示开,关光标                                  OSWait(K_TMO,2); ;                                                                  lcd_wcmd(0x06);          //移动光标                                        OSWait(K_TMO,2);                                                                   lcd_wcmd(0x01);          //清除LCD的显示内容                               OSWait(K_TMO,2);                                                                //LCD初始化设定-------end                                                                           while(1)                                                                  {    if(UI_ID==0){ lcd_wcmd(0x0c);            //开显示OSWait(K_TMO,2);lcd_pos(0x10); //设置显示位置为第一行第17列LCD1602DesktopLine1();lcd_pos(0x50);             //设置显示位置为第二行第17列    LCD1602DesktopLine2();                          for(i=0;i<16;i++)           //向左移动16格                           {                                                                     lcd_wcmd(0x18);           //字符同时左移一格                        OSWait(K_TMO,OS_TICKS_PER_SEC / 50);                   //控制移动时间  if (UI_ID_CRT != UI_ID){goto ShowEnd;}                      }    /**/                                                    // 闪动子程序 lcd_wcmd(0x01);          //清除LCD的显示内容 OSWait(K_TMO,2);   for(i=0;i<10;i++){ lcd_pos(0x00); LCD1602DesktopLine1();lcd_pos(0x40);                 LCD1602DesktopLine2(); OSWait(K_TMO,20);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}//等待200个ticks                          /*lcd_wcmd(0x08);            //关闭显示                                  for(i=0;i<25;i++){OSWait(K_TMO,2);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}//等待50个ticks                               lcd_wcmd(0x0c);            //开显示//lcd_wcmd(0x01);          //清除LCD的显示内容lcd_pos(0x00); LCD1602DesktopLine1();lcd_pos(0x40);                 LCD1602DesktopLine2();                                 for(i=0;i<25;i++){OSWait(K_TMO,2);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}//等待50个ticks                                                            lcd_wcmd(0x08);            //关闭显示                                  for(i=0;i<25;i++){OSWait(K_TMO,2);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}//等待50个ticks;                     //延时                                 lcd_wcmd(0x0c);            //开显示  //lcd_wcmd(0x01);          //清除LCD的显示内容lcd_pos(0x00);LCD1602DesktopLine1();lcd_pos(0x40);                 LCD1602DesktopLine2(); for(i=0;i<25;i++){OSWait(K_TMO,2);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}//等待50个ticks                                                            lcd_wcmd(0x08);            //关闭显示                                               /**/                                               }else{if(UI_ID==1){ disStr[0]='\0';strAdd(disStr,"Key:");                                           lcd_pos(0x00);               //设置显示位置为第一行第1列            i = 0;                                                        while(disStr[i] != '\0')                                                {                                      //显示字符"         "   lcd_wdat(disStr[i]);                                                  i++;  LCD1602Wait(20);                                                               }disStr[0]='\0';strAdd(disStr,"code:");num2char((int)KEY_CMD,3);strAdd(disStr,disTempstr); lcd_pos(0x40);              //设置显示位置为第二行第1列             i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                               }OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==2){while(1){if(i==0){lcd_wcmd(0x0c); lcd_wcmd(0x01);          //清除LCD的显示内容 disStr[0]='\0';strAdd(disStr,"YYMMDD*W*HHMMSS");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++; LCD1602Wait(20);                                                                } i=0;}//连续输入不清屏OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}//键值变换字符//记录输入信息disStr[i]=KeyNameArray[(KEY_CMD%17)+1];disStr[i+1]='\0'; lcd_pos((i|0x40));lcd_wdat(disStr[i]); //光标移动i+=1;i=i%17; //if(i==0){ disStr[0]='\0';}}}else if(UI_ID==20){    i=Ds1302Save();   if(i==1){   i=0;UI_ID=21;goto ShowEnd;   }else{   i=0;UI_ID=22;goto ShowEnd;   }}else if(UI_ID==21){    disStr[0]='\0';strAdd(disStr,"Save datetime ok");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==22){    disStr[0]='\0';strAdd(disStr,"datetime error");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==4){while(1){if(i==0){ lcd_wcmd(0x0c); lcd_wcmd(0x01);          //清除LCD的显示内容 disStr[0]='\0';strAdd(disStr,"IIC:");i = 0;                                                while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++; LCD1602Wait(20);                                                                }//OSIICRead(IIC_RECE_DATAS,0,8) ;//iic stop到start之间至少持续10ms延时OSWait(K_TMO,2);if(   IICRead24c02(IIC_RECE_DATAS,0,8)){ i=0;while(i < 8)                                                {                                                                     lcd_wdat(IIC_RECE_DATAS[i]);         //显示字符"        "             i++; LCD1602Wait(20);                                                                }}else{    UI_ID=40;  i=0;goto ShowEnd;}i=0;}//连续输入不清屏OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}//键值变换字符//记录输入信息disStr[i]=KeyNameArray[(KEY_CMD%17)+1];disStr[i+1]='\0'; lcd_pos((i|0x40));lcd_wdat(disStr[i]); //光标移动i+=1;if(i==8){  i=0;while(disStr[i] != '\0')                                                {                                                                     IIC_SEND_DATAS[i]=disStr[i];             i++;                                                             }  for(i=0;i<8;i++){                                                                   lcd_wdat(IIC_SEND_DATAS[i]);         //显示字符"        "              LCD1602Wait(20);                                                                }  //OSIICWrite (0,IIC_SEND_DATAS,8) ;  //iic stop到start之间至少持续10ms延时  OSWait(K_TMO,2);  KEY_CMD= IICWrite24c02(8,IIC_SEND_DATAS,8);  if( KEY_CMD==1) {   UI_ID=41;  i=0;goto ShowEnd;  }else{   UI_ID=42;  i=0;    goto ShowEnd;  }  ;  }//i=i%17; //if(i==0){ disStr[0]='\0';}///**/}}else if(UI_ID==40){    disStr[0]='\0';strAdd(disStr,"Read data error");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==41){    disStr[0]='\0';strAdd(disStr,"Save data ok");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==42){    disStr[0]='\0';strAdd(disStr,"Save data error");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==5){ disStr[0]='\0'; strAdd(disStr,"CurrMode:");strAdd(disStr,ModeName());lcd_pos(0x00); i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }disStr[0]='\0';strAdd(disStr,"SlctMode:"); strAdd(disStr,ModeNameSlct());lcd_pos(0x40);i=0;  while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==6){while(1){if(i==0){ disStr[0]='\0'; strAdd(disStr,ModeDataNameCurr());strAdd(disStr,":");//num2char((int)(ModeDatState+1)&0x7f,1);//strAdd(disStr,disTempstr);//num2char((int)MODE_DAT_INF_IDX[ModeID()-1][1],1);//strAdd(disStr,disTempstr);//strAdd(disStr,":");for(i=0;i<(DataSaveInfsCurr()&0x07)+1;i++){if(i==1){ strAdd(disStr,"h");//H}if(i==2){  strAdd(disStr,"m"); // M}num2char((int)MODE_DATA_SAVE[i],2);strAdd(disStr,disTempstr);}if(i==1){  strAdd(disStr,"T");}if(i==3){  strAdd(disStr,"s");//s}lcd_pos(0x00); i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }disStr[0]='\0';strAdd(disStr," Input:"); lcd_pos(0x40);i=0;  while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }}OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}if(KEY_CMD%16==2){goto ShowEnd;}//键值变换字符//记录输入信息disStr[i]=KeyNameArray[(KEY_CMD%17)+1];disStr[i+1]='\0';IIC_SEND_DATAS[i-7]=disStr[i]; lcd_pos((i|0x40));lcd_wdat(disStr[i]); //光标移动i+=1;if(i>=16){i=16;}}} else if(UI_ID==61){    disStr[0]='\0';strAdd(disStr,"Save data error");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }lcd_pos(0x40);disStr[0]='\0'; num2char(8*(DataSaveInfsCurr()>>3),2);strAdd(disStr,disTempstr);strAdd(disStr,"-");num2char((DataSaveInfsCurr()&0x07)+1,2);strAdd(disStr,disTempstr);strAdd(disStr,":");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }i=0;  for(;i<(DataSaveInfsCurr()&0x07)+1;i++)                                                {                                                                     lcd_wdat(MODE_DATA_SAVE[i]+'0');         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }i=0;OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}else if(UI_ID==62){    disStr[0]='\0';strAdd(disStr,"Save data ok");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }lcd_pos(0x40);disStr[0]='\0'; num2char(8*(DataSaveInfsCurr()>>3),2);strAdd(disStr,disTempstr);strAdd(disStr,"-");num2char((DataSaveInfsCurr()&0x07)+1,2);strAdd(disStr,disTempstr);strAdd(disStr,":");i = 0;                                                         while(disStr[i] != '\0')                                                {                                                                     lcd_wdat(disStr[i]);         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }i=0;  for(;i<(DataSaveInfsCurr()&0x07)+1;i++)                                                {                                                                     lcd_wdat(MODE_DATA_SAVE[i]+'0');         //显示字符"        "             i++;  LCD1602Wait(20);                                                              }i=0;OSWait(K_SIG,0);if (UI_ID_CRT != UI_ID){goto ShowEnd;}}}                         ShowEnd:        UI_ID_CRT=UI_ID;lcd_wcmd(0x0c);  OSWait(K_TMO,2); lcd_wcmd(0x01);          //清除LCD的显示内容  OSWait(K_TMO,2); i = 0;                                                                      }                                                                       }  


原创粉丝点击