找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3967|回复: 7
打印 上一主题 下一主题
收起左侧

单片机单词记忆测试器Proteus仿真程序

  [复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #define uchar unsigned char
  2. #define uint  unsigned int

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

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


  11. /*****************************************
  12. /** 存储要测试的单词,放在ROM中
  13. /****************************************/

  14. uchar code S[10][5]={                "tree ",    //树
  15.                                      "rain ",    //雨
  16.                                      "water",  //水
  17.                                      "fly  ",     //飞
  18.                                      "go   ",   //去
  19.                                      "fish ",    //鱼
  20.                                      "snow ",  //雪
  21.                                      "eat  ",    //吃
  22.                                      "rice ",    //米
  23.                                      "ice  ",    //冰
  24.                                     } ;

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

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

  27. /*****************************************
  28. /** 存储键盘的字母值 ,放在ROM中
  29. /****************************************/

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

  39. *************************************************/

  40. unsigned char kbscan()          //键盘扫描
  41.         {
  42.         uchar hang,lie,key;                    //P1连行,P3连列
  43.         if(P1!=0xFF||P3!=0)
  44.         {
  45.                 switch(P1&0xFF)                //P1 扫行
  46.                         {
  47.                        
  48.                             case 0xFE:hang=5;break;//P1.0为第6行
  49.                                 case 0xFD:hang=4;break;//P1.1为第5行
  50.                                 case 0xFB:hang=3;break;//P1.2为第4行
  51.                                 case 0xF7:hang=2;break;//P1.3为第3行
  52.                                 case 0xEF:hang=1;break;//P1.4为第2行
  53.                                 case 0xDF:hang=0;break;//P1.5为第1行
  54.                         }
  55.                         P1=0;   //P1全低电平
  56.                     P3=0xFF;//P3全高电平
  57.                 switch(P3&0xFF)
  58.                         {
  59.                                 case 0xFE:lie=4;break; //P1.0为第5列
  60.                                 case 0xFD:lie=3;break; //P0.5为第4列
  61.                                 case 0xFB:lie=2;break; //P0.6为第3列
  62.                                 case 0xF7:lie=1;break; //P0.7为第2列
  63.                                    case 0xEF:lie=0;break; //P0.7为第1列
  64.                         }
  65.                 P1=0xFF; //P1全高电平
  66.                 P3=0;         //P3全低电平
  67.                 while(P1!=0xFF||P3!=0);                  //按键松开后才返回值
  68.                 key=tab1[hang][lie];
  69.         }
  70.         else
  71.                 key='_';
  72.         return (key);
  73.         }

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

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



  100.         if(KeyNum[iword]!='_')                      //键盘有按键按下
  101.         {
  102.          if(KeyNum[iword]==1)             //如果按下了确定键
  103.          {
  104.                 if(SL[hz_Num]==iword&&verify)   //输入长度等于测试单词的长度,则正确 ,verify表示按下了确认后有效一次
  105.                 {
  106.                 correctNUM+=1;
  107.                 if(correctNUM>10)
  108.                  {
  109.                  correctNUM=10; //最多10个正确的
  110.                  }
  111.                 verify=0;                                           //标志位清零
  112.                 hz_Num++;                                     //测试下一个单词
  113.                 if(hz_Num==10) hz_Num=0;                   //最多设10个单词
  114.                 temp[0]=(correctNUM)/10+0x30;           //将十进制数转换为ASCII字符
  115.                 temp[1]=(correctNUM)%10+0x30;       
  116.          //算出测试汉字的序号的第一位和第二位
  117.                 en_disp(6,80,2,Asc,temp,1);               //在第7行 第81列
  118.                 iword=0;
  119.                 Nword=0;
  120.                 en_disp(4,16,8,Asc,"        ",1);            //在第5行,第17列开始显示
  121.                 }
  122.          }
  123.         else if(KeyNum[iword]==2||KeyNum[iword]==4)//如果按下了“不认识”或“下一个”键 ,直接跳到下一个单词
  124.         {
  125.                 result=0;                                  //跳下一个时错误灯灭
  126.                 ERROR=0;
  127.                 hz_Num++;                                       //测试下一个单词
  128.                 if(hz_Num==10) hz_Num=0;                   //最多设10个单词
  129.                  iword=0;
  130.                 Nword=0;
  131.                 en_disp(4,16,8,Asc,"        ",1);           //在第5行,第17列开始显示
  132.         }
  133.         else if(KeyNum[iword]==3)                  //如果按下了“上一个”键 ,直接跳到上一个单词
  134.         {
  135.                 result=0;                                        //跳下一个时错误灯灭
  136.                 ERROR=0;
  137.                                                                                                                                                          //测试下一个单词
  138.                 if(hz_Num==0) hz_Num=10;                           //最多设10个单词
  139.                          hz_Num--;   
  140.                  iword=0;
  141.                  Nword=0;
  142.                  en_disp(4,16,8,Asc,"        ",1);                   //在第4行,第16列开始显示
  143.         }
  144.         else  if(S[hz_Num][iword]==KeyNum[iword])  //输入的字符与测试的标准字符比较
  145.          { temp[0]=KeyNum[iword];
  146.                 ERROR=0;                                            //正确就标志位置0
  147.                 en_disp(4,Nword+16,1,Asc,temp,1);             //在第5行,第17列开始显示
  148.                 iword++;
  149.          if(iword==8) iword=0;
  150.          Nword=iword*8;       
  151.                 verify=1;                               
  152.          }
  153.          else  
  154.          { temp[0]=KeyNum[iword];
  155.                 ERROR=1;                                        //错误就置1
  156.                 en_disp(4,Nword+16,1,Asc,temp,1);            //在第5行,第17列开始显示
  157.                 iword++;
  158.          if(iword==8) iword=0;
  159.          Nword=iword*8;       
  160.          }
  161.          result=ERROR|result;                                //0表示结果正确
  162.          }         
  163.                 ERR=!result;                                          //错误指示灯
  164.         }
  165. }
复制代码

所有资料51hei提供下载:
单词记忆测试器.rar (81.15 KB, 下载次数: 110)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-5-31 15:54 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:302325 发表于 2020-6-1 01:40 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

地板
ID:758800 发表于 2020-6-13 17:11 | 只看该作者

好资料,51黑有你更精彩!!!
回复

使用道具 举报

5#
ID:837096 发表于 2020-11-2 19:00 | 只看该作者
仿真文件dsn在哪
回复

使用道具 举报

6#
ID:579815 发表于 2021-5-9 20:26 | 只看该作者


好资料,51黑有你更精彩
回复

使用道具 举报

7#
ID:962954 发表于 2021-8-30 08:17 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

8#
ID:987963 发表于 2021-12-4 16:18 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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