⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdkey.txt

📁 LCD与键盘的系统
💻 TXT
字号:
#include <reg51.h>
#include "LCDKEY.h"


void LCD_Send_Byte(const uchar, const bit) ;
void LCD_SetDDRAM(uchar);  
void LCD_Delay(void);
void LCD_Updata(void);

char LCD_data_G[LCD_LINES][LCD_CHARACTERS+1];

#define OSC_FREQ (12000000UL)
#define OSC_PER_INST (12)

void Hardware_Delay_T0(uint N)//延迟Nus
{
#define PRELOAD01  (65536 - (uint)(OSC_FREQ / (OSC_PER_INST * 20000)))    
#define PRELOAD01H (PRELOAD01 / 256)
#define PRELOAD01L (PRELOAD01 % 256)
uint us;
   
  
   TMOD &= 0xF0; 
   TMOD |= 0x01; 

   ET0 = 0;  

   
   for (us = 0; us < N; us++)
      {                 
      TH0 = PRELOAD01H;  
      TL0 = PRELOAD01L;   

      TF0 = 0;          
      TR0 = 1;          

      while (TF0 == 0);

      TR0 = 0;         
      }
 }


void LCD_Send_Byte(const uchar DATA, const bit DATA_FLAG) //发送字节
   {
   
   LCD_D4 = 0;
   LCD_D5 = 0;
   LCD_D6 = 0;
   LCD_D7 = 0;
   LCD_RS = DATA_FLAG; 
   LCD_EN = 0;
   LCD_Delay();

  
   LCD_D4 = ((DATA & 0x10) == 0x10);
   LCD_D5 = ((DATA & 0x20) == 0x20);
   LCD_D6 = ((DATA & 0x40) == 0x40);
   LCD_D7 = ((DATA & 0x80) == 0x80); 

   LCD_Delay();
   LCD_EN = 1; 
   LCD_Delay();
   LCD_EN = 0;
   LCD_Delay();
   LCD_D4 = 0;
   LCD_D5 = 0;
   LCD_D6 = 0;
   LCD_D7 = 0;
   LCD_RS = DATA_FLAG;
   LCD_EN = 0;
   LCD_Delay();

   LCD_D4 = ((DATA & 0x01) == 0x01);
   LCD_D5 = ((DATA & 0x02) == 0x02);
   LCD_D6 = ((DATA & 0x04) == 0x04);
   LCD_D7 = ((DATA & 0x08) == 0x08);

   LCD_Delay();
   LCD_EN = 1;
   LCD_Delay();
   LCD_EN = 0;
   LCD_Delay();   
   } 




void LCD_SetDDRAM(uchar ADDRESS) //设置DDRAM的地址
   {
   ADDRESS |= 0x80;
   LCD_Send_Byte(ADDRESS,0);
   }

// Set cursor to a defined place
void LCD_Control_Cursor(const bit VISIBLE, const bit BLINKING, 
                         uchar X, uchar Y) 
   {
  
   uchar Command = 0x0C;  
   uchar ADDRESS;

   if (VISIBLE) 
      {
      Command |= 0x02;
      }

   if (BLINKING) 
      {
      Command |= 0x01;
      }

   LCD_Send_Byte(Command,0);
   switch(X)
   { 
    case 0: ADDRESS=0x80; break;
    case 1: ADDRESS=0x90; break;
    case 2: ADDRESS=0x88; break;
    case 3: ADDRESS=0x98; break;
    default:break;
 }
 ADDRESS=Y+ADDRESS;
   LCD_SetDDRAM(ADDRESS);
   }

void LCD_Delay(void)   
   {
   int x;

   x++;
   x++;
   x++;
   }     
 
void DisplaceOneWord(uchar X,uchar Y,uint W)  //在指定坐标显示汉字
{
 uchar Disp_A, A_H;
 switch(X)
  { 
 case 0: A_H=0x80; break;
 case 1: A_H=0x90; break;
 case 2: A_H=0x88; break;
 case 3: A_H=0x98; break;
 default:break;
 }
 Disp_A=Y+A_H;
 LCD_SetDDRAM(Disp_A);
 LCD_Send_Byte(((W&0xff00)>>8)&0xff,1);
 LCD_Send_Byte(W&0xff,1);
}
   

