第83节:矩阵键盘输入任意数字或小数点的液晶屏显示程序
时间:11-22
来源:互联网
点击:
- 节的横向是4个字节,这节的横向是6个字节。
- */
- unsigned char ucCanvasBuffer[]=
- {
- 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,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,
- };
- /* 注释二:
- * 以下4个变量记录一个参数的4种信息,包括小数点的数量,个数,数据的位置,数组具体值.
- */
- unsigned char ucDotCnt_1=0;//记录当前输入的小数点数量,如果小数点的数量不为0,说明当前数组已包含小数点,此时再按小数点按键则无效
- unsigned char ucDotBitS_1=0; //记录当前输入的小数点个数,如果小数点的个量如果超过规定2位,此时再按任何输入按键则无效
- unsigned char ucWdPartCnt_1=0; //记录当前输入的数据在数组中的位置。
- unsigned char ucDataBuffer_1[6]={0,10,10,10,10,10}; //一项的BCD码数组缓冲
- unsigned char ucKeyStep=1;//按键扫描步骤变量
- unsigned char ucKeySec=0; //被触发的按键编号
- unsigned intuiKeyTimeCnt=0; //按键去抖动延时计数器
- unsigned char ucKeyLock=0; //按键触发后自锁的变量标志
- unsigned char ucRowRecord=1; //记录当前扫描到第几列了
- unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
- unsigned char ucWd=1; //窗口变量
- unsigned char ucPart=1; //局部变量 0代表没有选中任何一行,其它数值1到4代表选中某一行
- unsigned char ucWd1Update=1; //窗口1的整屏更新显示变量 1代表更新显示,响应函数内部会清零
- unsigned char ucWd1Part1Update=0; //窗口1的第1行局部更新显示变量1代表更新显示,响应函数内部会清零
- void main()
- {
- initial_myself(); //第一区,上电后马上初始化
- delay_long(100); //一线,延时线。延时一段时间
- initial_peripheral();//第二区,上电后延时一段时间再初始化
- while(1) //第三区
- {
- key_service(); //按键服务程序
- lcd_display_service(); //应用层面的液晶屏显示程序
- }
- }
- void initial_myself()//第一区 上电后马上初始化
- {
- 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()//按键扫描函数 放在定时中断里
- {
- switch(ucKeyStep)
- {
- case 1: //按键扫描输出第ucRowRecord列低电平
- if(ucRowRecord==1)//第一列输出低电平
- {
- key_dr1=0;
- key_dr2=1;
- key_dr3=1;
- key_dr4=1;
- }
- else if(ucRowRecord==2)//第二列输出低电平
- {
- key_dr1=1;
- key_dr2=0;
- key_dr3=1;
- key_dr4=1;
- }
- else if(ucRowRecord==3)//第三列输出低电平
- {
- key_dr1=1;
- key_dr2=1;
- key_dr3=0;
- key_dr4=1;
- }
- else //第四列输出低电平
- {
- key_dr1=1;
- key_dr2=1;
- key_dr3=1;
- key_dr4=0;
- }
- uiKeyTimeCnt=0;//延时计数器清零
- ucKeyStep++; //切换到下一个运行步骤
- break;
- case 2: //此处的小延时用来等待刚才列输出信号稳定,再判断输入信号。不是去抖动延时。
- uiKeyTimeCnt++;
- if(uiKeyTimeCnt>1)
矩阵键盘输入任意数字液晶屏显示程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)