3163|3

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助单片机飞思卡尔HC08程序问题!!!! [复制链接]

题目:利用数码管和键盘实现10以内四则运算,键盘用于输入,数码管用于显示。要求:通过键盘输入算式,并在数码管上显示该算式,由程序计算运算结果并在数码管上显示。例如:输入1+2= ,则程序把结果03计算出来并显示在最后两位数码管上。键盘上的符号如数字“0”~“9”、“+”、“-”、“*”,“/”等自己定义,“+”、“-”、“*”,“/”在数码管上的显示形式自己定义。如加号用“┝ ”表示,“*”用两竖表示,“/”用三横表示。



//-------------------------------------------------------------------------*
//工 程 名:                                                                *
//硬件连接:                                                                *
//程序描述:                                                                *
//目    的:                                                                *
//说    明:                                                                *
//日    期:                                                                *
//-------------------------------------------------------------------------*

#include "Includes.h"    //总头文件
//主函数


unsigned char  key_scan(void)   //键盘识别
{   int i;
    unsigned char line, row, k_value;
    static unsigned char lastkey=0xff;
    const unsigned char KBTable[] = {
    0xEE,'0',0xDE,'1',0xBE,'2',0x7E,'3',
    0xED,'4',0xDD,'5',0xBD,'6',0x7D,'7',
    0xEB,'8',0xDB,'9',0xBB,'+',0x7B,'-',
    0xE7,'*',0xD7,'/',0xB7,'=',0x77,'.',
    0x00,0xff };
    line=0xFE;                  //扫描信号:使行线m1 (PTA0)为低电平,其余三根行线高电平
   for (i=0;i<4;i++)
   {
          PTD = line;           //输出扫描信号
          row=PTD;                    //读键盘口
          if  ((row & 0xf0) != 0xf0) //如果列线(PTA4-PTA7)不都为高电平,则表示有键按下
               break;
          line=(line<<1)+1;      //如果没有键按下,依次是行线有一条为低电平
   }
   if (i==4)   return 0xff;      //如果i等于4,则表示扫描完毕,没有键按下
   k_value = (row & 0xf0) | (line & 0x0f) ;  //如果有键按下,求是哪个键
   for  (i=0; i<32; i+=2)                    //求KBTable[]中与按下的键相同的键值
        if  (k_value == KBTable)
               break;
   if(lastkey==KBTable[i+1])  return 0xff;
   lastkey=KBTable[i+1];

   return  KBTable[i+1];                     //返回键的定义值
}
void Delay(int count)                     //延时
{   int i;
    for(i=0;i }

void LEDshow(unsigned char ledBuf[ ])
{   const unsigned char Table[17]={0x3F,0x06,0x5B,0x4F,0x66,
                       0x6D,0x7D,0x07,0x7F,0x6F,0x0,0x46,0x40,0x36,0x49,0x48,0x80};  //显示码表"0~9,空白,+,-,*,/,=, ."
    unsigned char i;
    DDRB = 0xff;      //数据口为输出
    DDRC = 0xff;         //位选口为输出
    PTB = 0x0;          //数据口输出全0,即全不亮     
    for (i=0;i<4;i++)
   {    PTC = ~(0b00001000 >> i);   //送位选信号
         PTB = Table[ledBuf];   //取显示码并送到LED数据线
         Delay(50);
    }
}



   
void main()
{  
    int i=0,j=0,tmp;
    unsigned char Buf[6]={0,0,0,0,0,0};
    unsigned char ledBuf[4]={10,10,10,10};
    unsigned char key=0xff;
    unsigned char  key_scan(void);
    DisableMCUInt();    //禁止总中断
    MCUInit();          //芯片初始化
    DDRD=0x0f,  PTDPUE=0xf0;  //PTD0~3输出,PTD4~7带上拉输入
    DDRB = 0xff, DDRC = 0xff;
    PTC  = 0xf0,  PTB =  0x40;     //显示“-”
    while(1)
    {      key=key_scan();
           if  (key==0xff)   continue;    //如果key==0xff,则没有键按下,继续扫描
           
           key = key - 0x30;               //键按下时,求key表示的数,0x30为‘0’
           if (key >9) key=key-0x7;       //如果大于9,用字母表示
           Buf=key;                    //把key的值赋值给Buf数组
           
           if(i>=4)                        
           {
               switch (Buf[1])             //求得数
              {
               case 11: tmp=Buf[0]+Buf[2]; break;
               case 12: tmp=Buf[0]-Buf[2]; break;
               case 13: tmp=Buf[0]*Buf[2]; break;
               case 14: tmp=Buf[0]/Buf[2]; break;
              }
              ledBuf[0]=10;
              ledBuf[1]=10;
              ledBuf[2]=tmp/10;
              ledBuf[3]=tmp%10;
           i=0;
           LEDshow(ledBuf);
           }
           else
           {
              ledBuf=Buf;
              i++;
              LEDshow(ledBuf);   
           }
                     
    }  
   
}
   
   
这个程序搞了很久都没搞出来,希望大家帮帮忙,程序运行结果是LED只亮了一个数字,而且不是按下的数字



最新回复

问题解决了,是数码管显示的问题,谢谢大家  详情 回复 发表于 2010-5-27 13:07
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
一块PCB生产出来后,首先的问题是硬件测试,即用非常小的软件测试硬件,如你的LED片选正常吗?锁存正常吗等等,如LED片选:
int main()
while(1)
{//这是为了便于用示波器观察
置LED片选脚
释放LED片选脚
}
return 0;
}
理论上讲这些测试工作应该属硬件人员管的。
你现在的程序对了解硬件功能的正常与否太大了,不知道毛病在哪里?
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主,要一点点的调试,任何时候,不能漫无目的的调试。你要采用排除法,一点点的来。
比如你现在的项目。首先,你要确定mcu跑了。再次,你先不管计算功能,你先测试数码管显示正常不,你在代码中直接控制数码管,直接输出一些数字,看是否都正常。然后你检测你按键功能正常不,每个按键都测试。最好才将数码管和按键一起处理。中间要做一些计算而已,很简单。

在这些调试过程中,就可以将那么些问题一一解决的。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
问题解决了,是数码管显示的问题,谢谢大家
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表