void LCD_Init(void)
   {
   uchar loop;
   Hardware_Delay_T0(10);  

   // 设置端口
   LCD_D4 = 1;
   LCD_D5 = 1;
   LCD_D6 = 1;
   LCD_D7 = 1;

   LCD_RS = 1;
   LCD_EN = 1;    

   Hardware_Delay_T0(10);  

   LCD_RS = 0;
   LCD_EN = 0;    

   
   Hardware_Delay_T0(100);

   // 发送三次
   for (loop = 0; loop < 3; loop++)
      {
      // 4-bit总线 2行 5*8点阵
      LCD_Send_Byte(0x20,0);  
      Hardware_Delay_T0(1);
      }

   LCD_Send_Byte(0x08,0); 
   Hardware_Delay_T0(1);

   
   LCD_Send_Byte(0x01,0); 
   Hardware_Delay_T0(1);
   
   LCD_Control_Cursor(0,0,0,0);
   Hardware_Delay_T0(1);

   // 清屏
   LCD_Send_Byte(0x01,0); 
   Hardware_Delay_T0(1);
   
   LCD_Send_Byte(0x06,0); 
   Hardware_Delay_T0(1);

  
   LCD_Send_Byte(0x0C,0);
   Hardware_Delay_T0(1);
   }


void Clear_Line(uint a)  //清除显示
{
 DisplaceOneWord(a,0,0xa1a0);
 DisplaceOneWord(a,1,0xa1a0);
 DisplaceOneWord(a,2,0xa1a0);
 DisplaceOneWord(a,3,0xa1a0);
 DisplaceOneWord(a,4,0xa1a0);
 DisplaceOneWord(a,5,0xa1a0);
 DisplaceOneWord(a,6,0xa1a0);
 DisplaceOneWord(a,7,0xa1a0);
}

uint KeyDown(void)
{
   col1=0; col2=0; col3=0; col4=0;                         // 列线全部置低
  
   if((row1==0) || (row2==0) || (row3==0) || (row4==0))      // 若有任一行线读回状态为低
    {
      Hardware_Delay_T0(2);                                             // 延时消抖
      if((row1==0) || (row2==0) || (row3==0) || (row4==0))   // 再次读行线状态,若有任一行线读回状态为低
        return 1;                 // 返回1,表明有键盘按下
      else
        return 0;                    // 返回0,表明无键盘按下
} 
   else 
     return 0;     
}



/********************************************************************************************
* 函数名称:KeyNum()
* 功     能:检测用户按下的键盘所对应的键盘号
* 入口参数:无
* 出口参数:返回0表示没有键盘被按动,返回1~16对应被按动的键盘
* 说     明:用户可根据自己的键盘编号修改该函数。
*********************************************************************************************/
uint KeyNum(void)
{

   uint KeyTemp;
  
   KeyTemp=0;

   if(KeyDown()==1)                                          // 若键盘被按下
    {
      col1=0; col2=1; col3=1; col4=1;       // 将列线1置低,其他列线置高
     
      if (row1==0) KeyTemp=0;          // 若行线1读回状态为低,则表明按键1被按下
      if (row2==0) KeyTemp=1;                               // 若行线2读回状态为低,则表明按键5被按下
      if (row3==0) KeyTemp=2;          // 若行线3读回状态为低,则表明按键9被按下
      if (row4==0) KeyTemp=3;          // 若行线4读回状态为低,则表明按键13被按下
     
      col1=1; col2=0; col3=1; col4=1;                // 将列线2置低,其他列线置高
      
      if (row1==0) KeyTemp=4;                                 // 若行线1读回状态为低,则表明按键2被按下
      if (row2==0) KeyTemp=5;                               // 若行线2读回状态为低,则表明按键6被按下
      if (row3==0) KeyTemp=6;                      // 若行线3读回状态为低,则表明按键10被按下
      if (row4==0) KeyTemp=7;            // 若行线4读回状态为低,则表明按键14被按下
     
      col1=1; col2=1; col3=0; col4=1;
     
      if (row1==0) KeyTemp=8; 
      if (row2==0) KeyTemp=9; 
      if (row3==0) KeyTemp=10; 
      if (row4==0) KeyTemp=11;    
     
      col1=1; col2=1; col3=1; col4=0;
     
      if (row1==0) KeyTemp=12; 
      if (row2==0) KeyTemp=13; 
      if (row3==0) KeyTemp=14; 
      if (row4==0) KeyTemp=15;
      
      return KeyTemp;                                        // 返回被按下并被释放的键盘的编号 

     }
   else
       return 0;
}

