程序哪里错了
时间:10-02
整理:3721RD
点击:
如题,这是一个通过矩阵键盘设置参数的程序,a为真实值,b为参数。通过LED灯来观察现象,但是现在的问题是:1只能设置一次参数2不能设置参数为小数。程序如下:
#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; //"设置键"标志位
unsigned char flag2=0; // 负号标记
unsigned char flag3=0; // 分子小于分母,结果只有两位有效数字时,扩大100倍有两位有效数字
unsigned char flag4=0; // 分子小于分母,结果只有一位效数字时,扩大100倍有1位有效数字
unsigned char a=11,b=10;
long table2[19]; //存储结果的数组,20就出错?
long s,num1; //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务
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:num1=9;flag1=1;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:num1=14;flag14=1;break; //右下角
case 0x7b:num1=13;flag13=1;break;
case 0x7d:num1=12;flag12=1;break;
case 0x7e: ;flag11=1;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
}
/*********************************存储按下的数字键函数*****************8*********************/
void scan()
{
if(flag16==1) // 只有按下"设置键" 才能进入
{
if(flag1==1)
{
s=s*10+num1;
flag1=0;
}
}
if(flag15==1){ // 按下"确认键"设置参数
b=s;
}
if(flag11==1){
flag16=0;
num1=0;
s=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; //"设置键"标志位
unsigned char flag2=0; // 负号标记
unsigned char flag3=0; // 分子小于分母,结果只有两位有效数字时,扩大100倍有两位有效数字
unsigned char flag4=0; // 分子小于分母,结果只有一位效数字时,扩大100倍有1位有效数字
unsigned char a=11,b=10;
long table2[19]; //存储结果的数组,20就出错?
long s,num1; //s为计算结果,a为第一个数,b为第二个数,num1对应为键对应的值为显12864显示服务
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:num1=9;flag1=1;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:num1=14;flag14=1;break; //右下角
case 0x7b:num1=13;flag13=1;break;
case 0x7d:num1=12;flag12=1;break;
case 0x7e: ;flag11=1;break;
}
while(temp!=0x0f)
{
temp=PTH;
temp=temp&0x0f;
}
}
}
}
/*********************************存储按下的数字键函数*****************8*********************/
void scan()
{
if(flag16==1) // 只有按下"设置键" 才能进入
{
if(flag1==1)
{
s=s*10+num1;
flag1=0;
}
}
if(flag15==1){ // 按下"确认键"设置参数
b=s;
}
if(flag11==1){
flag16=0;
num1=0;
s=0;
}
}
void bijiao(){
if(a>b)
LEDCPU=0;
else
LEDCPU=1;
}
void main(void) {
LEDCPU_dir=1;
KEY_Init();
while(1){
kbscan();
scan();
bijiao();
}
}