#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit ESC =P1^0;
sbit UP =P1^1;
sbit DOWN =P1^2;
sbit ENTER =P1^3;
unsigned int dispcode[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //数码管显示的值0-9,最后0xff是关显示
unsigned char dispbitcode[]={0x01,0x02,0x04,0x08};
unsigned char dispbuf[4]={0,0,0,0}; //显示的菜单数据
struct jigou{
int a;
int b;
int c;
int d;
}parameter[] = {{0,0,0,0},{1,1,1,1},{2,2,2,2},{3,3,3,3},{4,4,4,4},
{5,5,5,5},{6,6,6,6},{7,7,7,7},{8,8,8,8},{9,9,9,9}}; //各菜单下的显示参数,实际中读24C02
uchar layer; //用于表示显示的哪一级菜单
uchar sign = 0; //要显示的菜单号,一共个菜单
uint temp1;
uchar p=0;
uchar enable=0; //操作数用于闪灯
/********************************************************
函数名称:void delayus(uchar us)
功能描述: 可控微秒延时
全局变量:无
参数说明:可控延时时间
返回说明:无
设计 人 :孙占山
说明 : US=1延时5us,US加一时间加上0.2微秒
********************************************************/
void delayus(uchar us)
{
while(--us);
}
/********************************************************
函数名称:void delayms(uchar MS1)
功能描述: 可控毫秒秒延时
全局变量:无
参数说明:可控延时时间
返回说明:无
设计 人 :孙占山
说明 : 在按键程序时不能用两个形参的毫秒延时,否则会出现temp值不正确的现象
********************************************************/
void delayms(uchar MS1)
{
uchar i,j;
for(i=0;i<MS1;i++)
for(j=0;j<248;j++);
}
/********************************************************
函数名称:void ledshow(void)
功能描述: LED在进入退出零级,一级,二级菜单时显示的数据
全局变量:dispbuf,enable
参数说明:无
返回说明:layer 级
设计 人 :孙占山
说明 : 零级,一级,二级菜单时显示的数据,在二级返回一级时,不需要定义enable,只要在主程序分开一级二级的跳动
********************************************************/
void ledshow(void)
{
if(layer==0)
{
dispbuf[3]=temp1%10;
dispbuf[2]=(temp1/10)%10;
dispbuf[1]=(temp1/100)%10;
dispbuf[0]=(temp1/1000)%10;
}
if(layer==1)
{
dispbuf[3]=10;
dispbuf[2]=10;
dispbuf[1]=10;
dispbuf[0]=sign;
//if(p==0)
//{
// enable=sign;//在一级菜单时跳动(注意如果没有,那么在第二菜单退出时第一菜单的值会随第二菜单的变化
//}
//else
// enable=10;
}
if(layer==2)
{
dispbuf[3]=parameter[sign].a; //sign 菜单级 .a 菜单位
dispbuf[2]=parameter[sign].b;
dispbuf[1]=parameter[sign].c;
dispbuf[0]=parameter[sign].d;
enable=dispbuf[p];
}
}
/********************************************************
函数名称:void ledshowup(void)
功能描述: LED在进入一级,二级菜单时显示的数据的增加
全局变量:dispbuf,sign
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 一级,二级菜单时显示的数据增加,在二级菜单时用enable++,不然数字会乱跳,并且用switch语句分开abcd的值的不同
********************************************************/
void ledshowup(void)
{
if(layer==1)
{
sign++;
if(sign==10)
sign=0;
dispbuf[3]=10;
dispbuf[2]=10;
dispbuf[1]=10;
dispbuf[0]=sign;
//enable=sign; //在一级菜单时跳动
}
if(layer==2)
{
//dispbuf[p]++;
//if(dispbuf[p]==10)
//{
// dispbuf[p]=0;
//}
//enable=dispbuf[p];
enable++; //为什么不能用dispbuf[p]++??????????????
if(enable==10)
enable=0;
dispbuf[p]=enable;
switch(p) //加减完成以后要注意保存parameter[sign]的数字,否则,parameter[sign]
{ //将变回原来的数字,(就是在定义parameter[sign]时的数).
case 0:
parameter[sign].d=dispbuf[p];
break;
case 1:
parameter[sign].c=dispbuf[p];
break;
case 2:
parameter[sign].b=dispbuf[p];
break;
case 3:
parameter[sign].a=dispbuf[p];
default: break;
}
}
}
/********************************************************
函数名称:void ledshowdown(void)
功能描述: LED在进入一级,二级菜单时显示的数据的减少
全局变量:dispbuf,sign
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 一级,二级菜单时显示的数据增加,在二级菜单时用enable--,不然数字会乱跳,并且用switch语句分开abcd的值的不同
********************************************************/
void ledshowdown(void)
{
if(layer==1)
{
sign--;
if(sign==0xff)
sign=9;
dispbuf[3]=10;
dispbuf[2]=10;
dispbuf[1]=10;
dispbuf[0]=sign;
}
if(layer==2)
{
//dispbuf[p]--;
//if(dispbuf[p]==0xff)
//{
// dispbuf[p]=9;
//}
//enable=dispbuf[p];
enable--;
if(enable==0xff)
enable=9;
dispbuf[p]=enable;
switch(p) //加减完成以后要注意保存parameter[sign]的数字,否则,parameter[sign]
{ //将变回原来的数字,(就是在定义parameter[sign]时的数).
case 0:
parameter[sign].d=dispbuf[p];
break;
case 1:
parameter[sign].c=dispbuf[p];
break;
case 2:
parameter[sign].b=dispbuf[p];
break;
case 3:
parameter[sign].a=dispbuf[p];
default: break;
}
}
}
/********************************************************
函数名称:void enterkey(void)
功能描述: 菜单从1到2,2级菜单时调整可调节数字的位码
全局变量:layer
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 注意在一级菜单的结束需加上return,这样不继续执行下面的layer==2的语句,并且在layer==2时注意使用ledshow();
********************************************************/
void enterkey(void)
{
if(layer==0)
{
return;
}
if(layer==1)
{
layer=2;
ledshow();
return; //这个地方一定要加上return,不然layer=2以后就继续执行下面的p++了
}
if(layer==2)
{
p++;
if(p==4)
{
p=0;
}
ledshow();//去掉这句,移动后,所有的数字将会变为改变的那个数字
return;
}
}
/********************************************************
函数名称:void esckey(void)
功能描述: 菜单从0到1,从2到1从1到0
全局变量:layer
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 调节菜单在哪一级
********************************************************/
void esckey(void)
{
if(layer==0||layer == 2)
{
layer=1;
ledshow();
p=0;//一定要执行这一句,不然,二级菜单返回一级菜单,再进入二级菜单以后,p的值不变,这样就每次都从第一位开始
return;
}
if(layer==1)
{
layer=0;
sign=0;
ledshow();
return;
}
}
/********************************************************
函数名称:void upkey(void)
功能描述: 在菜单1,2时调用ledshowup();
全局变量:无
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 调用ledshowup()
********************************************************/
void upkey(void)
{
ledshowup();
}
/********************************************************
函数名称:void downkey(void)
功能描述: 在菜单1,2时调用ledshowdown();
全局变量:无
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 调用ledshowdown()
********************************************************/
void downkey(void)
{
ledshowdown();
}
/********************************************************
函数名称:void scankey(uchar i)
功能描述: 选择使用哪个键
全局变量:无
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 选择使用哪个键
1:enter 2:esc 3:up 4:down
********************************************************/
void scankey(uchar i)
{
switch(i)
{
case 1:
enterkey();
break;
case 2:
esckey();
break;
case 3:
upkey();
break;
case 4:
downkey();
default:
break;
}
}
/********************************************************
函数名称:void keydown(void)
功能描述: 判断哪个键按下
全局变量:无
参数说明:无
返回说明:无
设计 人 :孙占山
说明 : 判断哪个键按下
********************************************************/
void keydown(void)
{
/*1:temp作为全局变量的时候,会保持是按键按下的那个数字,这样可以看做一个键不停的按下.使得显示跳动.
比如第一级菜单和第二级菜单切换时,就在1和2菜单的数值之间跳动.2:按键只能用一个变量.*/
uchar temp=0;//使得temp=0,作为局部变量,判断完按键后,等于使得temp=0;这样就不会执行下面的程序
if(ENTER==0)
{
评论14
最新资源