OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6980|回复: 5

关于多级菜单的显示问题

[复制链接]

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
发表于 2016-10-10 19:03:14 | 显示全部楼层 |阅读模式
由于最近在做一个用按键控制多级菜单的项目。以前稍有接触,通过自己在网上找的一些资料,以及别人提供的资料。感觉很有用处,并且操作简单,特来分享,希望能对大家有所帮助。






#include "REG52.H"

/* 注释一:
* 本程序用到的变量比较多,所以在keil编译模式里要设置一下编译模式memory model,
* 否则编译会出错.右键单击Target选择“Options for Target'Target1'”就会出来一个框
* 在memory model中选择compact:variables in pdata 就可以了。
*/

#define const_voice_short  40   //蜂鸣器短叫的持续时间

#define const_key_time1  20    //按键去抖动延时的时间
#define const_key_time2  20    //按键去抖动延时的时间
#define const_key_time3  20    //按键去抖动延时的时间
#define const_key_time4  20    //按键去抖动延时的时间


sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
sbit key_sr3=P0^2; //对应朱兆祺学习板的S9键
sbit key_sr4=P0^3; //对应朱兆祺学习板的S13键

sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平

sbit beep_dr=P2^7; //蜂鸣器的驱动IO口

sbit  LCDCS_dr  = P1^6;  //片选线
sbit  LCDSID_dr = P1^7;  //串行数据线
sbit  LCDCLK_dr = P3^2;  //串行时钟线
sbit  LCDRST_dr = P3^4;  //复位线

void SendByteToLcd(unsigned char ucData);  //发送一个字节数据到液晶模块
void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
void WriteCommand(unsigned char ucCommand); //发送一个字节的命令给液晶模块
void LCDWriteData(unsigned char ucData);   //发送一个字节的数据给液晶模块
void LCDInit(void);  //初始化  函数内部包括液晶模块的复位
void display_clear(unsigned char ucFillDate); // 清屏 全部显示空填充0x00   全部显示点阵用0xff
void insert_buffer_to_canvas(unsigned int x,unsigned int y,const unsigned char  *ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount);//把字模插入画布.
void display_lattice(unsigned int x,unsigned int y,const unsigned char  *ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount,unsigned int uiOffSetAddr); //显示任意点阵函数
unsigned char *number_to_matrix(unsigned char  ucBitNumber); //把一位数字转换成字模首地址的函数
void delay_short(unsigned int uiDelayshort); //延时
void delay_long(unsigned int uiDelayLong);

void T0_time(); //定时中断函数
void key_service(void); //按键服务的应用程序
void key_scan(void);//按键扫描函数 放在定时中断里

void initial_myself();   
void initial_peripheral();


void lcd_display_service(void); //应用层面的液晶屏显示程序
void clear_all_canvas(void);  //把画布全部清零

void wd1(void);//窗口1  主菜单
void wd2(void);//窗口2  设置时间
void wd3(void);//窗口3  设置速度
void wd4(void);//窗口4  设置频率

code unsigned char Zf816_0[]=
{
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
};

code unsigned char Zf816_1[]=
{
/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,
};

code unsigned char Zf816_2[]=
{
/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,
};

code unsigned char Zf816_3[]=
{
/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
};

code unsigned char Zf816_4[]=
{
/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,
};

code unsigned char Zf816_5[]=
{
/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,
};

code unsigned char Zf816_6[]=
{
/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,
};


code unsigned char Zf816_7[]=
{
/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
};

code unsigned char Zf816_8[]=
{
/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,
};

code unsigned char Zf816_9[]=
{
/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,
};


code unsigned char Zf816_nc[]=  //空字模
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

code unsigned char Zf816_mao_hao[]=  //冒号
{
/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,
};


