找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5201|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)單詞記憶測試器Proteus仿真程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #define uchar unsigned char
  2. #define uint  unsigned int

  3. #include <reg52.h>
  4. #include "asc.h"                   //ASCII字模表
  5. #include "12864.h"                //12864液晶屏底層驅(qū)動(dòng)程序

  6. bit ERROR=1;                        //輸入字符錯(cuò)誤標(biāo)志位
  7. bit result=0;                          //輸入結(jié)果對(duì)錯(cuò)的標(biāo)志位,為0是正確
  8. bit verify=1;                        //已按了確認(rèn)鍵后清零
  9. sbit ERR=P2^7;
  10. uchar correctNUM;                 //統(tǒng)計(jì)測試正確的單詞數(shù),即得分


  11. /*****************************************
  12. /** 存儲(chǔ)要測試的單詞,放在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};//存儲(chǔ)各測試單詞的長度

  26. uchar KeyNum[8];                       //儲(chǔ)存輸入的單詞

  27. /*****************************************
  28. /** 存儲(chǔ)鍵盤的字母值 ,放在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表示不認(rèn)識(shí),3表示上一個(gè),4表示下一個(gè)                                                         
  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. /**    主函數(shù)
  76. /**   
  77. /**   
  78. /*************************************************************************/
  79. void main(void)
  80. {   
  81.   uchar hz_Num;                                        //用于計(jì)當(dāng)前測試的是第幾個(gè)詞,第一個(gè)為0
  82.         uchar temp[8];                                  //用于送液晶屏顯示的臨時(shí)變量
  83.         uchar iword=0,Nword=0;                  //輸入單詞字母下一個(gè)計(jì)數(shù)
  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();                   //掃描鍵盤的輸入值,沒按下時(shí)返回下橫線
  95.                  hz_disp(0,48,1,hz1+hz_Num*32,1);           //在第1行,第49列開始顯示測試的漢字
  96.                  temp[0]=(hz_Num+1)/10+0x30;           //將十進(jìn)制數(shù)轉(zhuǎn)換為ASCII字符
  97.                  temp[1]=(hz_Num+1)%10+0x30;           //算出測試漢字的序號(hào)的第一位和第二位
  98.                  en_disp(0,20,1,Asc,":",1);        //在第1行 第21列         
  99.                  en_disp(0,4,2,Asc,temp,1);        //在第1行 第5列        顯示測試序號(hào)



  100.         if(KeyNum[iword]!='_')                      //鍵盤有按鍵按下
  101.         {
  102.          if(KeyNum[iword]==1)             //如果按下了確定鍵
  103.          {
  104.                 if(SL[hz_Num]==iword&&verify)   //輸入長度等于測試單詞的長度,則正確 ,verify表示按下了確認(rèn)后有效一次
  105.                 {
  106.                 correctNUM+=1;
  107.                 if(correctNUM>10)
  108.                  {
  109.                  correctNUM=10; //最多10個(gè)正確的
  110.                  }
  111.                 verify=0;                                           //標(biāo)志位清零
  112.                 hz_Num++;                                     //測試下一個(gè)單詞
  113.                 if(hz_Num==10) hz_Num=0;                   //最多設(shè)10個(gè)單詞
  114.                 temp[0]=(correctNUM)/10+0x30;           //將十進(jìn)制數(shù)轉(zhuǎn)換為ASCII字符
  115.                 temp[1]=(correctNUM)%10+0x30;       
  116.          //算出測試漢字的序號(hào)的第一位和第二位
  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)//如果按下了“不認(rèn)識(shí)”或“下一個(gè)”鍵 ,直接跳到下一個(gè)單詞
  124.         {
  125.                 result=0;                                  //跳下一個(gè)時(shí)錯(cuò)誤燈滅
  126.                 ERROR=0;
  127.                 hz_Num++;                                       //測試下一個(gè)單詞
  128.                 if(hz_Num==10) hz_Num=0;                   //最多設(shè)10個(gè)單詞
  129.                  iword=0;
  130.                 Nword=0;
  131.                 en_disp(4,16,8,Asc,"        ",1);           //在第5行,第17列開始顯示
  132.         }
  133.         else if(KeyNum[iword]==3)                  //如果按下了“上一個(gè)”鍵 ,直接跳到上一個(gè)單詞
  134.         {
  135.                 result=0;                                        //跳下一個(gè)時(shí)錯(cuò)誤燈滅
  136.                 ERROR=0;
  137.                                                                                                                                                          //測試下一個(gè)單詞
  138.                 if(hz_Num==0) hz_Num=10;                           //最多設(shè)10個(gè)單詞
  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])  //輸入的字符與測試的標(biāo)準(zhǔn)字符比較
  145.          { temp[0]=KeyNum[iword];
  146.                 ERROR=0;                                            //正確就標(biāo)志位置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;                                        //錯(cuò)誤就置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表示結(jié)果正確
  162.          }         
  163.                 ERR=!result;                                          //錯(cuò)誤指示燈
  164.         }
  165. }
復(fù)制代碼

所有資料51hei提供下載:
單詞記憶測試器.rar (81.15 KB, 下載次數(shù): 112)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2020-5-31 15:54 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:302325 發(fā)表于 2020-6-1 01:40 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

地板
ID:758800 發(fā)表于 2020-6-13 17:11 | 只看該作者

好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

5#
ID:837096 發(fā)表于 2020-11-2 19:00 | 只看該作者
仿真文件dsn在哪
回復(fù)

使用道具 舉報(bào)

6#
ID:579815 發(fā)表于 2021-5-9 20:26 | 只看該作者


好資料,51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

7#
ID:962954 發(fā)表于 2021-8-30 08:17 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

8#
ID:987963 發(fā)表于 2021-12-4 16:18 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表