第78节:多个窗口里移动光标设置参数的液晶屏菜单程序
时间:11-22
来源:互联网
点击:
- xf8; //重装初始值(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 intuiKeyTimeCnt1=0; //按键去抖动延时计数器
- static unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
- static unsigned intuiKeyTimeCnt2=0; //按键去抖动延时计数器
- static unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志
- static unsigned intuiKeyTimeCnt3=0; //按键去抖动延时计数器
- static unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志
- static unsigned intuiKeyTimeCnt4=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号键
- }
- }
- }
- void key_service(void) //按键服务的应用程序
- {
- switch(ucKeySec) //按键服务状态切换
- {
- case 1:// 加按键 对应朱兆祺学习板的S1键
- switch(ucWd)//在不同的窗口下,设置不同的参数
- {
- case 1://窗口1
- switch(ucPart)//在窗口1下,根据不同的局部变量来设置不同的参数
- {
- case 0: //无光标显示的状态 此处的case 0可以省略
- break;
- case 1: //设置第1行参数
- ucData_1_1++;
- if(ucData_1_1>99)
- {
- ucData_1_1=99;
- }
- ucWd1Part1Update=1; //1代表更新显示,响应函数内部会清零
- break;
- case 2: //设置第2行参数
- ucData_1_2++;
- if(ucData_1_2>99)
- {
- ucData_1_2=99;
- }
- ucWd1Part2Update=1; //1代表更新显示,响应函数内部会清零
- break;
- case 3:
多个窗口移动光标设置参数液晶 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)