找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3628|回复: 1
收起左侧

求助大神,c语言没学好,单片机课程设计根本做不到啊

[复制链接]
ID:94164 发表于 2015-10-31 00:10 | 显示全部楼层 |阅读模式
/************************************************************************
/**单片机单词测试程序
/**设计一个以单片机为核心的单词记忆测试器;
/** 实现单词的录入(为使程序具有可演示性,单词不少于10个);
/**单词用按键控制依次在屏幕上显示,按键选择认识还是不认识,
/**也可以直接进入下一个或者上一个;
/**单词背完后给出正确率。
/*************************************************************************/

#define uchar unsigned char
#define uint  unsigned int

#include <reg52.h>
#include "asc.h"                   //ASCII字模表
#include "12864.h"                //12864液晶屏底层驱动程序

bit ERROR=1;                        //输入字符错误标志位
bit result=0;                          //输入结果对错的标志位,为0是正确
bit verify=1;                        //已按了确认键后清零
sbit ERR=P2^7;
uchar correctNUM;                 //统计测试正确的单词数,即得分
/*****************************************
/** 存储要测试的单词,放在ROM中
/****************************************/

uchar code S[10][5]={                "tree ",    //树
                                     "rain ",    //雨
                                     "water",  //水
                                     "fly  ",     //飞
                                     "go   ",   //去
                                     "fish ",    //鱼
                                     "snow ",  //雪
                                     "eat  ",    //吃
                                     "rice ",    //米
                                     "ice  ",    //冰
                                    } ;

uchar code         SL[10]={4,4,5,3,2,4,4,3,4,3};//存储各测试单词的长度

uchar KeyNum[8];                       //储存输入的单词

/*****************************************
/** 存储键盘的字母值 ,放在ROM中
/****************************************/

uchar code tab1[6][5]={{'a','b','c','d','e'},
                            {'f','g','h','i','j'},
                            {'k','l','m','n','o'},
                            {'p','q','r','s','t'},
                                          {'u','v','w','x','y'},
                                          {'z',1,2,3,4}};            
//最后的 1234 键盘值为功能键, 1表示确定键,2表示不认识,3表示上一个,4表示下一个                                                         
/*************************************************
** 键盘扫描程序

*************************************************/

unsigned char kbscan()          //键盘扫描
        {
        uchar hang,lie,key;                    //P1连行,P3连列
        if(P1!=0xFF||P3!=0)
        {
                switch(P1&0xFF)                //P1 扫行
                        {
                       
                            case 0xFE:hang=5;break;//P1.0为第6行
                                case 0xFD:hang=4;break;//P1.1为第5行
                                case 0xFB:hang=3;break;//P1.2为第4行
                                case 0xF7:hang=2;break;//P1.3为第3行
                                case 0xEF:hang=1;break;//P1.4为第2行
                                case 0xDF:hang=0;break;//P1.5为第1行
                        }
                        P1=0;   //P1全低电平
                    P3=0xFF;//P3全高电平
                switch(P3&0xFF)
                        {
                                case 0xFE:lie=4;break; //P1.0为第5列
                                case 0xFD:lie=3;break; //P0.5为第4列
                                case 0xFB:lie=2;break; //P0.6为第3列
                                case 0xF7:lie=1;break; //P0.7为第2列
                                   case 0xEF:lie=0;break; //P0.7为第1列
                        }
                P1=0xFF; //P1全高电平
                P3=0;         //P3全低电平
                while(P1!=0xFF||P3!=0);                  //按键松开后才返回值
                key=tab1[hang][lie];
        }
        else
                key='_';
        return (key);
        }

