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

📄 lcd显示主程序.c

📁 利用MSP430F149和HG192646液晶模块显示心电波形和各种字符
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************\
 文件名称: LCD(430)
 芯片类型:MSP430F149 ,HG192646 液晶模块
 开发软件:IAR Embedded Workbench 4.0,Windows XP
 程序功能:LCD显示程序(显示字符和波形 )

\***************************************************************************/ 
/***************************************************************************\
 液晶屏分为4行*12列汉字,全部使用模拟接口方式。
 连线图:
 *DB0---P2.0*       *DB4---P2.4*        *REST---P1.2*        *R/W---P1.6
 *DB1---P2.1*       *DB5---P2.5*        *CS2----P1.3*        *E-----P1.7
 *DB2---P2.2*       *DB6---P2.6*        *CS1----P1.4*      
 *DB3---P2.3*       *DB7---P2.7*        *RS-----P1.5*                                                                         *
\***************************************************************************/

//头文件
#include <msp430x16x.h> 
#include <math.h>

// 宏定义
#define  DISPON      0x3f                          // 显示on  
#define  DISPOFF     0x3e                          // 显示off  
#define  DISPFIRST   0xc0                          // 显示起始行定义 
#define  SETX        0x40                          // X定位设定指令(列) 
#define  SETY        0xb8                          // Y定位设定指令(页) 
#define  Lcdbusy     0x80                          // LCM忙判断位  
#define  MODL        0x00                          // 左区边界 
#define  MODM        0x40                          // 左区和中区分界 
#define  MODR        0x80                          // 中区和右区分界 
#define LCMLIMIT     0xC0                          // 右区边界 

// 全局变量描述
unsigned char col,row,cbyte;                       // 列x,行(页)y,输出数据 
unsigned char xy;                                  // 画线方向标志:0 垂直 1 水平 

// 函数声明
void InitCLK(void);                                // 时钟初始化
void InitPort(void);                               // 端口初始化
void Lcminit(void);                                // 液晶模块初始化 
void Delay(unsigned char MS);                      // 延时,入口数为Ms 
void lcdbusyL(void);                               // busy判断、等待(左区) 
void lcdbusyM(void);                               // busy判断、等待(中区) 
void lcdbusyR(void);                               // busy判断、等待(右区) 
void Putedot(unsigned char Order);                 // 半角字符输出  
void Putcdot(unsigned char Order);                 // 全角(汉字)输出 
void Wrdata(unsigned char X);                      // 数据输出给LCM  
void Lcmcls(void);                                 // LCM全屏幕清零(填充0) 
void wtcom(void);                                  // 公用busy等待  
void Locatexy(void);                               // 光标定位  
void WrcmdL(unsigned char X);                      // 左区命令输出  
void WrcmdM(unsigned char X);                      // 中区命令输出  
void WrcmdR(unsigned char X);                      // 右区命令输出  
void Putstr(unsigned char *puts,unsigned char i);  // 中英文字符串输出 
void Rollscreen(unsigned char x);                  // 屏幕向上滚动演示 
void Rddata(void);                                 // 从液晶片上读数据 
void Linehv(unsigned char length);                 // 横(竖)方向画线 
void point(void);                                  // 打点   
void Linexy(unsigned char endx,unsigned char endy);// 画斜线

// 数组列表
unsigned char Ezk[];                               // ASCII常规字符点阵码表 
unsigned char Hzk[];                               // 自用汉字点阵码表 
unsigned char STR1[];                              // 自定义字符串  
unsigned char STR2[];  
unsigned char STR3[];  
unsigned char STR4[];  


/***************************************************************************
 主程序
***************************************************************************/ 
void main(void)
{unsigned char x;
 InitCLK();                                       // 时钟初始化
 InitPort();                                      // 端口初始化
 col=0;
 row=0;
 Delay(30);                                       // 延时大约40Ms,等待外设准备好 
 Lcminit();                                       // 液晶模块初始化,包括全屏幕清屏
 Putstr(STR2,24);                                 // 第一行字符输出,24字节 
 col=0;
 row=2;
 Putstr(STR1,12);                                 // 第二行字符输出,12字节 
 col=0;
 row=4;
 Putstr(STR3,24);                                 // 第三行字符输出,24字节 
 col=0;
 row=6;
 Putstr(STR4,24);                                 // 第四行字符输出,12字节 
 col=0;
 row=0;
 xy = 1;                                          // 方向标志。定为水平方向 
 Linehv(192);                                     // 画一条横线(0,0)-(191,0) 
 col=0;
 row=15;
 xy = 1;
 Linehv(192);                                     // 画一条横线(0,15)-(191,15) 
 col=0;
 row=32;
 xy = 1;
 Linehv(192);                                     // 画一条横线(0,32)-(191,32) 
 col=0;
 row=1;
 xy = 0;                                          // 方向标志。定为垂直方向 
 Linehv(31);                                      // 画一条竖线(0,1)-(0,31) 
 col=191;
 row=1;
 xy = 0;
 Linehv(31);                                      // 画一条竖线(191,1)-(191,31) 
 col=0;                                           // 设定斜线的起点坐标  
 row=63;
 Linexy(44,31);                                   // 画一段斜线(0,63)-(44,31) 
 col=44;
 row=31;
 Linexy(190,62);                                  // 继续画斜线(44,31)-(191,63) 
 while(1)
 {
  Rollscreen(x);                                  // 定位新的起始行
  x++;
  x %=8;
  Delay(70);                                      // 延时,控制滚动速度
 };
}