code unsigned char Hz1616_zhu[]=
{
/*--  文字:  主  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x02,0x00,0x01,0x80,0x01,0x00,0x00,0x08,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x08,
0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,0x00,0x00,0x00,0x00,
};

code unsigned char Hz1616_cai[]=
{
/*--  文字:  菜  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x04,0x40,0xFF,0xFE,0x04,0x40,0x04,0x40,0x3F,0xF8,0x22,0x08,0x11,0x10,0x08,0x20,
0x01,0x00,0x7F,0xFE,0x03,0x80,0x05,0x40,0x09,0x30,0x11,0x1C,0x61,0x08,0x01,0x00,
};

code unsigned char Hz1616_dan[]=
{
/*--  文字:  单  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x20,0x06,0x30,0x04,0x40,0x3F,0xF8,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,
0x3F,0xF8,0x21,0x08,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
};

code unsigned char Hz1616_she[]=
{
/*--  文字:  设  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x00,0x21,0xF0,0x31,0x10,0x21,0x10,0x01,0x10,0x01,0x10,0xE2,0x0E,0x25,0xF8,
0x21,0x08,0x21,0x08,0x20,0x90,0x20,0x90,0x28,0x60,0x30,0x90,0x23,0x0E,0x0C,0x04,
};

code unsigned char Hz1616_zhi[]=
{
/*--  文字:  置  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x3F,0xF8,0x24,0x48,0x24,0x48,0x3F,0xF8,0x01,0x00,0x7F,0xFC,0x02,0x00,0x1F,0xF0,
0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0xFF,0xFE,
};

code unsigned char Hz1616_su[]=
{
/*--  文字:  速  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x80,0x40,0x80,0x2F,0xFC,0x20,0x80,0x00,0x80,0x07,0xF8,0xE4,0x88,0x24,0x88,
0x27,0xF8,0x21,0xA0,0x22,0x98,0x2C,0x88,0x20,0x80,0x50,0x80,0x8F,0xFE,0x00,0x00,
};

code unsigned char Hz1616_du[]=
{
/*--  文字:  度  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x2F,0xFC,0x22,0x20,0x23,0xE0,
0x20,0x00,0x27,0xF8,0x22,0x10,0x21,0x20,0x20,0xC0,0x41,0x30,0x46,0x0E,0x98,0x04,
};

code unsigned char Hz1616_shi[]=
{
/*--  文字:  时  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x10,0x00,0x10,0x7C,0x10,0x44,0x10,0x47,0xFE,0x44,0x10,0x7C,0x10,0x45,0x10,
0x44,0x90,0x44,0x90,0x7C,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x50,0x00,0x20,
};

code unsigned char Hz1616_jian[]=
{
/*--  文字:  间  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x00,0x13,0xFC,0x10,0x04,0x40,0x04,0x47,0xE4,0x44,0x24,0x44,0x24,0x47,0xE4,
0x44,0x24,0x44,0x24,0x47,0xE4,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x14,0x40,0x08,
};

code unsigned char Hz1616_pin[]=
{
/*--  文字:  频  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x00,0x08,0xFE,0x4E,0x20,0x48,0x40,0x48,0xFC,0xFE,0x84,0x00,0xA4,0x08,0xA4,
0x4A,0xA4,0x4A,0xA4,0x84,0xA4,0x08,0x50,0x10,0x48,0x20,0x86,0xC3,0x02,0x00,0x00,
};

code unsigned char Hz1616_lv[]=
{
/*--  文字:  率  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x02,0x00,0x01,0x00,0x7F,0xFE,0x41,0x00,0x22,0x28,0x17,0xD0,0x04,0x80,0x11,0x10,
0x22,0x48,0x47,0xC4,0x01,0x20,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
};

code unsigned char Hz1616_fan[]=
{
/*--  文字:  范  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x04,0x20,0x04,0x20,0xFF,0xFE,0x04,0x60,0x40,0x00,0x31,0xF8,0x91,0x08,0x61,0x08,
0x49,0x08,0x09,0x38,0x11,0x10,0xE1,0x00,0x21,0x04,0x21,0x04,0x20,0xFC,0x20,0x00,
};

code unsigned char Hz1616_wei[]=
{
/*--  文字:  围  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x7F,0xFC,0x42,0x04,0x42,0x04,0x5F,0xF4,0x42,0x04,0x4F,0xE4,0x42,0x04,0x5F,0xE4,
0x42,0x24,0x42,0x24,0x42,0x24,0x42,0xA4,0x42,0x44,0x40,0x04,0x7F,0xFC,0x40,0x04,
};

code unsigned char Hz1616_shang[]=
{
/*--  文字:  上  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xF8,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,0x00,0x00,
};

code unsigned char Hz1616_xia[]=
{
/*--  文字:  下  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x04,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xC0,0x01,0x60,0x01,0x30,
0x01,0x20,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
};

code unsigned char Hz1616_xian[]=
{
/*--  文字:  限  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFB,0xF8,0x92,0x08,0x93,0xF8,0xA2,0x08,0xA2,0x08,0x93,0xF8,0x8A,0x80,
0x8A,0x48,0xAA,0x50,0x92,0x20,0x82,0x20,0x82,0x10,0x82,0x8E,0x83,0x04,0x82,0x00,
};


unsigned char ucCanvasBuffer[]= //画布显示数组。注意,这里没有code关键字,是全局变量。初始化全部填充0x00
{
0x00,0x00,0x00,0x00,  //上半屏
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,

//------------上半屏和下半屏的分割线-----------

0x00,0x00,0x00,0x00,  //下半屏
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
};


unsigned char ucKeySec=0;   //被触发的按键编号
unsigned int  uiVoiceCnt=0;  //蜂鸣器鸣叫的持续时间计数器

unsigned char ucWd=1; //窗口变量

unsigned char ucWd1Part=1;  //窗口1的局部变量,代表选中某一行。
unsigned char ucWd1Update=1; //窗口1的整屏更新显示变量      1代表更新显示,响应函数内部会清零
unsigned char ucWd1Part1Update=0; //窗口1的第1个局部更新显示变量  1代表更新显示,响应函数内部会清零
unsigned char ucWd1Part2Update=0; //窗口1的第2个局部更新显示变量  1代表更新显示,响应函数内部会清零
unsigned char ucWd1Part3Update=0; //窗口1的第3个局部更新显示变量  1代表更新显示,响应函数内部会清零

unsigned char ucWd2Part=1;  //窗口2的局部变量,代表选中某一行。
unsigned char ucWd2Update=0; //窗口2的整屏更新显示变量      1代表更新显示,响应函数内部会清零
unsigned char ucWd2Part1Update=0; //窗口2的第1个局部更新显示变量  1代表更新显示,响应函数内部会清零
unsigned char ucWd2Part2Update=0; //窗口2的第2个局部更新显示变量  1代表更新显示,响应函数内部会清零

unsigned char ucWd3Part=1;  //窗口3的局部变量,代表选中某一行。
unsigned char ucWd3Update=0; //窗口3的整屏更新显示变量      1代表更新显示,响应函数内部会清零
unsigned char ucWd3Part1Update=0; //窗口3的第1个局部更新显示变量  1代表更新显示,响应函数内部会清零
unsigned char ucWd3Part2Update=0; //窗口3的第2个局部更新显示变量  1代表更新显示,响应函数内部会清零

unsigned char ucWd4Part=1;  //窗口4的局部变量,代表选中某一行。
unsigned char ucWd4Update=0; //窗口4的整屏更新显示变量      1代表更新显示,响应函数内部会清零
unsigned char ucWd4Part1Update=0; //窗口4的第1个局部更新显示变量  1代表更新显示,响应函数内部会清零
unsigned char ucWd4Part2Update=0; //窗口4的第2个局部更新显示变量  1代表更新显示,响应函数内部会清零


unsigned char ucTimeH=2;  //设置时间的上限数据
unsigned char ucTimeL=1;  //设置时间的下限数据

unsigned char ucSpeedH=4;  //设置速度的上限数据
unsigned char ucSpeedL=3;  //设置速度的下限数据

unsigned char ucFreqH=6;  //设置频率的上限数据
unsigned char ucFreqL=5;  //设置频率的下限数据

void main()
  {
        initial_myself();      //第一区,上电后马上初始化
        delay_long(100);       //一线,延时线。延时一段时间
        initial_peripheral();  //第二区,上电后延时一段时间再初始化

        while(1)   //第三区
        {
                    key_service(); //按键服务的应用程序
            lcd_display_service(); //应用层面的液晶屏显示程序
        }

}


void initial_myself()  //第一区 上电后马上初始化
{
/* 注释二:
* 矩阵键盘也可以做独立按键,前提是把某一根公共输出线输出低电平,
* 模拟独立按键的触发地,本程序中,把key_gnd_dr输出低电平。
* 坚鸿51学习板的S1和S5两个按键就是本程序中用到的两个独立按键。
*/
   key_gnd_dr=0; //模拟独立按键的地GND,因此必须一直输出低电平
   beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。

   TMOD=0x01;  //设置定时器0为工作方式1

   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
   TL0=0x2f;
}
void initial_peripheral() //第二区 上电后延时一段时间再初始化
{
    LCDInit(); //初始化12864 内部包含液晶模块的复位


    EA=1;     //开总中断
    ET0=1;    //允许定时中断
    TR0=1;    //启动定时中断

}