/************************************************************************
/**    主函数
/**   
/**   
/*************************************************************************/
void main(void)
{   
    uchar hz_Num;                                        //用于计当前测试的是第几个词,第一个为0
        uchar temp[8];                                  //用于送液晶屏显示的临时变量
        uchar iword=0,Nword=0;                  //输入单词字母下一个计数
    LCD12864_init();                           //LCD12864初始化
        ClearLCD();                                //清屏
        en_disp(2,1,11,Asc,"INPUT WORD:",1); //在第2行 第1列
           en_disp(4,1,1,Asc,">",1);                  //在第5行,第2列开始显示
        en_disp(6,0,8,Asc,"correct:",1);         //在第7行,第1列开始显示
        en_disp(6,80,5,Asc,"00/10",1);           //在第7行 第81列
        P1=0xFF; //P1全高电平
        P3=0;           //P3全低电平

    while(1)
    {
            KeyNum[iword]=kbscan();                   //扫描键盘的输入值,没按下时返回下横线
         hz_disp(0,48,1,hz1+hz_Num*32,1);           //在第1行,第49列开始显示测试的汉字
         temp[0]=(hz_Num+1)/10+0x30;           //将十进制数转换为ASCII字符
         temp[1]=(hz_Num+1)%10+0x30;           //算出测试汉字的序号的第一位和第二位
         en_disp(0,20,1,Asc,":",1);        //在第1行 第21列         
         en_disp(0,4,2,Asc,temp,1);        //在第1行 第5列        显示测试序号



  if(KeyNum[iword]!='_')                      //键盘有按键按下
  {
         if(KeyNum[iword]==1)             //如果按下了确定键
         {
          if(SL[hz_Num]==iword&&verify)   //输入长度等于测试单词的长度,则正确 ,verify表示按下了确认后有效一次
          {
          correctNUM+=1;
          if(correctNUM>10)
           {
           correctNUM=10; //最多10个正确的
           }
          verify=0;                                           //标志位清零
          hz_Num++;                                     //测试下一个单词
          if(hz_Num==10) hz_Num=0;                   //最多设10个单词
          temp[0]=(correctNUM)/10+0x30;           //将十进制数转换为ASCII字符
          temp[1]=(correctNUM)%10+0x30;           //算出测试汉字的序号的第一位和第二位
          en_disp(6,80,2,Asc,temp,1);               //在第7行 第81列
          iword=0;
          Nword=0;
          en_disp(4,16,8,Asc,"        ",1);            //在第5行,第17列开始显示
          }
         }
        else if(KeyNum[iword]==2||KeyNum[iword]==4)//如果按下了“不认识”或“下一个”键 ,直接跳到下一个单词
        {
          result=0;                                  //跳下一个时错误灯灭
          ERROR=0;
          hz_Num++;                                       //测试下一个单词
          if(hz_Num==10) hz_Num=0;                   //最多设10个单词
           iword=0;
          Nword=0;
          en_disp(4,16,8,Asc,"        ",1);           //在第5行,第17列开始显示
        }
        else if(KeyNum[iword]==3)                  //如果按下了“上一个”键 ,直接跳到上一个单词
        {
          result=0;                                        //跳下一个时错误灯灭
          ERROR=0;
                                       //测试下一个单词
          if(hz_Num==0) hz_Num=10;                           //最多设10个单词
                   hz_Num--;   
           iword=0;
           Nword=0;
           en_disp(4,16,8,Asc,"        ",1);                   //在第4行,第16列开始显示
        }
        else  if(S[hz_Num][iword]==KeyNum[iword])  //输入的字符与测试的标准字符比较
         { temp[0]=KeyNum[iword];
          ERROR=0;                                            //正确就标志位置0
          en_disp(4,Nword+16,1,Asc,temp,1);             //在第5行,第17列开始显示
          iword++;
         if(iword==8) iword=0;
         Nword=iword*8;       
          verify=1;                               
         }
         else  
         { temp[0]=KeyNum[iword];
          ERROR=1;                                        //错误就置1
          en_disp(4,Nword+16,1,Asc,temp,1);            //在第5行,第17列开始显示
          iword++;
         if(iword==8) iword=0;
         Nword=iword*8;       
         }
         result=ERROR|result;                                //0表示结果正确
   }
         
          ERR=!result;                                          //错误指示灯
    }
}
出现下面的错误怎么调试
360截图20151031001044319.jpg


回复

使用道具 举报

ID:84495 发表于 2015-11-1 09:53 | 显示全部楼层
本文件内没有en-disp函数吧,需要把包含en-disp的头文件调用一下,里面应该有这么一句 void en-disp (),修改别人的程序经常会遇到这问题,
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表