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

📄 lcd_menu.c

📁 c8051f单片机的实例
💻 C
字号:
///////////菜单显示,键盘输入例程////////////////
///////////lcd_menu.c////////////////////////////
#include "lcd.h"
#include "stdio.h"
#define SUB_MENU_NUM 3
#define MAIN_MENU_NUM 5
code uchar mainmenu[MAIN_MENU_NUM][16] ={"target1","sub_menu_demo","get int from key","get float  key","show key data"};
code uchar submenu0[SUB_MENU_NUM][16]={"submenu1","submenu2","submenu3"};
extern bit isline0;
xdata int intnumber;
xdata float floatnumber;
void get_int_number();
void showkeydata();
void target1();
void sub_target1();
void sub_target1();
void sub_target3();
void sub_menu_demo();
void config (void) ;
void get_int_number(){//从键盘获取int型数据,并将之存入intnumber全局变量中
	showline("entry",0);//利用笔者自定义函数实现显示
	while(scankey()==2);
	intnumber=getint();//获取int型数据
	showline("number has saved",0);
	while(scankey()==2);
}
void get_float_number(){//从键盘获取float型数据,并将之存入floatnumber全局变量中
	showline("entry",0);
	while(scankey()==2);
	floatnumber=getfloat();//获取float型数据
	showline("number has saved",0);
	while(scankey()==2);
}
void showkeydata(){//显示intnumber数据
	showline("entry",0);
	while(scankey()==2);
	isline0=1;//将显示行控制到第一行
	printf("\nkey_int=%d",intnumber);//显示于第一行,利用库函数实现显示
	printf("\nfloat=%.4f",floatnumber);//显示于第二行
	delay1ms(3000);
}
void target1(){//任务1,显示浮点数,事实上是显示长整型数,并将小数点移位
	showline("entry",0);
	while(scankey()==2);
	showpage("show float",0);
	showf(intnumber,3,1);//小数点左移3位,即显示数据带3位小数
	delay1ms(3000);
}
void sub_target1(){//子任务1,调用showpage函数一次性显示两行内容
	showpage("sub_target1 start...","^_^");
	delay1ms(2000);
}
void sub_target2(){//子任务2,调用showline函数单行显示
	showline("sub_target2 start...",0);//在第一行显示内容
	showline("hello world",1);//在第二行显示内容
	delay1ms(2000);
}
void sub_target3(){//子任务3
	int t=-346;
	showline("sub_target3 start...",0);//第一行显示字符串
	showint(t,1);//第二行显示int型数据(负数)
	delay1ms(2000);
}
void sub_menu_demo(){//二级菜单
	xdata uchar submenu;
	showline("entry",0);
	while(scankey()==2);
	while(1){
		submenu=menu_sec("SUB_MENU ",submenu0,SUB_MENU_NUM);
		if(submenu==0){
				showline("entry_M1",0);
				while(scankey()==2);
				sub_target1();
				goto sub_end;
		}
		if(submenu==1){
				showline("entry_M2",0);
				while(scankey()==2);
				sub_target2();
				goto sub_end;
		}
		if(submenu==2){
				showline("entry_M3",0);
				while(scankey()==2);
				sub_target3();
				goto sub_end;
		}
	}
	sub_end:;
}
void config (void) {
//看门狗禁止
    WDTCN = 0x07;	
    WDTCN = 0xDE;   
    WDTCN = 0xAD;
    SFRPAGE = 0x0F;
    XBR0 = 0x00;	
    XBR1 = 0x00;	
    XBR2 = 0x40;	//交叉开关使能,使得P0-P3口能输出
    XBR3 = 0x00;    
    SFRPAGE = 0x0F;
    P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
    P1MDOUT = 0x00; 
    P2MDOUT = 0x00; 
    P3MDOUT = 0x00; 
    P4MDOUT = 0x00; //P4口为开漏,也可推挽
    P5MDOUT = 0x07; 
    P6MDOUT = 0x00; 
    P7MDOUT = 0x00; 
    P1MDIN = 0xFF;  //所有端口为数字输入,没有模拟输入端口
    P2MDIN = 0xFF;  
    P3MDIN = 0xFF; 
    SFRPAGE = 0x0F;
    CLKSEL = 0x00;  
    OSCXCN = 0x00;	
    OSCICN = 0x84;	
    //采用内部晶振,为24.5MHZ8分频
}   
main(){
	xdata uchar menuval;
	config();
	dispini();
	for(;;){//按左右翻页键选择菜单,按确认键进入菜单调用相应函数
		menuval=menu_sec("MAIN_MENU ",mainmenu,MAIN_MENU_NUM);//主菜单
		if(menuval==0){
			target1();
		}
		if(menuval==1){
			sub_menu_demo();//进入二级菜单
		}
		if(menuval==2){
			get_int_number();//从键盘输入数据
		}
		if(menuval==3){
			get_float_number();//从键盘输入数据
		}
		if(menuval==4){
			showkeydata();//显示键盘所输入的数据
		}
	}
}

⌨️ 快捷键说明

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