void T0_time() interrupt 1
{
  TF0=0;  //清除中断标志
  TR0=0; //关中断

  key_scan(); //按键扫描函数

  if(uiVoiceCnt!=0)
  {
     uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
         beep_dr=0;  //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  }
  else
  {
     ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
           beep_dr=1;  //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  }


  TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
  TL0=0x2f;
  TR0=1;  //开中断
}



void key_scan(void)//按键扫描函数 放在定时中断里
{  


  static unsigned int  uiKeyTimeCnt1=0; //按键去抖动延时计数器
  static unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志

  static unsigned int  uiKeyTimeCnt2=0; //按键去抖动延时计数器
  static unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志

  static unsigned int  uiKeyTimeCnt3=0; //按键去抖动延时计数器
  static unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志

  static unsigned int  uiKeyTimeCnt4=0; //按键去抖动延时计数器
  static unsigned char ucKeyLock4=0; //按键触发后自锁的变量标志

  if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock1=0; //按键自锁标志清零
     uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
  }
  else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
  {
     uiKeyTimeCnt1++; //累加定时中断次数
     if(uiKeyTimeCnt1>const_key_time1)
     {
        uiKeyTimeCnt1=0;
        ucKeyLock1=1;  //自锁按键置位,避免一直触发
        ucKeySec=1;    //触发1号键
     }
  }

  if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock2=0; //按键自锁标志清零
     uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
  }
  else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
  {
     uiKeyTimeCnt2++; //累加定时中断次数
     if(uiKeyTimeCnt2>const_key_time2)
     {
        uiKeyTimeCnt2=0;
        ucKeyLock2=1;  //自锁按键置位,避免一直触发
        ucKeySec=2;    //触发2号键
     }
  }

  if(key_sr3==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock3=0; //按键自锁标志清零
     uiKeyTimeCnt3=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
  }
  else if(ucKeyLock3==0)//有按键按下,且是第一次被按下
  {
     uiKeyTimeCnt3++; //累加定时中断次数
     if(uiKeyTimeCnt3>const_key_time3)
     {
        uiKeyTimeCnt3=0;
        ucKeyLock3=1;  //自锁按键置位,避免一直触发
        ucKeySec=3;    //触发3号键
     }
  }

  if(key_sr4==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock4=0; //按键自锁标志清零
     uiKeyTimeCnt4=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。      
  }
  else if(ucKeyLock4==0)//有按键按下,且是第一次被按下
  {
     uiKeyTimeCnt4++; //累加定时中断次数
     if(uiKeyTimeCnt4>const_key_time4)
     {
        uiKeyTimeCnt4=0;
        ucKeyLock4=1;  //自锁按键置位,避免一直触发
        ucKeySec=4;    //触发4号键
     }
  }

}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
 楼主| 发表于 2016-10-10 19:08:05 | 显示全部楼层

