⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1602cd.c

📁 基于51单片机与1602液晶的开发程序,实现了在1602上执行菜单操作的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
    uchar key;
    while(1){
        displaypicture(9);//显示画面9---三级菜单52/选择了安又琪
        while(1){
            key=keyscan();
            if(key!=16)break;
            }
        if(key==LAST)break;//返回画面8
        else if(key==ENTER)manage9_1();//确认选择安又琪
        }
}
//函数名:manage8_2();功能:对三级菜单3(画面8)中按确认的响应
void manage8_2(void){
    uchar key;
    while(1){
        displaypicture(12);//显示画面12---四级菜单81/Z1
        while(1){
            key=keyscan();
            if(key!=16)break;
            }
        if(key==ENTER)managetask(3);//演唱/Z1
        else if(key==BACK)break;//返回上一级菜单
        }
}
//函数名:manage9_1();功能:对三级菜单4(画面9)中按确认的响应
void manage9_1(void){
    uchar key;
    while(1){
        displaypicture(13);//显示画面13--四级菜单91/A1
        while(1){
            key=keyscan();
            if(key!=16)break;
            }
        if(key==ENTER)managetask(4);//演唱A1
        else if(key==BACK)break;//返回上一级菜单
        }
}
//函数名:manage14_1();功能:对三级菜单5(画面18)中按下一条的响应
void manage14_1(void){
    uchar key;
    while(1){
        displaypicture(15);//显示画面19---三级菜单6/选择了胡彦宾
        while(1){
            key=keyscan();
            if(key!=16)break;
            }
        if(key==LAST)break;//返回画面18
        else if(key==ENTER)manage15_1();//确认选择胡彦宾
        }
}
//函数名:manage14_2();功能:对三级菜单5(画面18)中按确认的响应
void manage14_2(void){
    uchar key;
    while(1){
        displaypicture(18);//显示画面18---四级菜单181/发如雪
        while(1){
            key=keyscan();
            if(key!=16)break;
            }
        if(key==ENTER)managetask(5);//演唱发如雪 
        else if(key==BACK)break;//返回上一级菜单
        }
}
//函数名:manage15_1();功能:对三级菜单6(画面19)中按确认的响应
void manage15_1(void){
    uchar key;
    while(1){
        displaypicture(19);//显示画面19--四级菜单191/红颜
        while(1){
            key=keyscan();
            if(key!=16)break; 
            }
        if(key==ENTER)
        managetask(6);//演唱红颜
        else if(key==BACK)break;//返回上一级菜单
        }
}
//函数名:manage16_1();功能:对三级菜单7(画面20)中按下一条的响应
void manage16_1(void){
    uchar key;
    while(1){
        displaypicture(17);//显示画面17---三级菜单52/选择了刘若英
        while(1){
            key=keyscan();
            if(key!=16)break;
            }
        if(key==LAST)break;//返回画面20
        else if(key==ENTER)manage17_1();//确认选择刘若英
        }
}
//函数名:manage16_2();功能:对三级菜单7(画面20)中按确认的响应
void manage16_2(void){
    uchar key;
    while(1){
        displaypicture(20);//显示画面20---四级菜单201/盛夏的果实
        while(1){
            key=keyscan();
            if(key!=16)break;  
            }
        if(key==ENTER)managetask(7);//演唱盛夏的果实
        else if(key==BACK)break;//返回上一级菜单 
        }
}
//函数名:manage17_1();功能:对三级菜单8(画面21)中按确认的响应
void manage17_1(void){
    uchar key;
    while(1){
        displaypicture(21);//显示画面21--四级菜单211//蝴蝶
        while(1){
            key=keyscan(); 
            if(key!=16)break;
            }
        if(key==ENTER)managetask(8);//演唱蝴蝶
        else if(key==BACK)break;//返回上一级菜单
        }
}
//***************************************************************************************
//以下为各歌手的演唱,为简化起见,以数码管灯亮代替奏乐,1-8号歌手的任务亮1-8
//***************************************************************************************
//函数名:managetask();入口参数:i;功能:演奏任务
void managetask(uchar i){
    uchar key;
    while(1){
        while(1){
            P0=~displaycode[i-1];
            P2_0=0;
            key=keyscan();
            if(key!=16)break;
            }
        if(key==BACK){P0=0xff;break;}//关显示
        }
}
//函数名: displaypicture();入口参数:i;功能:显示
void displaypicture(uchar i){
    LCMInit(); //LCM初始化
    Delay5Ms(); //延时片刻(可不要)
    DisplayListChar(0, 0, word[2*i]);//p+i=word[i]
    DisplayListChar(0, 1, word[2*i+1]);
    ReadDataLCM();//测试用句无意义
}
//写数据
void WriteDataLCM(uchar  WDLCM){
    ReadStatusLCM(); //检测忙
    LCM_Data = WDLCM;
    LCM_RS = 1;
    LCM_RW = 0;
    LCM_E = 0; //若晶振速度太高可以在这后加小的延时
    LCM_E = 0; //延时
    LCM_E = 1;
}
//写指令
void WriteCommandLCM(uchar  WCLCM,BuysC){ //BuysC为0时忽略忙检测
    if (BuysC) ReadStatusLCM(); //根据需要检测忙
    LCM_Data = WCLCM;
    LCM_RS = 0;
    LCM_RW = 0;
    LCM_E = 0;
    LCM_E = 0;
    LCM_E = 1;
}
//读数据
uchar ReadDataLCM(void){
    LCM_RS = 1;
    LCM_RW = 1;
    LCM_E = 0;
    LCM_E = 0;
    LCM_E = 1;
    return(LCM_Data);
}
//读状态
uchar ReadStatusLCM(void){
    LCM_Data = 0xFF;
    LCM_RS = 0;
    LCM_RW = 1;
    LCM_E = 0;
    LCM_E = 0;
    LCM_E = 1;
    while (LCM_Data & Busy); //检测忙信号
    return(LCM_Data);
}
void LCMInit(void){ //LCM初始化
    LCM_Data = 0;
    WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
    Delay5Ms();
    WriteCommandLCM(0x38,0);
    Delay5Ms();
    WriteCommandLCM(0x38,0);
    Delay5Ms();
    WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
    WriteCommandLCM(0x08,1); //关闭显示
    WriteCommandLCM(0x01,1); //显示清屏
    WriteCommandLCM(0x06,1); // 显示光标移动设置
    WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(uchar  X, uchar Y, uchar  DData){
    Y &= 0x1;
    X &= 0xF; //限制X不能大于15,Y不能大于1
    if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
    X |= 0x80; //算出指令码
    WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
    WriteDataLCM(DData);
}
//按指定位置显示一串字符
void DisplayListChar(uchar  X, uchar Y, uchar  code *DData){
    uchar ListLength;
    ListLength = 0;
    Y &= 0x1;
    X &= 0xF; //限制X不能大于15,Y不能大于1,若到达字串尾则退出
    while (X <= 0xF){ //X坐标应小于0xF
        DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
        ListLength++;
        X++;
        }
}
//5ms延时
void Delay5Ms(void){
    unsigned int TempCyc = 5552;
    while(TempCyc--);
}
//400ms延时
void Delay400Ms(void){
    uchar TempCycA = 5;
    unsigned int TempCycB;
    while(TempCycA--){
        TempCycB=7269;
        while(TempCycB--);
        };
}
//函数名:KEYSCAN;出口参数:十进制键值;功能:扫描键盘,无键或未用到键返回16
uchar keyscan(void){//反转扫描程序,返回特征码//
    uchar result;
    uchar row;
    uchar line;
    uchar keycode;
    P1=0x0f;     //高4位送0读低4位
    row=P1&0x0f;
    P1=0xf0;
    line=P1&0xf0;//低4位送0读高4位
    result=row|line;//合成特征码
    switch (result){//将特征码转换成相应字型码
        case 0x77:{keycode=0;break;}
        case 0x7b:{keycode=1;break;}
        case 0xbb:{keycode=2;break;}
        case 0xdb:{keycode=3;break;}
        case 0x7d:{keycode=ENTER;break;}
        case 0xbd:{keycode=5;break;}
        case 0xdd:{keycode=6;break;}
        case 0x7e:{keycode=CLOSE;break;}
        case 0xbe:{keycode=LAST;break;}
        case 0xde:{keycode=NEXT;break;}
        case 0xb7:{keycode=10;break;}
        case 0xd7:{keycode=11;break;}
        case 0xee:{keycode=OPEN;break;}
        case 0xed:{keycode=13;break;}
        case 0xeb:{keycode=14;break;}
        case 0xe7:{keycode=15;break;}
        case 0xc7:{keycode=16;break;}
        case 0xff:{keycode=16;break;}
        default: keycode=16;//去掉也可以。
        }
    return keycode;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -