/********************************************************************
//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; //没有按键的时候显示上次的键值
}
}
}
-
函数功能应该没问题,因为我把按键去掉,即只是实现滚屏显示,就没有空格了
一周热门 更多>