unsigned char *number_to_matrix(unsigned char  ucBitNumber)
{
    unsigned char *p_ucAnyNumber;  //此指针根据ucBitNumber数值的大小,分别调用不同的字库。

        switch(ucBitNumber)  //根据ucBitNumber数值的大小,分别调用不同的字库。
        {
            case 0:
             p_ucAnyNumber=Zf816_0;
                     break;
            case 1:
             p_ucAnyNumber=Zf816_1;
                     break;
            case 2:
             p_ucAnyNumber=Zf816_2;
                     break;
            case 3:
             p_ucAnyNumber=Zf816_3;
                     break;
            case 4:
             p_ucAnyNumber=Zf816_4;
                     break;
            case 5:
             p_ucAnyNumber=Zf816_5;
                     break;
            case 6:
             p_ucAnyNumber=Zf816_6;
                     break;
            case 7:
             p_ucAnyNumber=Zf816_7;
                     break;
            case 8:
             p_ucAnyNumber=Zf816_8;
                     break;
            case 9:
             p_ucAnyNumber=Zf816_9;
                     break;
            case 10:
             p_ucAnyNumber=Zf816_nc;
                     break;
                default:   //如果上面的条件都不符合,那么默认指向空字模
             p_ucAnyNumber=Zf816_nc;
                     break;
        }

    return p_ucAnyNumber;  //返回转换结束后的指针
}



void lcd_display_service(void) //应用层面的液晶屏显示程序
{

    switch(ucWd)  //本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
    {
        case 1:  
              wd1();  //主菜单
              break;
        case 2:  
              wd2();  //设置时间
              break;
        case 3:  
              wd3();  //设置速度
              break;
        case 4:  
              wd4();  //设置频率
              break;

        //本程序只有4个窗口,所以只有4个case ,如果要增加窗口,就直接增加 case 5, case 6...        
    }

}


void wd1(void)  //窗口1  主菜单
{

    unsigned char ucCursorFlag;  //光标标志,也就是反显的标志,它是根据局部变量ucPart来定的

/* 注释三:
* 把每一个窗口的内容分为两种类型,一种类型是那些不用经常刷新显示的内容,只有在切换窗口的时候
* 才需要更新,这种内容放在整屏更新显示的括号里,比如清屏操作等内容。另外一种是那些经常需要
* 刷新显示的内容,这种内容放在局部更新显示的括号里。
*/
    if(ucWd1Update==1)  //窗口1整屏更新,里面只放那些不用经常刷新显示的内容
    {
        ucWd1Update=0;  //及时清零,避免一直更新

        ucWd1Part1Update=1; //激活窗口1的第1个局部更新显示变量
        ucWd1Part2Update=1; //激活窗口1的第2个局部更新显示变量
        ucWd1Part3Update=1; //激活窗口1的第3个局部更新显示变量


        display_clear(0x00); // 清屏操作, 全部显示空填充0x00,全部显示点阵用0xff。
        clear_all_canvas();  //把画布全部清零
        insert_buffer_to_canvas(0,0,Zf816_mao_hao,0,1,16);//把冒号的字模插入画布

        display_lattice(2,0,Hz1616_zhu,0,2,16,0);    //主菜单。这些内容不用经常更新,只有在切换窗口的时候才更新显示
        display_lattice(3,0,Hz1616_cai,0,2,16,0);
        display_lattice(4,0,Hz1616_dan,0,2,16,0);


    }

/* 注释四:
* 注意!我前面讲数码管显示的时候有一句话讲错了,我那时说<局部更新应该写在整屏更新之前>,这是不对的。
* 按照现在的显示程序框架<即整屏显示更新括号里包含了所有局部变量的激活>,应该是<整屏更新应该写在局部更新之前>
* 这样才对。
*/
    if(ucWd1Part1Update==1) //窗口1的第1个局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
        ucWd1Part1Update=0; //及时清零,避免一直更新

        if(ucWd1Part==1) //被选中
        {
             ucCursorFlag=1; //反显 显示
        }
        else //没被选中
        {
             ucCursorFlag=0; //正常 显示
        }

                display_lattice(0,16,Hz1616_she,ucCursorFlag,2,16,0);    //设置时间范围
        display_lattice(1,16,Hz1616_zhi,ucCursorFlag,2,16,0);   
        display_lattice(2,16,Hz1616_shi,ucCursorFlag,2,16,0);   
        display_lattice(3,16,Hz1616_jian,ucCursorFlag,2,16,0);
        display_lattice(4,16,Hz1616_fan,ucCursorFlag,2,16,0);   
        display_lattice(5,16,Hz1616_wei,ucCursorFlag,2,16,0);


                          
    }

    if(ucWd1Part2Update==1) //窗口1的第2个局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
         ucWd1Part2Update=0; //及时清零,避免一直更新

         if(ucWd1Part==2) //被选中
         {
             ucCursorFlag=1; //反显 显示
         }
         else //没被选中
         {
             ucCursorFlag=0; //正常 显示
         }

         display_lattice(8,0,Hz1616_she,ucCursorFlag,2,16,0);      //设置速度范围
         display_lattice(9,0,Hz1616_zhi,ucCursorFlag,2,16,0);   
         display_lattice(10,0,Hz1616_su,ucCursorFlag,2,16,0);   
         display_lattice(11,0,Hz1616_du,ucCursorFlag,2,16,0);
         display_lattice(12,0,Hz1616_fan,ucCursorFlag,2,16,0);   
         display_lattice(13,0,Hz1616_wei,ucCursorFlag,2,16,0);
                          
     }

     if(ucWd1Part3Update==1) //窗口1的第3行局部更新显示变量,里面放一些经常需要刷新显示的内容
     {
         ucWd1Part3Update=0; //及时清零,避免一直更新

         if(ucWd1Part==3) //被选中
         {
             ucCursorFlag=1; //反显 显示
         }
         else //没被选中
         {
             ucCursorFlag=0; //正常 显示
         }

         display_lattice(8,16,Hz1616_she,ucCursorFlag,2,16,0);    //设置频率范围
         display_lattice(9,16,Hz1616_zhi,ucCursorFlag,2,16,0);   
         display_lattice(10,16,Hz1616_pin,ucCursorFlag,2,16,0);   
         display_lattice(11,16,Hz1616_lv,ucCursorFlag,2,16,0);
         display_lattice(12,16,Hz1616_fan,ucCursorFlag,2,16,0);   
         display_lattice(13,16,Hz1616_wei,ucCursorFlag,2,16,0);                           
     }

  
}


void wd2(void)  //窗口2 设置时间
{
    unsigned char ucAnyNumber_1; //分解变量的个位
    unsigned char ucAnyNumber_10; //分解变量的十位


    unsigned char *p_ucAnyNumber_1; //经过数字转换成字模后,分解变量的个位字模首地址
    unsigned char *p_ucAnyNumber_10; //经过数字转换成字模后,分解变量的十位字模首地址

    unsigned char ucCursorFlag;  //光标标志,也就是反显的标志,它是根据局部变量ucPart来定的

    if(ucWd2Update==1)  //窗口2整屏更新,里面只放那些不用经常刷新显示的内容
    {
        ucWd2Update=0;  //及时清零,避免一直更新

        ucWd2Part1Update=1; //激活窗口2的第1个局部更新显示变量,这里在前面数码管显示框架上有所改进
        ucWd2Part2Update=1; //激活窗口2的第2个局部更新显示变量,这里在前面数码管显示框架上有所改进

        display_clear(0x00); // 清屏操作, 全部显示空填充0x00,全部显示点阵用0xff。
        clear_all_canvas();  //把画布全部清零
        insert_buffer_to_canvas(0,0,Zf816_mao_hao,0,1,16);//把冒号的字模插入画布


        display_lattice(2,0,Hz1616_she,0,2,16,0);    //设置时间。这些内容不用经常更新,只有在切换窗口的时候才更新显示
        display_lattice(3,0,Hz1616_zhi,0,2,16,0);
        display_lattice(4,0,Hz1616_shi,0,2,16,0);
        display_lattice(5,0,Hz1616_jian,0,2,16,0);


                display_lattice(0,16,Hz1616_shi,0,2,16,0);    //时间上限
        display_lattice(1,16,Hz1616_jian,0,2,16,0);   
        display_lattice(2,16,Hz1616_shang,0,2,16,0);   
        display_lattice(3,16,Hz1616_xian,0,2,16,0);

        display_lattice(8,0,Hz1616_shi,0,2,16,0);  //时间下限
        display_lattice(9,0,Hz1616_jian,0,2,16,0);   
        display_lattice(10,0,Hz1616_xia,0,2,16,0);   
        display_lattice(11,0,Hz1616_xian,0,2,16,0);

    }

    if(ucWd2Part1Update==1) //窗口2的第1个局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
        ucWd2Part1Update=0; //及时清零,避免一直更新

        if(ucWd2Part==1) //被选中
        {
             ucCursorFlag=1; //反显 显示
        }
        else //没被选中
        {
             ucCursorFlag=0; //正常 显示
        }

        if(ucTimeH>=10) //有2位数以上
        {
             ucAnyNumber_10=ucTimeH/10;  //十位
        }
        else //否则显示空
        {
             ucAnyNumber_10=10;  //在下面的转换函数中,代码10表示空字模
        }

        ucAnyNumber_1=ucTimeH%10/1;  //个位

   
        p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把数字转换成字模首地址
        p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把数字转换成字模首地址


        insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入画布
        insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把个的字模插入画布

        display_lattice(4,16,ucCanvasBuffer,0,4,16,0);   //显示整屏的画布,最后的参数0是偏移量

                          
    }

    if(ucWd2Part2Update==1) //窗口2的第2行局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
         ucWd2Part2Update=0; //及时清零,避免一直更新

         if(ucWd2Part==2) //被选中
         {
             ucCursorFlag=1; //反显 显示
         }
         else //没被选中
         {
             ucCursorFlag=0; //正常 显示
         }

         if(ucTimeL>=10) //有2位数以上
         {
             ucAnyNumber_10=ucTimeL/10;  //十位
         }
         else //否则显示空
         {
             ucAnyNumber_10=10;  //在下面的转换函数中,代码10表示空字模
         }

         ucAnyNumber_1=ucTimeL%10/1;  //个位

   
         p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把数字转换成字模首地址
         p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把数字转换成字模首地址


         insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入画布
         insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把个的字模插入画布

         display_lattice(12,0,ucCanvasBuffer,0,4,16,0);   //显示整屏的画布,最后的参数0是偏移量
                          
     }

   
}



void wd3(void)  //窗口3 设置速度
{
    unsigned char ucAnyNumber_1; //分解变量的个位
    unsigned char ucAnyNumber_10; //分解变量的十位


    unsigned char *p_ucAnyNumber_1; //经过数字转换成字模后,分解变量的个位字模首地址
    unsigned char *p_ucAnyNumber_10; //经过数字转换成字模后,分解变量的十位字模首地址

    unsigned char ucCursorFlag;  //光标标志,也就是反显的标志,它是根据局部变量ucPart来定的

    if(ucWd3Update==1)  //窗口3整屏更新,里面只放那些不用经常刷新显示的内容
    {
        ucWd3Update=0;  //及时清零,避免一直更新

        ucWd3Part1Update=1; //激活窗口3的第1个局部更新显示变量,这里在前面数码管显示框架上有所改进
        ucWd3Part2Update=1; //激活窗口3的第2个局部更新显示变量,这里在前面数码管显示框架上有所改进

        display_clear(0x00); // 清屏操作, 全部显示空填充0x00,全部显示点阵用0xff。
        clear_all_canvas();  //把画布全部清零
        insert_buffer_to_canvas(0,0,Zf816_mao_hao,0,1,16);//把冒号的字模插入画布


        display_lattice(2,0,Hz1616_she,0,2,16,0);    //设置速度。这些内容不用经常更新,只有在切换窗口的时候才更新显示
        display_lattice(3,0,Hz1616_zhi,0,2,16,0);
        display_lattice(4,0,Hz1616_su,0,2,16,0);
        display_lattice(5,0,Hz1616_du,0,2,16,0);


                display_lattice(0,16,Hz1616_su,0,2,16,0);    //速度上限
        display_lattice(1,16,Hz1616_du,0,2,16,0);   
        display_lattice(2,16,Hz1616_shang,0,2,16,0);   
        display_lattice(3,16,Hz1616_xian,0,2,16,0);

        display_lattice(8,0,Hz1616_su,0,2,16,0);  //速度下限
        display_lattice(9,0,Hz1616_du,0,2,16,0);   
        display_lattice(10,0,Hz1616_xia,0,2,16,0);   
        display_lattice(11,0,Hz1616_xian,0,2,16,0);

    }

    if(ucWd3Part1Update==1) //窗口3的第1个局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
        ucWd3Part1Update=0; //及时清零,避免一直更新

        if(ucWd3Part==1) //被选中
        {
             ucCursorFlag=1; //反显 显示
        }
        else //没被选中
        {
             ucCursorFlag=0; //正常 显示
        }

        if(ucSpeedH>=10) //有2位数以上
        {
             ucAnyNumber_10=ucSpeedH/10;  //十位
        }
        else //否则显示空
        {
             ucAnyNumber_10=10;  //在下面的转换函数中,代码10表示空字模
        }

        ucAnyNumber_1=ucSpeedH%10/1;  //个位

   
        p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把数字转换成字模首地址
        p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把数字转换成字模首地址


        insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入画布
        insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把个的字模插入画布

        display_lattice(4,16,ucCanvasBuffer,0,4,16,0);   //显示整屏的画布,最后的参数0是偏移量

                          
    }

    if(ucWd3Part2Update==1) //窗口3的第2行局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
         ucWd3Part2Update=0; //及时清零,避免一直更新

         if(ucWd3Part==2) //被选中
         {
             ucCursorFlag=1; //反显 显示
         }
         else //没被选中
         {
             ucCursorFlag=0; //正常 显示
         }

         if(ucSpeedL>=10) //有2位数以上
         {
             ucAnyNumber_10=ucSpeedL/10;  //十位
         }
         else //否则显示空
         {
             ucAnyNumber_10=10;  //在下面的转换函数中,代码10表示空字模
         }

         ucAnyNumber_1=ucSpeedL%10/1;  //个位

   
         p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把数字转换成字模首地址
         p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把数字转换成字模首地址


         insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入画布
         insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把个的字模插入画布

         display_lattice(12,0,ucCanvasBuffer,0,4,16,0);   //显示整屏的画布,最后的参数0是偏移量
                          
     }

   
}



void wd4(void)  //窗口4 设置频率
{
    unsigned char ucAnyNumber_1; //分解变量的个位
    unsigned char ucAnyNumber_10; //分解变量的十位


    unsigned char *p_ucAnyNumber_1; //经过数字转换成字模后,分解变量的个位字模首地址
    unsigned char *p_ucAnyNumber_10; //经过数字转换成字模后,分解变量的十位字模首地址

    unsigned char ucCursorFlag;  //光标标志,也就是反显的标志,它是根据局部变量ucPart来定的

    if(ucWd4Update==1)  //窗口4整屏更新,里面只放那些不用经常刷新显示的内容
    {
        ucWd4Update=0;  //及时清零,避免一直更新

        ucWd4Part1Update=1; //激活窗口4的第1个局部更新显示变量,这里在前面数码管显示框架上有所改进
        ucWd4Part2Update=1; //激活窗口4的第2个局部更新显示变量,这里在前面数码管显示框架上有所改进

        display_clear(0x00); // 清屏操作, 全部显示空填充0x00,全部显示点阵用0xff。
        clear_all_canvas();  //把画布全部清零
        insert_buffer_to_canvas(0,0,Zf816_mao_hao,0,1,16);//把冒号的字模插入画布


        display_lattice(2,0,Hz1616_she,0,2,16,0);    //设置频率。这些内容不用经常更新,只有在切换窗口的时候才更新显示
        display_lattice(3,0,Hz1616_zhi,0,2,16,0);
        display_lattice(4,0,Hz1616_pin,0,2,16,0);
        display_lattice(5,0,Hz1616_lv,0,2,16,0);


                display_lattice(0,16,Hz1616_pin,0,2,16,0);    //频率上限
        display_lattice(1,16,Hz1616_lv,0,2,16,0);   
        display_lattice(2,16,Hz1616_shang,0,2,16,0);   
        display_lattice(3,16,Hz1616_xian,0,2,16,0);

        display_lattice(8,0,Hz1616_pin,0,2,16,0);  //频率下限
        display_lattice(9,0,Hz1616_lv,0,2,16,0);   
        display_lattice(10,0,Hz1616_xia,0,2,16,0);   
        display_lattice(11,0,Hz1616_xian,0,2,16,0);

    }

    if(ucWd4Part1Update==1) //窗口4的第1个局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
        ucWd4Part1Update=0; //及时清零,避免一直更新

        if(ucWd4Part==1) //被选中
        {
             ucCursorFlag=1; //反显 显示
        }
        else //没被选中
        {
             ucCursorFlag=0; //正常 显示
        }

        if(ucFreqH>=10) //有2位数以上
        {
             ucAnyNumber_10=ucFreqH/10;  //十位
        }
        else //否则显示空
        {
             ucAnyNumber_10=10;  //在下面的转换函数中,代码10表示空字模
        }

        ucAnyNumber_1=ucFreqH%10/1;  //个位

   
        p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把数字转换成字模首地址
        p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把数字转换成字模首地址


        insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入画布
        insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把个的字模插入画布

        display_lattice(4,16,ucCanvasBuffer,0,4,16,0);   //显示整屏的画布,最后的参数0是偏移量

                          
    }

    if(ucWd4Part2Update==1) //窗口4的第2行局部更新显示变量,里面放一些经常需要刷新显示的内容
    {
         ucWd4Part2Update=0; //及时清零,避免一直更新

         if(ucWd4Part==2) //被选中
         {
             ucCursorFlag=1; //反显 显示
         }
         else //没被选中
         {
             ucCursorFlag=0; //正常 显示
         }

         if(ucFreqL>=10) //有2位数以上
         {
             ucAnyNumber_10=ucFreqL/10;  //十位
         }
         else //否则显示空
         {
             ucAnyNumber_10=10;  //在下面的转换函数中,代码10表示空字模
         }

         ucAnyNumber_1=ucFreqL%10/1;  //个位

   
         p_ucAnyNumber_10=number_to_matrix(ucAnyNumber_10); //把数字转换成字模首地址
         p_ucAnyNumber_1=number_to_matrix(ucAnyNumber_1); //把数字转换成字模首地址


         insert_buffer_to_canvas(2,0,p_ucAnyNumber_10,ucCursorFlag,1,16);//把十的字模插入画布
         insert_buffer_to_canvas(3,0,p_ucAnyNumber_1,ucCursorFlag,1,16);//把个的字模插入画布

         display_lattice(12,0,ucCanvasBuffer,0,4,16,0);   //显示整屏的画布,最后的参数0是偏移量
                          
     }

   
}
回复 支持 0 反对 1

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
 楼主| 发表于 2016-10-10 19:03:41 | 显示全部楼层
本帖最后由 muk子夜 于 2016-10-10 19:10 编辑

void key_service(void)
回复 支持 反对

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
 楼主| 发表于 2016-10-10 19:03:57 | 显示全部楼层
本帖最后由 muk子夜 于 2016-10-10 19:11 编辑

void key_service(void) //按键服务的应用程序




回复 支持 反对

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
 楼主| 发表于 2016-10-10 19:05:32 | 显示全部楼层
void key_service(void) //按键服务的应用程序
{
  switch(ucKeySec) //按键服务状态切换
  {
    case 1:// 加按键 对应朱兆祺学习板的S1键
          switch(ucWd)  //在不同的窗口下,设置不同的参数
          {
              case 2:  //窗口2  设置时间
                   switch(ucWd2Part)  //在窗口2下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //设置时间上限
                                ucTimeH++;
                                if(ucTimeH>99)
                                {
                                   ucTimeH=99;
                                }
                                ucWd2Part1Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                          case 2:   //设置时间下限
                                ucTimeL++;
                                if(ucTimeL>99)
                                {
                                   ucTimeL=99;
                                }
                                ucWd2Part2Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                        
                   }
                   break;         
              case 3:  //窗口3  设置速度
                   switch(ucWd3Part)  //在窗口3下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //设置速度上限
                                ucSpeedH++;
                                if(ucSpeedH>99)
                                {
                                   ucSpeedH=99;
                                }
                                ucWd3Part1Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                          case 2:   //设置速度下限
                                ucSpeedL++;
                                if(ucSpeedL>99)
                                {
                                   ucSpeedL=99;
                                }
                                ucWd3Part2Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                        
                   }
                   break;     
              case 4:  //窗口4  设置速度
                   switch(ucWd4Part)  //在窗口4下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //设置频率上限
                                ucFreqH++;
                                if(ucFreqH>99)
                                {
                                   ucFreqH=99;
                                }
                                ucWd4Part1Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                          case 2:   //设置频率下限
                                ucFreqL++;
                                if(ucFreqL>99)
                                {
                                   ucFreqL=99;
                                }
                                ucWd4Part2Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                        
                   }
                   break;     
          }     
          uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
          ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发
          break;   
   
    case 2:// 减按键 对应朱兆祺学习板的S5键
          switch(ucWd)  //在不同的窗口下,设置不同的参数
          {         
              case 2:  //窗口2 设置时间
                   switch(ucWd2Part)  //在窗口2下,根据不同的局部变量来设置不同的参数
                   {
                          case 1:   //设置时间上限
                                ucTimeH--;
                                if(ucTimeH>99) //一直减到最后,单片机C语言编译器有一个特征,0减去1会溢出变成255(0xff)
                                {
                                   ucTimeH=0;
                                }
                                ucWd2Part1Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                          case 2:   //设置时间下限
                                ucTimeL--;
                                if(ucTimeL>99) //一直减到最后,单片机C语言编译器有一个特征,0减去1会溢出变成255(0xff)
                                {
                                   ucTimeL=0;
                                }
                                ucWd2Part2Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                   }
                   break;         
              case 3:  //窗口3  设置速度
                   switch(ucWd3Part)  //在窗口3下,根据不同的局部变量来设置不同的参数
                   {
                          case 1:   //设置速度上限
                                ucSpeedH--;
                                if(ucSpeedH>99) //一直减到最后,单片机C语言编译器有一个特征,0减去1会溢出变成255(0xff)
                                {
                                   ucSpeedH=0;
                                }
                                ucWd3Part1Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                          case 2:   //设置速度下限
                                ucSpeedL--;
                                if(ucSpeedL>99) //一直减到最后,单片机C语言编译器有一个特征,0减去1会溢出变成255(0xff)
                                {
                                   ucSpeedL=0;
                                }
                                ucWd3Part2Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                   }
                   break;      
              case 4:  //窗口4  设置频率
                   switch(ucWd4Part)  //在窗口4下,根据不同的局部变量来设置不同的参数
                   {
                          case 1:   //设置频率上限
                                ucFreqH--;
                                if(ucFreqH>99) //一直减到最后,单片机C语言编译器有一个特征,0减去1会溢出变成255(0xff)
                                {
                                   ucFreqH=0;
                                }
                                ucWd4Part1Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                          case 2:   //设置频率下限
                                ucFreqL--;
                                if(ucFreqL>99) //一直减到最后,单片机C语言编译器有一个特征,0减去1会溢出变成255(0xff)
                                {
                                   ucFreqL=0;
                                }
                                ucWd4Part2Update=1; //1代表更新显示,响应函数内部会清零
                                break;
                   }
                   break;   
          }     
          uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
          ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发
          break;  

    case 3:// 切换"光标"移动按键 对应朱兆祺学习板的S9键
          switch(ucWd)  //在不同的窗口下,设置不同的参数
          {
              case 1: //窗口1 主菜单
                   switch(ucWd1Part)  //在窗口1下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //设置时间
                                ucWd1Part=2; //光标切换到下一行
                                ucWd1Part1Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd1Part2Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;
                          case 2:   //设置速度
                                ucWd1Part=3; //光标切换到下一行
                                ucWd1Part2Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd1Part3Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;
                          case 3:   //设置第3行参数
                                ucWd1Part=1; //光标返回到第一行
                                ucWd1Part3Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd1Part1Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;


                   }
                   break;
              case 2: //窗口2 设置时间
                   switch(ucWd2Part)  //在窗口2下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //时间上限
                                ucWd2Part=2; //光标切换到下一行
                                ucWd2Part1Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd2Part2Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;
                          case 2:   //时间下限
                                ucWd2Part=1; //光标返回到第一行
                                ucWd2Part2Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd2Part1Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;

                   }
                   break;      
              case 3: //窗口3 设置速度
                   switch(ucWd3Part)  //在窗口3下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //速度上限
                                ucWd3Part=2; //光标切换到下一行
                                ucWd3Part1Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd3Part2Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;
                          case 2:   //速度下限
                                ucWd3Part=1; //光标返回到第一行
                                ucWd3Part2Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd3Part1Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;

                   }
                   break;      
              case 4: //窗口4 设置频率
                   switch(ucWd4Part)  //在窗口4下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //频率上限
                                ucWd4Part=2; //光标切换到下一行
                                ucWd4Part1Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd4Part2Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;
                          case 2:   //频率下限
                                ucWd4Part=1; //光标返回到第一行
                                ucWd4Part2Update=1; //更新显示原来那一行,目的是更新反显光标的状态
                                ucWd4Part1Update=1; //更新显示下一行,    目的是更新反显光标的状态
                                break;

                   }
                   break;     
          }         
        
          uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
          ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发
          break;      
   
    case 4: // 进入和退出按键  对应朱兆祺学习板的S13键,按一次进入选中的子菜单。再按一次退出子菜单。
          switch(ucWd)  //在不同的窗口下,设置不同的参数
          {
              case 1:  //窗口1                              
                   switch(ucWd1Part)  //在窗口1下,根据不同的局部变量来设置不同的参数
                   {

                          case 1:   //设置时间
                                                        ucWd=2; //进入设置时间的窗口2
                                                                ucWd2Update=1; //窗口2整屏更新
                                break;
                          case 2:   //设置速度
                                                        ucWd=3; //进入设置速度的窗口3
                                                                ucWd3Update=1; //窗口3整屏更新
                                break;
                          case 3:   //设置频率
                                                        ucWd=4; //进入设置频率的窗口4
                                                                ucWd4Update=1; //窗口4整屏更新
                                break;


                   }
                   break;
              case 2:  //窗口2
                                   ucWd=1;        //返回主菜单窗口1
                                   ucWd1Update=1; //窗口1整屏更新
                   break;      
              case 3:  //窗口3
                                   ucWd=1;        //返回主菜单窗口1
                                   ucWd1Update=1; //窗口1整屏更新
                   break;   
               case 4:  //窗口4
                                   ucWd=1;        //返回主菜单窗口1
                                   ucWd1Update=1; //窗口1整屏更新
                   break;   

          }   

          uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
          ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一致触发
          break;         

  }               
}
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2016-7-10
在线时间
29 小时
发表于 2017-5-2 16:28:19 | 显示全部楼层
楼主,能将源码发一份给我吗qq1241512369
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 22:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表