飞思卡尔矩阵键盘问题
时间:10-02
整理:3721RD
点击:
我的飞思卡尔xs128单片机建工程的时候用了浮点数类型,编了一个矩阵键盘的程序。程序能编译没出错但是却按下键盘,在数据口上没有发现键值的变化情况,请问如何解决。程序如下:
#include <hidef.h>
#include "derivative.h"
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
unsigned char flag1=0; //数字标记位
//unsigned char flag11=0; //重新设置键标记位
//unsigned char flag12=0; //小数点标记位
//unsigned char flag13=0; // *标记位
unsigned char flag14=0; //"小数"标记位
unsigned char flag15=0; // "确认键"标记位
unsigned char flag16=0; //"设置键"标志位
float a=11.2,b=10.1;
//long table2[19]; //存储结果的数组,20就出错?
float s,s1,s2; //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务
unsigned char num1;
void delay_10us(long m)
{ // 延时m*10us
//while(m--);
unsigned long a;
for(a=15*m;a>0;a--);
}
//------------------------------------
//函数名称:delay_1ms
//函数功能:1ms延时
//入口参数:usigned int t
//出口参数:无
void delaynms(unsigned int t) //延时t*1ms
{
unsigned int i;
for(i=0;i<t;i++)
delay_10us(102);
}
/********************************/
/*************************************************************/
/* 初始化4X4矩阵键盘 */
/*************************************************************/
//函数名称:KEY_Init
//函数功能:KEY初始化
//入口参数:无
//出口参数:无
void KEY_Init() //LCD初始化
{
DDRH=0xf0; //0输入。1输出
PERH=0xff; //1设置上拉/下拉电阻
PPSH=0xf0; //0上拉1下拉
//PIEH=0x00;
//PORTA=0xff;
//PTH=0xff;
}
/***********************************************************
函数名称:Kbscan
函数功能:键盘扫描程序
入口参数:无
出口参数:键值
备 注:
***********************************************************/
void kbscan(void)
{
uchar temp;
DDRH=0xf0; //0输入。1输出
PTH=0xef; //将第4lie线置低电平,其余线全为高电平
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0xe7: ;flag15=1;break; //1hang
case 0xeb:num1=1;flag1=1;break;
case 0xed:num1=4;flag1=1;break;
case 0xee:num1=7;flag1=1;break;
}
while(temp!=0x0f) //松手检测
{
temp=PTH;
temp=temp&0x0f;
}
}
}
DDRH=0xf0; //0输入。1输出
PTH=0xdf;
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0xd7:num1=0;flag1=1;break; //右下角
case 0xdb:num1=2;flag1=1;break;
case 0xdd:num1=5;flag1=1;break;
case 0xde:num1=8;flag1=1;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
DDRH=0xf0; //0输入。1输出
PTH=0xbf;
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0xb7: ;flag16=1;break; //右下角
case 0xbb:num1=3;flag1=1;break;
case 0xbd:num1=6;flag1=1;break;
case 0xbe: ;flag14=0;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
DDRH=0xf0; //0输入。1输出
PTH=0x7f;
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0x77: ;flag14=1;break; //右下角
case 0x7b:num1=9 ;flag1=0;break;
case 0x7d: ;flag15=0;break;
case 0x7e: ;flag16=0;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
}
/*********************************存储按下的数字键函数*****************8*********************/
void scan()
{
if(flag16==1) // 只有按下"设置键" 才能进入
{
if(flag1==1)
{
s1=s1*10+num1;
flag1=0;
}
if(flag14==1){
if(flag1==1){
s2=num1*0.1;
}
}
}
if(flag15==1){ // 按下"确认键"设置参数
s=s1+s2;
b=s;
}
if(flag16==0){
s=0;
s1=0;
s2=0;
num1=0;
}
}
void bijiao(){
if(a>b)
LEDCPU=0;
else
LEDCPU=1;
}
void main(void) {
LEDCPU_dir=1;
KEY_Init();
while(1){
kbscan();
scan();
bijiao();
}
}
#include <hidef.h>
#include "derivative.h"
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
unsigned char flag1=0; //数字标记位
//unsigned char flag11=0; //重新设置键标记位
//unsigned char flag12=0; //小数点标记位
//unsigned char flag13=0; // *标记位
unsigned char flag14=0; //"小数"标记位
unsigned char flag15=0; // "确认键"标记位
unsigned char flag16=0; //"设置键"标志位
float a=11.2,b=10.1;
//long table2[19]; //存储结果的数组,20就出错?
float s,s1,s2; //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务
unsigned char num1;
void delay_10us(long m)
{ // 延时m*10us
//while(m--);
unsigned long a;
for(a=15*m;a>0;a--);
}
//------------------------------------
//函数名称:delay_1ms
//函数功能:1ms延时
//入口参数:usigned int t
//出口参数:无
void delaynms(unsigned int t) //延时t*1ms
{
unsigned int i;
for(i=0;i<t;i++)
delay_10us(102);
}
/********************************/
/*************************************************************/
/* 初始化4X4矩阵键盘 */
/*************************************************************/
//函数名称:KEY_Init
//函数功能:KEY初始化
//入口参数:无
//出口参数:无
void KEY_Init() //LCD初始化
{
DDRH=0xf0; //0输入。1输出
PERH=0xff; //1设置上拉/下拉电阻
PPSH=0xf0; //0上拉1下拉
//PIEH=0x00;
//PORTA=0xff;
//PTH=0xff;
}
/***********************************************************
函数名称:Kbscan
函数功能:键盘扫描程序
入口参数:无
出口参数:键值
备 注:
***********************************************************/
void kbscan(void)
{
uchar temp;
DDRH=0xf0; //0输入。1输出
PTH=0xef; //将第4lie线置低电平,其余线全为高电平
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0xe7: ;flag15=1;break; //1hang
case 0xeb:num1=1;flag1=1;break;
case 0xed:num1=4;flag1=1;break;
case 0xee:num1=7;flag1=1;break;
}
while(temp!=0x0f) //松手检测
{
temp=PTH;
temp=temp&0x0f;
}
}
}
DDRH=0xf0; //0输入。1输出
PTH=0xdf;
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0xd7:num1=0;flag1=1;break; //右下角
case 0xdb:num1=2;flag1=1;break;
case 0xdd:num1=5;flag1=1;break;
case 0xde:num1=8;flag1=1;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
DDRH=0xf0; //0输入。1输出
PTH=0xbf;
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0xb7: ;flag16=1;break; //右下角
case 0xbb:num1=3;flag1=1;break;
case 0xbd:num1=6;flag1=1;break;
case 0xbe: ;flag14=0;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
DDRH=0xf0; //0输入。1输出
PTH=0x7f;
DDRH=0xf0; //0输入。1输出
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
delaynms(10);
temp=PTH;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=PTH;
switch(temp)
{
case 0x77: ;flag14=1;break; //右下角
case 0x7b:num1=9 ;flag1=0;break;
case 0x7d: ;flag15=0;break;
case 0x7e: ;flag16=0;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
}
/*********************************存储按下的数字键函数*****************8*********************/
void scan()
{
if(flag16==1) // 只有按下"设置键" 才能进入
{
if(flag1==1)
{
s1=s1*10+num1;
flag1=0;
}
if(flag14==1){
if(flag1==1){
s2=num1*0.1;
}
}
}
if(flag15==1){ // 按下"确认键"设置参数
s=s1+s2;
b=s;
}
if(flag16==0){
s=0;
s1=0;
s2=0;
num1=0;
}
}
void bijiao(){
if(a>b)
LEDCPU=0;
else
LEDCPU=1;
}
void main(void) {
LEDCPU_dir=1;
KEY_Init();
while(1){
kbscan();
scan();
bijiao();
}
}