|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (13.02 KB, 下載次數(shù): 60)
下載附件
2020-5-31 15:53 上傳
51hei.png (22.64 KB, 下載次數(shù): 56)
下載附件
2020-5-31 15:53 上傳
單片機(jī)源程序如下:
- #define uchar unsigned char
- #define uint unsigned int
- #include <reg52.h>
- #include "asc.h" //ASCII字模表
- #include "12864.h" //12864液晶屏底層驅(qū)動(dòng)程序
- bit ERROR=1; //輸入字符錯(cuò)誤標(biāo)志位
- bit result=0; //輸入結(jié)果對(duì)錯(cuò)的標(biāo)志位,為0是正確
- bit verify=1; //已按了確認(rèn)鍵后清零
- sbit ERR=P2^7;
- uchar correctNUM; //統(tǒng)計(jì)測試正確的單詞數(shù),即得分
- /*****************************************
- /** 存儲(chǔ)要測試的單詞,放在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};//存儲(chǔ)各測試單詞的長度
- uchar KeyNum[8]; //儲(chǔ)存輸入的單詞
- /*****************************************
- /** 存儲(chǔ)鍵盤的字母值 ,放在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表示不認(rèn)識(shí),3表示上一個(gè),4表示下一個(gè)
- /*************************************************
- ** 鍵盤掃描程序
- *************************************************/
- 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);
- }
- /************************************************************************
- /** 主函數(shù)
- /**
- /**
- /*************************************************************************/
- void main(void)
- {
- uchar hz_Num; //用于計(jì)當(dāng)前測試的是第幾個(gè)詞,第一個(gè)為0
- uchar temp[8]; //用于送液晶屏顯示的臨時(shí)變量
- uchar iword=0,Nword=0; //輸入單詞字母下一個(gè)計(jì)數(shù)
- 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(); //掃描鍵盤的輸入值,沒按下時(shí)返回下橫線
- hz_disp(0,48,1,hz1+hz_Num*32,1); //在第1行,第49列開始顯示測試的漢字
- temp[0]=(hz_Num+1)/10+0x30; //將十進(jìn)制數(shù)轉(zhuǎn)換為ASCII字符
- temp[1]=(hz_Num+1)%10+0x30; //算出測試漢字的序號(hào)的第一位和第二位
- en_disp(0,20,1,Asc,":",1); //在第1行 第21列
- en_disp(0,4,2,Asc,temp,1); //在第1行 第5列 顯示測試序號(hào)
- if(KeyNum[iword]!='_') //鍵盤有按鍵按下
- {
- if(KeyNum[iword]==1) //如果按下了確定鍵
- {
- if(SL[hz_Num]==iword&&verify) //輸入長度等于測試單詞的長度,則正確 ,verify表示按下了確認(rèn)后有效一次
- {
- correctNUM+=1;
- if(correctNUM>10)
- {
- correctNUM=10; //最多10個(gè)正確的
- }
- verify=0; //標(biāo)志位清零
- hz_Num++; //測試下一個(gè)單詞
- if(hz_Num==10) hz_Num=0; //最多設(shè)10個(gè)單詞
- temp[0]=(correctNUM)/10+0x30; //將十進(jìn)制數(shù)轉(zhuǎn)換為ASCII字符
- temp[1]=(correctNUM)%10+0x30;
- //算出測試漢字的序號(hào)的第一位和第二位
- 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)//如果按下了“不認(rèn)識(shí)”或“下一個(gè)”鍵 ,直接跳到下一個(gè)單詞
- {
- result=0; //跳下一個(gè)時(shí)錯(cuò)誤燈滅
- ERROR=0;
- hz_Num++; //測試下一個(gè)單詞
- if(hz_Num==10) hz_Num=0; //最多設(shè)10個(gè)單詞
- iword=0;
- Nword=0;
- en_disp(4,16,8,Asc," ",1); //在第5行,第17列開始顯示
- }
- else if(KeyNum[iword]==3) //如果按下了“上一個(gè)”鍵 ,直接跳到上一個(gè)單詞
- {
- result=0; //跳下一個(gè)時(shí)錯(cuò)誤燈滅
- ERROR=0;
- //測試下一個(gè)單詞
- if(hz_Num==0) hz_Num=10; //最多設(shè)10個(gè)單詞
- hz_Num--;
- iword=0;
- Nword=0;
- en_disp(4,16,8,Asc," ",1); //在第4行,第16列開始顯示
- }
- else if(S[hz_Num][iword]==KeyNum[iword]) //輸入的字符與測試的標(biāo)準(zhǔn)字符比較
- { temp[0]=KeyNum[iword];
- ERROR=0; //正確就標(biāo)志位置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; //錯(cuò)誤就置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表示結(jié)果正確
- }
- ERR=!result; //錯(cuò)誤指示燈
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
單詞記憶測試器.rar
(81.15 KB, 下載次數(shù): 112)
2020-5-30 00:37 上傳
點(diǎn)擊文件名下載附件
程序和仿真 下載積分: 黑幣 -5
|
|