找回密码
 立即注册

QQ登录

只需一步,快速开始

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

独立键盘实现的单片机单词记忆测试代码(开发中)

[复制链接]
跳转到指定楼层
楼主
ID:988502 发表于 2021-12-6 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <AT89X52.h>
  2. #include <stdio.h>

  3. //-----重命名数据类型-----------
  4. #define uint  unsigned int
  5. #define uchar unsigned char
  6. /*----------------------------------------------------------------------------------------
  7.                       delay functions us&ms
  8. ----------------------------------------------------------------------------------------*/
  9. /*内嵌汇编的方法:一般格式
  10.    #pragma ASM
  11.      nop  ;
  12.     #pragma ENDASM,*/

  13. void delay_nus(unsigned int i)  //延时:i>=12 ,i的最小延时单12 us
  14. {
  15.   i=i/10;
  16.   while(--i);
  17. }   

  18. void delay_nms(unsigned int n)  //延时n ms
  19. {
  20.   n=n+1;
  21.   while(--n)  
  22.   delay_nus(900);         //延时 1ms,同时进行补偿
  23. }



  24.   //8独立按键相关I/O设置
  25. sbit P1key=P1^0;           //按键P1接在P1.0口上
  26. sbit P2key=P1^1;           //按键P2接在P1.1口上
  27. sbit P3key=P1^2;           //按键P3接在P1.2口上
  28. sbit P4key=P1^3;           //按键P4接在P1.3口上
  29. sbit P5key=P1^4;           //按键P5接在P1.4口上
  30. sbit P6key=P1^5;           //按键P6接在P1.5口上
  31. sbit P7key=P1^6;           //按键P7接在P1.6口上
  32. sbit P8key=P1^7;           //按键P8接在P1.7口上

  33. sbit RS = P2^5;     //LCD1602 数据和命令选择端口
  34. sbit RW = P2^4;     //LCD1602 读写控制端口
  35. sbit EN = P2^3;     //LCD1602 使能端口

  36. uint keybuff;
  37. 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"}};
  38. //
  39. //LCD配置
  40. #define RS_CLR RS = 0
  41. #define RS_SET RS = 1

  42. #define RW_CLR RW = 0
  43. #define RW_SET RW = 1

  44. #define EN_CLR EN = 0
  45. #define EN_SET EN = 1

  46. #define DataPort P0  //LCD1602 数据端口
  47. /*-----------------------------------------
  48.                 判断忙信号函数
  49. ------------------------------------------*/
  50. void LCD_Check_Busy(void)
  51. {
  52.      DataPort= 0xFF;
  53.      RS_CLR;
  54.      RW_SET;
  55.      EN_CLR;
  56. //     _nop_();
  57.      EN_SET;
  58.      while(DataPort & 0x80); //等待忙完
  59.      EN_CLR;   //保持时间
  60. }
  61. /*-----------------------------------------
  62.                 写入命令函数
  63. ------------------------------------------*/
  64. void LCD_Write_Com(unsigned char com,bit flag)
  65. {

  66.     if(flag == 1) LCD_Check_Busy(); //忙则等待        
  67.     RS_CLR;
  68.     RW_CLR;
  69.     EN_SET;
  70.     DataPort = com;
  71. //    _nop_();    //一个指令周期;
  72.     EN_CLR;   
  73. }
  74. /*-----------------------------------------
  75.                 写入数据函数
  76. ------------------------------------------*/
  77. void LCD_Write_Data(unsigned char Data,bit flag)
  78. {

  79.     if(flag == 1) LCD_Check_Busy(); //忙则等待
  80.     RS_SET;
  81.     RW_CLR;
  82.     EN_SET;
  83.     DataPort = Data;
  84. //    _nop_();    //一个指令周期;
  85.     EN_CLR;   
  86. }
  87. /*-----------------------------------------
  88.                 清屏函数
  89. ------------------------------------------*/
  90. void LCD_Clear(void)
  91. {
  92.     LCD_Write_Com(0x01,1);
  93.     delay_nms(5);
  94. }
  95. /*-----------------------------------------
  96.                 初始化函数
  97. ------------------------------------------*/
  98. void LCD_Init(void)
  99. {
  100.     delay_nms(15);
  101.     LCD_Write_Com(0x38,0);  /*显示模式设置*/
  102.     delay_nms(5);
  103.     LCD_Write_Com(0x38,0);
  104.     delay_nms(5);
  105.     LCD_Write_Com(0x38,0);
  106.     delay_nms(5);

  107.     LCD_Write_Com(0x38,1);
  108.     LCD_Write_Com(0x08,1); /*显示关闭*/
  109.     LCD_Write_Com(0x01,1); /*显示清屏*/      
  110.     LCD_Write_Com(0x06,1);  /*显示光标移动设置*/
  111.     delay_nms(5);
  112.     LCD_Write_Com(0x0C,1);  /*显示开及光标设置*/
  113. }
  114. /*-----------------------------------------------------------------------
  115.                 写入字符
  116. ------------------------------------------------------------------------*/
  117. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  118. {
  119.     if(y == 0)
  120.     {
  121.         LCD_Write_Com(0x80 + x,1);
  122.     }
  123.     else
  124.     {
  125.         LCD_Write_Com(0x80 + 0x40 + x,1);
  126.     }
  127.        LCD_Write_Data(Data,1);
  128. }
  129. /*-----------------------------------------------------------------------
  130.                 写入字符串
  131. ------------------------------------------------------------------------*/
  132. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  133. {
  134.     if(y == 0)
  135.     {
  136.         LCD_Write_Com(0x80 + x,1);
  137.     }
  138.     else
  139.     {
  140.         LCD_Write_Com(0x80 + 0x40 + x,1);
  141.     }
  142.     while(*s)
  143.     {
  144.         LCD_Write_Data(*s,1);
  145.         s++;
  146.     }   
  147. }

  148. //封装一个下降沿的判断
  149. //uint XIAODOU(bit key)
  150. //{
  151. //    if(key==0)//哪个键按下就有对应的返回,对应的动作
  152. //    {
  153. //        delay_nms(10);
  154. //        if(key==0)//按下判断两次
  155. //        {
  156. //             delay_nms(50);
  157. //            if(key==1)
  158. //            {
  159. //                delay_nms(10);
  160. //                if(key==1)//松开判断两次
  161. //                {
  162. //                    return 1;   
  163. //                }
  164. //               
  165. //            }
  166. //        }
  167. //
  168. //   
  169. //    }
  170. //    else return 0;
  171. //}
  172. uint JDG(void)
  173. {
  174.     if(P5key==0)//哪个键按下就有对应的返回,对应的动作
  175.     {
  176.         delay_nms(10);
  177.         if(P5key==0)//按下判断两次
  178.         {
  179.              delay_nms(50);
  180.             if(P5key==1)
  181.             {
  182.                 delay_nms(10);
  183.                 if(P5key==1)//松开判断两次
  184.                 {
  185.                     keybuff=5;//确定按下了
  186.                     return 5;   
  187.                 }
  188.                
  189.             }
  190.         }
  191.     }
  192.     else if(P8key==0)//哪个键按下就有对应的返回,对应的动作
  193.     {
  194.         delay_nms(10);
  195.         if(P8key==0)//按下判断两次
  196.         {
  197.              delay_nms(50);
  198.             if(P8key==1)
  199.             {
  200.                 delay_nms(10);
  201.                 if(P8key==1)//松开判断两次
  202.                 {
  203.                     keybuff=8;//确定按下了
  204.                     return 8;   
  205.                 }
  206.                
  207.             }
  208.         }   
  209.     }
  210.     else if(P6key==0)//哪个键按下就有对应的返回,对应的动作
  211.     {
  212.         delay_nms(10);
  213.         if(P6key==0)//按下判断两次
  214.         {
  215.              delay_nms(50);
  216.             if(P6key==1)
  217.             {
  218.                 delay_nms(10);
  219.                 if(P6key==1)//松开判断两次
  220.                 {
  221.                     keybuff=6;//确定按下了
  222.                     return 6;   
  223.                 }
  224.                
  225.             }
  226.         }   
  227.     }
  228.     else if(P1key==0)//哪个键按下就有对应的返回,对应的动作
  229.     {
  230.         delay_nms(10);
  231.         if(P1key==0)//按下判断两次
  232.         {
  233.              delay_nms(50);
  234.             if(P1key==1)
  235.             {
  236.                 delay_nms(10);
  237.                 if(P1key==1)//松开判断两次
  238.                 {
  239.                     keybuff=1;//确定按下了
  240.                     return 1;   
  241.                 }
  242.                
  243.             }
  244.         }

  245.     }
  246.     else if(P2key==0)//哪个键按下就有对应的返回,对应的动作
  247.     {
  248.         delay_nms(10);
  249.         if(P2key==0)//按下判断两次
  250.         {
  251.              delay_nms(50);
  252.             if(P2key==1)
  253.             {
  254.                 delay_nms(10);
  255.                 if(P2key==1)//松开判断两次
  256.                 {
  257.                     keybuff=2;//确定按下了
  258.                     return 2;   
  259.                 }
  260.                
  261.             }
  262.         }

  263.     }
  264.     else if(P3key==0)//哪个键按下就有对应的返回,对应的动作
  265.     {
  266.         delay_nms(10);
  267.         if(P3key==0)//按下判断两次
  268.         {
  269.              delay_nms(50);
  270.             if(P3key==1)
  271.             {
  272.                 delay_nms(10);
  273.                 if(P3key==1)//松开判断两次
  274.                 {
  275.                     keybuff=3;//确定按下了
  276.                     return 3;   
  277.                 }
  278.                
  279.             }
  280.         }

  281.     }
  282.     else if(P4key==0)//哪个键按下就有对应的返回,对应的动作
  283.     {
  284.         delay_nms(10);
  285.         if(P4key==0)//按下判断两次
  286.         {
  287.              delay_nms(50);
  288.             if(P4key==1)
  289.             {
  290.                 delay_nms(10);
  291.                 if(P4key==1)//松开判断两次
  292.                 {
  293.                     keybuff=4;//确定按下了
  294.                     return 4;   
  295.                 }
  296.                
  297.             }
  298.         }

  299.     }
  300.     else if(P7key==0)//哪个键按下就有对应的返回,对应的动作
  301.     {
  302.         delay_nms(10);
  303.         if(P7key==0)//按下判断两次
  304.         {
  305.              delay_nms(50);
  306.             if(P7key==1)
  307.             {
  308.                 delay_nms(10);
  309.                 if(P7key==1)//松开判断两次
  310.                 {
  311.                     keybuff=7;//确定按下了
  312.                     return 7;   
  313.                 }
  314.                
  315.             }
  316.         }

  317.     }
  318.     else return 0;//没有键按下
  319. }
  320. void main()
  321. {
  322.     uint i=1;
  323.     uint know=0;
  324.     uchar k='0';
  325.     char words[10][5]={"","","","","","","","","",""};
  326.     LCD_Init(); //初始化LCD1602液晶
  327.     LCD_Clear();//显示清零

  328.     while(1)
  329.     {
  330.       caption:
  331.      LCD_Write_String(3,0,"WORDS TEST");

  332.      LCD_Write_String(6,1,"Cy");

  333.      while(JDG()==0);//按键没有触发的时候暂停在这里
  334.      LCD_Clear();
  335.      switch (keybuff)
  336.      {
  337.          case 1 : //按1进入背单词界面
  338.         {
  339.             
  340.              for(;i<=10;)//i在0~10在这个循环执行
  341.             {
  342.             
  343.                 LCD_Write_String(0,0,table[0][i-1]);
  344.                 LCD_Write_String(0,1,"known or unknown");
  345.                 while(JDG()==0);//有按键触发才往下执行
  346.                 switch (keybuff)
  347.                 {
  348.                     case 1:
  349.                     {
  350.                         know++;
  351.                         LCD_Clear();
  352.                         LCD_Write_String(0,1,"known");
  353.                         while(JDG()!=5&&JDG()!=6);//按键5或6没有按下就停住
  354.                         if(keybuff==5){goto last;} else if(keybuff==6){goto next;}
  355.                     } break;
  356.                     case 2:
  357.                     {
  358.                          LCD_Clear();
  359.                         LCD_Write_String(0,1,"unknown");
  360.                         while(JDG()!=5||JDG()!=6);
  361.                         if(keybuff==5){goto last;} else if(keybuff==6){goto next;}
  362.                     }break;
  363.                     case 6:
  364.                     {
  365.                          next:
  366.                         i++;
  367.                     } break;
  368.                     case 5:
  369.                     {
  370.                          last:
  371.                         i--;
  372.                     } break;

  373.                 }
  374.                 LCD_Clear();
  375.             }
  376.             
  377.             k=k+know;//0加上知道的数
  378.             LCD_Clear();
  379.             LCD_Write_String(0,0,"correct rate:");
  380.             LCD_Write_Char(0,1,k);
  381.             LCD_Write_String(1,1,"0%");
  382.             while(JDG()!=8);//按8回退到标题界面
  383.             LCD_Clear();
  384.             i=1;//回到标题需要对重置标志量
  385.             know=0;
  386.             k='0';
  387.             goto caption;
  388.          }   break;
  389.         
  390.         
  391.         
  392.         case 5 : //按5到写入界面
  393.         {
  394.             load:
  395.              LCD_Write_String(0,0,"LOAD");
  396.             while(JDG()==0); //任意按键按下有动作
  397.             if (keybuff==8)    //同时是否判断按P8退出到标题界面,其他键则继续写入
  398.             {
  399.                 LCD_Clear();
  400.                 goto caption;
  401.             }
  402.             LCD_Clear();
  403.             LCD_Write_String(0,0,"a~g"); //在第一行输入四个区域的字母
  404.             LCD_Write_String(4,0,"h~n");
  405.             LCD_Write_String(8,0,"o~t");
  406.             LCD_Write_String(12,0,"u~z");
  407.             while(JDG()==0);
  408.             if (keybuff==8)    //同时是否判断按P8退出到上个界面
  409.             {
  410.                 LCD_Clear();
  411.                 goto load;
  412.             }            
  413.             switch(keybuff)
  414.             {
  415.                 case 1 :
  416.                 {
  417.                     LCD_Clear();
  418.                     LCD_Write_String(0,0,"abcdefg");
  419.                     //for()
  420.                     {
  421.                     
  422.                     }        
  423.                 }   
  424.             
  425.             
  426.             
  427.             }
  428.             LCD_Clear();
  429.          } break;
  430.         case 6 :
  431.         {
  432.             
  433.              LCD_Write_String(0,1,"hijklmn");while(JDG()!=6);LCD_Clear();
  434.          }break;

  435.      }


  436.          
  437.     }
  438.         
  439. }
复制代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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