- void keyscan() // 键盘扫描程序
- {
- P1=0xfe; //1111 1110
- if(P1!=0xfe)//p2口最低位非0 执行
- {
- if(P1!=0xfe)
- {
- temp=P1&0xf0;//保留高4位的按键值
- switch(temp)
- {
- case 0xe0:num=0;//符号列
- break;
- case 0xd0:num=1;//369列
- break;
- case 0xb0:num=2;//258列
- break;
- case 0x70:num=3;//147列
- break;
- }
- }
- while(P1!=0xfe);//下面为判断按键
- if(num==0||num==1||num==2)//如果按下的是'7','8'或'9
- {
- chuqun=chuqun+1;
- if(j!=0)
- {
- Write_LCD_Command(0x01); //清屏命令
- j=0;
- }
- if(flag==0)//没有按过符号键
- {
- a=a*10+table[num];//到table中取将要显示并参与运算a的值 a的初值为'0',结果为输入a值
- }
- else//如果按过符号键
- {
- b=b*10+table[num]; //b的初值为'0' ,结果为输入b值
- }
- }
- else//如果按下的是'/'
- {
- flag=1;//有按键按下标志
- fuhao=4;//4表示除号已按
- chuqun=0;
- }
-
- i=table1[num];//送显示
- Write_LCD_Data(0x30+i);//将数字转化为字符,对应前面的table1中的i-0x30
- delay_ms(300);
- }
- P1=0xfd;
- if(P1!=0xfd)//1111 1101 上次1111 1110 低位向高位移一位 以后类似实现行扫描
- {
- delay_ms(5);//去抖
- if(P1!=0xfd)
- {
- temp=P1&0xf0;
- switch(temp)//判断按键位置 下面是四种情况
- {
- case 0xe0:num=4;
- break;
- case 0xd0:num=5;
- break;
- case 0xb0:num=6;
- break;
- case 0x70:num=7;
- break;
- }
- }
- while(P1!=0xfd);
- if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
- {
- chuqun=chuqun+1;
- if(j!=0)
- {
- Write_LCD_Command(0x01); //清屏命令
- j=0;
- }
- if(flag==0)//没有按过符号键
- {
- a=a*10+table[num]; //输入a值
- }
- else//如果按过符号键
- {
- b=b*10+table[num]; //输入b值
- }
- }
- else//如果按下的是'*'
- {
- flag=1;
- fuhao=3;//3表示乘号已按
- chuqun=0;
- }
-
- i=table1[num];//显示 找对应的码
- Write_LCD_Data(0x30+i);
- delay_ms(300);
- }
复制代码 |