标题:
独立键盘实现的单片机单词记忆测试代码(开发中)
[打印本页]
作者:
ccyyer
时间:
2021-12-6 10:24
标题:
独立键盘实现的单片机单词记忆测试代码(开发中)
#include <AT89X52.h>
#include <stdio.h>
//-----重命名数据类型-----------
#define uint unsigned int
#define uchar unsigned char
/*----------------------------------------------------------------------------------------
delay functions us&ms
----------------------------------------------------------------------------------------*/
/*内嵌汇编的方法:一般格式
#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独立按键相关I/O设置
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 数据和命令选择端口
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 数据端口
/*-----------------------------------------
判断忙信号函数
------------------------------------------*/
void LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
// _nop_();
EN_SET;
while(DataPort & 0x80); //等待忙完
EN_CLR; //保持时间
}
/*-----------------------------------------
写入命令函数
------------------------------------------*/
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;
}
/*-----------------------------------------
写入数据函数
------------------------------------------*/
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;
}
/*-----------------------------------------
清屏函数
------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01,1);
delay_nms(5);
}
/*-----------------------------------------
初始化函数
------------------------------------------*/
void LCD_Init(void)
{
delay_nms(15);
LCD_Write_Com(0x38,0); /*显示模式设置*/
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); /*显示关闭*/
LCD_Write_Com(0x01,1); /*显示清屏*/
LCD_Write_Com(0x06,1); /*显示光标移动设置*/
delay_nms(5);
LCD_Write_Com(0x0C,1); /*显示开及光标设置*/
}
/*-----------------------------------------------------------------------
写入字符
------------------------------------------------------------------------*/
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)//哪个键按下就有对应的返回,对应的动作
// {
// 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)//哪个键按下就有对应的返回,对应的动作
{
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)//哪个键按下就有对应的返回,对应的动作
{
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)//哪个键按下就有对应的返回,对应的动作
{
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)//哪个键按下就有对应的返回,对应的动作
{
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)//哪个键按下就有对应的返回,对应的动作
{
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)//哪个键按下就有对应的返回,对应的动作
{
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)//哪个键按下就有对应的返回,对应的动作
{
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)//哪个键按下就有对应的返回,对应的动作
{
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);//按键没有触发的时候暂停在这里
LCD_Clear();
switch (keybuff)
{
case 1 : //按1进入背单词界面
{
for(;i<=10;)//i在0~10在这个循环执行
{
LCD_Write_String(0,0,table[0][i-1]);
LCD_Write_String(0,1,"known or unknown");
while(JDG()==0);//有按键触发才往下执行
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加上知道的数
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退出到标题界面,其他键则继续写入
{
LCD_Clear();
goto caption;
}
LCD_Clear();
LCD_Write_String(0,0,"a~g"); //在第一行输入四个区域的字母
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;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1