- #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;
- }
-
- }
-
- }
復制代碼 |