/***************************************************************************
 画线。任意方向的斜线,不支持垂直的或水平线 
***************************************************************************/ 
void Linexy(unsigned char endx,unsigned char endy)
{register unsigned char t;
 int xerr=0,yerr=0,delta_x,delta_y,distance;
 signed char incx,incy;

/*  compute the distance in both directions */
 delta_x=endx-col;
 delta_y=endy-row;

/* compute  the direction of the increment ,
 an increment of "0" means either a vertical or horizontal lines */

 if(delta_x>0) 
 incx=1;
 else if( delta_x==0 )
 incx=0;
 else 
 incx=-1;

 if(delta_y>0) 
 incy=1;
 else if( delta_y==0 )
 incy=0;
 else 
 incy=-1;

/*  determine which distance is greater */
 delta_x = fabs(delta_x);
 delta_y = fabs(delta_y);

 if( delta_x > delta_y ) 
 distance=delta_x;
 else 
 distance=delta_y;

/* draw the line */
 for( t=0;t <= distance+1; t++ ) 
 {point();
  xerr += delta_x ;
  yerr += delta_y ;
  if( xerr > distance ) 
  {xerr-=distance;
   col+=incx;
  }
  if( yerr > distance ) 
  {yerr-=distance;
   row+=incy;
  }
 }
}

/***************************************************************************
 画线。只提供X或Y方向的,不支持斜线 
***************************************************************************/
void Linehv(unsigned char length)
{unsigned char xs,ys;
 if (xy)
 {ys = col;
  for (xs=0;xs<length;xs++)
  {col = ys + xs;
   point();
  }
 }
 else 
 {xs = row;
  for (ys=0;ys<length;ys++)
  {row = xs + ys;
   point();
  }
 }
}

/***************************************************************************
 画点
***************************************************************************/
void point(void)
{unsigned char x1,y1,x,y;
 x1=col;
 y1=row;
 row=y1>>3;                                        // 取Y方向分页地址 
 Rddata();
 y=y1&0x07;                                        // 字节内位置计算 
 x=0x01;
 x=x<<y;                                           // 移入所画点  
 Wrdata(cbyte|x);                                  // 画上屏幕  
 col=x1;                                           // 恢复xy坐标  
 row=y1;
}

/***************************************************************************
 屏幕滚动定位
***************************************************************************/
void Rollscreen(unsigned char x)
{cbyte = DISPFIRST|x;                              // 定义显示起始行
 WrcmdL(cbyte);
 WrcmdM(cbyte);
 WrcmdR(cbyte);
}

/***************************************************************************
 一个字串的输出
***************************************************************************/
void Putstr(unsigned char *puts,unsigned char i)
{unsigned char j,X;
 for (j=0;j<i;j++)
 {X = puts[j];
  if (X&0x80)
  {Putcdot(X&0x7f);                                // 只保留低7位*/
  }
  else 
  Putedot(X-0x20);                                 // ascii码表从0x20开始
  }
}

/***************************************************************************
 半角字符点阵码数据输出
***************************************************************************/
void Putedot(unsigned char Order)
{unsigned char i,bakerx,bakery;                   // 共定义4个局部变量   
 int x;                                           // 偏移量,字符量少的可以定义为UCHAR 
 bakerx = col;                                    // 暂存x,y坐标,已备下半个字符使用 
 bakery = row;
 x=Order * 0x10;                                  // 半角字符,每个字符16字节 
 
/*上半个字符输出,8列 */
 for(i=0;i<8;i++)
 {cbyte = Ezk[x];                                 // 取点阵码,rom数组 
  Wrdata(cbyte);                                  // 写输出一字节  
  x++;
  col++;
  if (col==LCMLIMIT)
  {col=0;row++;row++;};                           // 下一列,如果列越界换行
  if (row>7) 
  row=0;                                          // 如果行越界,返回首行 
 }                                                // 上半个字符输出结束 
 
/*下半个字符输出,8列 */
 col = bakerx;                                    // 列对齐  
 row = bakery+1;                                  // 指向下半个字符行 
 for(i=0;i<8;i++)
 {cbyte = Ezk[x];                                 // 取点阵码  
  Wrdata(cbyte);                                  // 写输出一字节  
  x++;
  col++;
  if (col==LCMLIMIT){col=0;row=row+2;};           // 下一列,如果列越界换行
  if (row>7) 
  row=1;                                          // 如果行越界,返回首行 
 }                                                // 下半个字符输出结束 
 row=bakery;
}                                                 // 整个字符输出结束 

/***************************************************************************
 全角字符点阵码数据输出
***************************************************************************/
void Putcdot(unsigned char Order)
{unsigned char i,bakerx,bakery;                  // 共定义3个局部变量  
 int x;                                          // 偏移量,字符量少的可以定义为UCHAR 
 bakerx = col;                                   // 暂存x,y坐标,已备下半个字符使用 
 bakery = row;
 x=Order * 0x20;                                 // 每个字符32字节 
 
/*上半个字符输出,16列 */
 for(i=0;i<16;i++)
 {Wrdata(Hzk[x]);                                // 写输出一字节  
  x++;
  col++;
  if (col==LCMLIMIT)
  { col=0;row++;row++;}                          // 下一列,如果列越界换行
   if (row>6) 
   row=0;                                        // 如果行越界,返回首行 
 }                                               // 上半个字符输出结束 
  
/*下半个字符输出,16列 */
 col = bakerx;
 row = bakery+1;

⌨️ 快捷键说明

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