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; } }
阅读全文
0 0
- c51上跑smallrtos 之lcd1602任务
- c51上跑smallrtos 之4x4 矩阵键盘任务
- c51上跑smallrtos 之ds1302 存取日期
- C51---LCD1602---液晶显示驱动
- [89C51单片机]LCD1602静态显示
- c51单片机超声测距hcsr04在 rtos运行的 实验 基于陈明计先生的smallrtos
- jin1956121用c51编写的万年历 LCD1602液晶显示.定时闹钟
- LCD1602
- LCD1602
- LCD1602
- LCD1602
- LCD1602
- LCD1602
- LCD1602
- LCD1602
- LCD1602
- lcd1602
- LCD1602
- 额这是我程序员职业生涯第一篇的博客
- 分布式框架dubbo-API文档
- Spark配置参数说明
- 关于TextView图文混排自动换行解决方案
- leejianjun的博客 win7使用计划任务定时关机
- c51上跑smallrtos 之lcd1602任务
- 如何将VS向导生成的DLL工程切换到EXE配置
- JavaScript——Array类型
- Centos 安装mysql 出现'Access denied for user 'root'@'localhost' (using password: NO)'
- Dubbo 源码学习笔记 —— SPI的机制体现
- 百练noi 06:校门外的树
- arm linux中一些重要的宏及地址定义
- [Baltic2007]Sound静音问题
- tomcat多版本共存梳理