msp430:不明白我设计的1602与按键程序字母为什么有空格

2019-07-15 17:44发布

/********************************************************************
//DM430-L型开发板控制1602液晶模块显示测试程序,显示欢迎信息
//直接将1602插入1602接口即可,正面朝内,位于主板上方1x16接口
//注意选择液晶的电源,位于电位器附近,可选5V或3.3V,根据液晶电压进行选择,默认5V
//调试环境:EW430 V5.30
//作者:www.avrgcc.com
//时间:2014.03.03
//效果:
//按键1:显示:hello world!    Good Luck!   www.goole.com
//按键2:显示: Good Luck!   www.goole.com
//按键3:显示: www.goole.com
********************************************************************/
#include <msp430x14x.h>
#include "Config.h"
uchar key;
//*************************************************************************
//                        初始化IO口子程序
//*************************************************************************
void Port_init()
{

        P4SEL = 0x00;
        P4DIR = 0xFF;                   //数据口输出模式
        P5SEL = 0x00;
        P5DIR|= BIT1 + BIT6 + BIT7;     //控制口设置为输出模式
}

//***********************************************************************
//        显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{       
        RS_CLR;
        RW_CLR;
        EN_SET;
        DataPort = com;                 //命令写入端口
        delay_ms(5);
        EN_CLR;
}

//***********************************************************************
//        显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
        RS_SET;
        RW_CLR;
        EN_SET;
        DataPort = data;                //数据写入端口
        delay_ms(5);
        EN_CLR;
}

//***********************************************************************
//        显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
        LCD_write_com(0x01);            //清屏幕显示
        delay_ms(5);
}

//***********************************************************************
//        显示屏字符串写入函数
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
       
    if (y == 0)
    {
            LCD_write_com(0x80 + x);        //第一行显示
    }
    else
    {
            LCD_write_com(0xC0 + x);        //第二行显示
    }

    while (*s)
    {
            LCD_write_data( *s);
            s ++;
    }
}

//***********************************************************************
//        显示屏单字符写入函数
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{
       
    if (y == 0)
    {
            LCD_write_com(0x80 + x);        //第一行显示
    }
    else
    {
            LCD_write_com(0xC0 + x);        //第二行显示
    }

    LCD_write_data( data);  
}

//***********************************************************************
//        显示屏初始化函数(复位)
//***********************************************************************
void LCD_init(void)
{
    LCD_write_com(0x38);                //显示模式设置  
    delay_ms(50);
    LCD_write_com(0x08);                //显示关闭
    delay_ms(50);
    LCD_write_com(0x01);                //显示清屏
    delay_ms(50);
    LCD_write_com(0x06);                //显示光标移动设置
    delay_ms(50);
    LCD_write_com(0x0C);                //显示开及光标设置
    delay_ms(50);
}



//********************************************
//显示屏初始化函数
//********************************************

void first_display(void)                  //ex1显示
{
  LCD_write_str(0,0,"Good Luck!");
}
void second_display(void)                 //ex2显示        
{
  uchar i,*p;  //i控制第几行显示
i = 1;
p = "www.goole.com";  
while (*p)
    {

        LCD_write_char(i,0,*p);     
        i ++;
        p ++;
        delay_ms(100);               //延时100ms
    }
}
void third_display(void)                //ex3显示
{
uchar j,*q;
j = 1;
q ="hello world!";
//q = "564654";
        while (*q)
        {
        LCD_write_char(j,1,*q);
        j ++;      //j控制第几行显示
        q ++;
        delay_ms(100);
         }
}




//**********************************************************************
//        键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************

uchar Key_Scan(void)
{
  uchar key_check;
  uchar key_checkin;
  key_checkin=KeyPort;                  //读取IO口状态,判断是否有键按下
  key_checkin&= 0x0F;                          //读取IO口状态,判断是否有键按下
  if(key_checkin!=0x0F)                    //IO口值发生变化则表示有键按下
    {
      delay_ms(20);                          //键盘消抖,延时20MS
      key_checkin=KeyPort;
      if(key_checkin!=0x1F)
        {  
          key_check=KeyPort;
          switch (key_check & 0x0F)
            {
              case 0x0E:key=1;break;
              case 0x0D:key=2;break;
              case 0x0B:key=3;break;
             case 0x07:key=4;break;
            }

        }

   }
  else
   {
     key=0xFF;        
   }
  return key;
}

//***********************************************************************
//     键值显示程序
//***********************************************************************
void LCD_DisplayKey(uchar keynum)
{   
  LCD_write_char(0x0e,1,0x30+keynum);
}


void main(void)
{
     WDT_Init();                         //看门狗设置
     Clock_Init();                       //系统时钟设置
     Port_init();                        //系统初始化,设置IO口属性
     delay_ms(100);                      //延时100ms
     LCD_init();                         //液晶参数初始化设置
     LCD_clear();
    while(1)
    {
     // LCD_clear();此处写这句会花屏
      Key_Scan();                     //键盘扫描,看是否有按键按下
      if(key!=0xff)                   //如果有按键按下,则显示该按键键值1~4
        {
          {
            switch(key)
              {
               // case 1: first_display();     //给不同的键赋键值
               // case 2: third_display();      //给不同的键赋键值
                   //delay_ms(250);
               case 3:second_display();//break;//给不同的键赋键值
                  delay_ms(250);        
             //Key_Scan();
              }
          }
       }
     else
      {
        //LED=key;                      //没有按键的时候显示上次的键值
      }
    }
}







2.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。