📄 1602cd.c
字号:
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 + -