標題:
獨立鍵盤實現(xiàn)的單片機單詞記憶測試代碼(開發(fā)中)
[打印本頁]
作者:
ccyyer
時間:
2021-12-6 10:24
標題:
獨立鍵盤實現(xiàn)的單片機單詞記憶測試代碼(開發(fā)中)
#include <AT89X52.h>
#include <stdio.h>
//-----重命名數(shù)據(jù)類型-----------
#define uint unsigned int
#define uchar unsigned char
/*----------------------------------------------------------------------------------------
delay functions us&ms
----------------------------------------------------------------------------------------*/
/*內(nèi)嵌匯編的方法:一般格式
#pragma ASM
nop ;
#pragma ENDASM,*/
void delay_nus(unsigned int i) //延時:i>=12 ,i的最小延時單12 us
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n) //延時n ms
{
n=n+1;
while(--n)
delay_nus(900); //延時 1ms,同時進行補償
}
//8獨立按鍵相關(guān)I/O設(shè)置
sbit P1key=P1^0; //按鍵P1接在P1.0口上
sbit P2key=P1^1; //按鍵P2接在P1.1口上
sbit P3key=P1^2; //按鍵P3接在P1.2口上
sbit P4key=P1^3; //按鍵P4接在P1.3口上
sbit P5key=P1^4; //按鍵P5接在P1.4口上
sbit P6key=P1^5; //按鍵P6接在P1.5口上
sbit P7key=P1^6; //按鍵P7接在P1.6口上
sbit P8key=P1^7; //按鍵P8接在P1.7口上
sbit RS = P2^5; //LCD1602 數(shù)據(jù)和命令選擇端口
sbit RW = P2^4; //LCD1602 讀寫控制端口
sbit EN = P2^3; //LCD1602 使能端口
uint keybuff;
uchar code table[2][10][20]={{"substance","fabric","subsidy","elegant","abuse","collaboration","imply","distinct","rim","edible"},{"1","2","3","4","5","6","7","8","9","10"}};
//
//LCD配置
#define RS_CLR RS = 0
#define RS_SET RS = 1
#define RW_CLR RW = 0
#define RW_SET RW = 1
#define EN_CLR EN = 0
#define EN_SET EN = 1
#define DataPort P0 //LCD1602 數(shù)據(jù)端口
/*-----------------------------------------
判斷忙信號函數(shù)
------------------------------------------*/
void LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
// _nop_();
EN_SET;
while(DataPort & 0x80); //等待忙完
EN_CLR; //保持時間
}
/*-----------------------------------------
寫入命令函數(shù)
------------------------------------------*/
void LCD_Write_Com(unsigned char com,bit flag)
{
if(flag == 1) LCD_Check_Busy(); //忙則等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com;
// _nop_(); //一個指令周期;
EN_CLR;
}
/*-----------------------------------------
寫入數(shù)據(jù)函數(shù)
------------------------------------------*/
void LCD_Write_Data(unsigned char Data,bit flag)
{
if(flag == 1) LCD_Check_Busy(); //忙則等待
RS_SET;
RW_CLR;
EN_SET;
DataPort = Data;
// _nop_(); //一個指令周期;
EN_CLR;
}
/*-----------------------------------------
清屏函數(shù)
------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01,1);
delay_nms(5);
}
/*-----------------------------------------
初始化函數(shù)
------------------------------------------*/
void LCD_Init(void)
{
delay_nms(15);
LCD_Write_Com(0x38,0); /*顯示模式設(shè)置*/
delay_nms(5);
LCD_Write_Com(0x38,0);
delay_nms(5);
LCD_Write_Com(0x38,0);
delay_nms(5);
LCD_Write_Com(0x38,1);
LCD_Write_Com(0x08,1); /*顯示關(guān)閉*/
LCD_Write_Com(0x01,1); /*顯示清屏*/
LCD_Write_Com(0x06,1); /*顯示光標移動設(shè)置*/
delay_nms(5);
LCD_Write_Com(0x0C,1); /*顯示開及光標設(shè)置*/
}
/*-----------------------------------------------------------------------
寫入字符
------------------------------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if(y == 0)
{
LCD_Write_Com(0x80 + x,1);
}
else
{
LCD_Write_Com(0x80 + 0x40 + x,1);
}
LCD_Write_Data(Data,1);
}
/*-----------------------------------------------------------------------
寫入字符串
------------------------------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if(y == 0)
{
LCD_Write_Com(0x80 + x,1);
}
else
{
LCD_Write_Com(0x80 + 0x40 + x,1);
}
while(*s)
{
LCD_Write_Data(*s,1);
s++;
}
}
//封裝一個下降沿的判斷
//uint XIAODOU(bit key)
//{
// if(key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
// {
// delay_nms(10);
// if(key==0)//按下判斷兩次
// {
// delay_nms(50);
// if(key==1)
// {
// delay_nms(10);
// if(key==1)//松開判斷兩次
// {
// return 1;
// }
//
// }
// }
//
//
// }
// else return 0;
//}
uint JDG(void)
{
if(P5key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P5key==0)//按下判斷兩次
{
delay_nms(50);
if(P5key==1)
{
delay_nms(10);
if(P5key==1)//松開判斷兩次
{
keybuff=5;//確定按下了
return 5;
}
}
}
}
else if(P8key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P8key==0)//按下判斷兩次
{
delay_nms(50);
if(P8key==1)
{
delay_nms(10);
if(P8key==1)//松開判斷兩次
{
keybuff=8;//確定按下了
return 8;
}
}
}
}
else if(P6key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P6key==0)//按下判斷兩次
{
delay_nms(50);
if(P6key==1)
{
delay_nms(10);
if(P6key==1)//松開判斷兩次
{
keybuff=6;//確定按下了
return 6;
}
}
}
}
else if(P1key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P1key==0)//按下判斷兩次
{
delay_nms(50);
if(P1key==1)
{
delay_nms(10);
if(P1key==1)//松開判斷兩次
{
keybuff=1;//確定按下了
return 1;
}
}
}
}
else if(P2key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P2key==0)//按下判斷兩次
{
delay_nms(50);
if(P2key==1)
{
delay_nms(10);
if(P2key==1)//松開判斷兩次
{
keybuff=2;//確定按下了
return 2;
}
}
}
}
else if(P3key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P3key==0)//按下判斷兩次
{
delay_nms(50);
if(P3key==1)
{
delay_nms(10);
if(P3key==1)//松開判斷兩次
{
keybuff=3;//確定按下了
return 3;
}
}
}
}
else if(P4key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P4key==0)//按下判斷兩次
{
delay_nms(50);
if(P4key==1)
{
delay_nms(10);
if(P4key==1)//松開判斷兩次
{
keybuff=4;//確定按下了
return 4;
}
}
}
}
else if(P7key==0)//哪個鍵按下就有對應(yīng)的返回,對應(yīng)的動作
{
delay_nms(10);
if(P7key==0)//按下判斷兩次
{
delay_nms(50);
if(P7key==1)
{
delay_nms(10);
if(P7key==1)//松開判斷兩次
{
keybuff=7;//確定按下了
return 7;
}
}
}
}
else return 0;//沒有鍵按下
}
void main()
{
uint i=1;
uint know=0;
uchar k='0';
char words[10][5]={"","","","","","","","","",""};
LCD_Init(); //初始化LCD1602液晶
LCD_Clear();//顯示清零
while(1)
{
caption:
LCD_Write_String(3,0,"WORDS TEST");
LCD_Write_String(6,1,"Cy");
while(JDG()==0);//按鍵沒有觸發(fā)的時候暫停在這里
LCD_Clear();
switch (keybuff)
{
case 1 : //按1進入背單詞界面
{
for(;i<=10;)//i在0~10在這個循環(huán)執(zhí)行
{
LCD_Write_String(0,0,table[0][i-1]);
LCD_Write_String(0,1,"known or unknown");
while(JDG()==0);//有按鍵觸發(fā)才往下執(zhí)行
switch (keybuff)
{
case 1:
{
know++;
LCD_Clear();
LCD_Write_String(0,1,"known");
while(JDG()!=5&&JDG()!=6);//按鍵5或6沒有按下就停住
if(keybuff==5){goto last;} else if(keybuff==6){goto next;}
} break;
case 2:
{
LCD_Clear();
LCD_Write_String(0,1,"unknown");
while(JDG()!=5||JDG()!=6);
if(keybuff==5){goto last;} else if(keybuff==6){goto next;}
}break;
case 6:
{
next:
i++;
} break;
case 5:
{
last:
i--;
} break;
}
LCD_Clear();
}
k=k+know;//0加上知道的數(shù)
LCD_Clear();
LCD_Write_String(0,0,"correct rate:");
LCD_Write_Char(0,1,k);
LCD_Write_String(1,1,"0%");
while(JDG()!=8);//按8回退到標題界面
LCD_Clear();
i=1;//回到標題需要對重置標志量
know=0;
k='0';
goto caption;
} break;
case 5 : //按5到寫入界面
{
load:
LCD_Write_String(0,0,"LOAD");
while(JDG()==0); //任意按鍵按下有動作
if (keybuff==8) //同時是否判斷按P8退出到標題界面,其他鍵則繼續(xù)寫入
{
LCD_Clear();
goto caption;
}
LCD_Clear();
LCD_Write_String(0,0,"a~g"); //在第一行輸入四個區(qū)域的字母
LCD_Write_String(4,0,"h~n");
LCD_Write_String(8,0,"o~t");
LCD_Write_String(12,0,"u~z");
while(JDG()==0);
if (keybuff==8) //同時是否判斷按P8退出到上個界面
{
LCD_Clear();
goto load;
}
switch(keybuff)
{
case 1 :
{
LCD_Clear();
LCD_Write_String(0,0,"abcdefg");
//for()
{
}
}
}
LCD_Clear();
} break;
case 6 :
{
LCD_Write_String(0,1,"hijklmn");while(JDG()!=6);LCD_Clear();
}break;
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1