void Key_Displace(void)
{
 static int D=-1;
 static uint L=0;
 static uint N=0;
 uint HEX=0xa3b0;
 switch(KeyNum()){
   case 7:  DisplaceOneWord(0,0,0xbba2);
            DisplaceOneWord(0,1,0xa3b0);
            DisplaceOneWord(0,2,0xa3b0);
            DisplaceOneWord(0,3,0xa3b0);
			break;
   case 8:  DisplaceOneWord(1,0,0xcdc3);
            DisplaceOneWord(1,1,0xa3b0);
            DisplaceOneWord(1,2,0xa3b0);
            DisplaceOneWord(1,3,0xa3b0);
			break;
   case 9:  DisplaceOneWord(2,0,0xc2ed);
            DisplaceOneWord(2,1,0xa3b0);
            DisplaceOneWord(2,2,0xa3b0);
            DisplaceOneWord(2,3,0xa3b0);
			break;
   case 10: DisplaceOneWord(3,0,0xd1f2);
            DisplaceOneWord(3,1,0xa3b0);
            DisplaceOneWord(3,2,0xa3b0);
            DisplaceOneWord(3,3,0xa3b0);
			break;
   case 2:  
            if(D<=3)
            {
            D=D+1;
            LCD_Control_Cursor(0,1,D,0);
			L=0;
            }
	        else D=0;
	        break;
   case 3:  if(D>0)
            { 
            D=D-1;
            LCD_Control_Cursor(0,1,D,0);
			L=0;
			}
            break;
   case 12: if(L<3)
            {
			 L=L+1;
             LCD_Control_Cursor(0,1,D,L);
             N=0;
			}
			break;
   case 13: if(L>1)
            {
			 L=L-1;
             LCD_Control_Cursor(0,1,D,L);
             N=0;
			}
			break;
   case 4:  if(N>0,L!=0)
            {
			 N=N+1;
			 HEX=HEX+N;
             DisplaceOneWord(D,L,HEX);
             LCD_Control_Cursor(0,1,D,L);
            }
			break;
   case 5:  if(N<9,L!=0)
            {
			 N=N-1;
			 HEX=HEX+N;
             DisplaceOneWord(D,L,HEX);
             LCD_Control_Cursor(0,1,D,L);
            }
			break;
   case 15: LCD_Control_Cursor(0,0,D,L);
            D=-1;
			L=0;
            break;
   case 14: DisplaceOneWord(0,1,0xa3b0);
            DisplaceOneWord(0,2,0xa3b0);
            DisplaceOneWord(0,3,0xa3b0);
            DisplaceOneWord(1,1,0xa3b0);
            DisplaceOneWord(1,2,0xa3b0);
            DisplaceOneWord(1,3,0xa3b0);
            DisplaceOneWord(2,1,0xa3b0);
            DisplaceOneWord(2,2,0xa3b0);
            DisplaceOneWord(2,3,0xa3b0);
            DisplaceOneWord(3,1,0xa3b0);
            DisplaceOneWord(3,2,0xa3b0);
            DisplaceOneWord(3,3,0xa3b0);
			break;
			   }             
}




   
    
  


void main(void)
{
 LCD_Init();
 DisplaceOneWord(0,0,0xbbb6);
 DisplaceOneWord(0,1,0xd3ad);
 Hardware_Delay_T0(20);
 Clear_Line(0);
 while(1)
 {
  Key_Displace();

 }
}

 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -