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

📄 avrmega8_ssd1815c.c

📁 这是一个采用avr单片机操作显示sst1815液晶模块的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
*代码编号:	0.999.0    
*名称: 		  ATMega8 与 SSD1815液晶的接口演示程序
*创建日期:	2005年3月15日
*创建人:   中友智能工作室  刘忠仁
*模块功能: 
*修改日期: 2005年3月30日
*参考文档:
*芯片型号: AT MEGA8
*芯片设置: 目标MCU:MEGA8    晶振:INT RC 2MHZ 
*联系方式: Liuzhongren81@sohu.com
****************************************************************************/


/*写汉字液晶子程 液晶屏分为4行*8列汉字,全部使用模拟接口方式。
  SSD1815 LCM 接口程序(模拟8080方式) 液晶模块供应商:SOLOMON

;***************************************************************************
;连线图:
;*LCM---MEGA8*  *LCM---MEGA8*   *LCM-------MEGA8*     *LCM----------MEGA8* *
;*DB0---PB.0*   *DB4---PB.4*    *D/I-------PD.4*                           *
;*DB1---PB.1*   *DB5---PB.5*    *WR--------PD.5*                           *
;*DB2---PB.2*   *DB6---PB.6*    *RD--------PD.6*      *RST--------VCC*     * 
;*DB3---PB.3*   *DB7---PB.7*    *CS1-------PD.7*      *CS2----------VCC*   *
;注:AVR ATMEGA8的工作频率为8MHz                                            *
;***************************************************************************/


#define Uchar unsigned char	
#include <iom8v.h>
#include "hzk.h"

/***********液晶显示器接口引脚定义***************/
//sbit CS1lcm= Pd^7;  //
#define CS1lcmON  PORTD|=(1<<7)
#define CS1lcmOFF PORTD&=~(1<<7)

//sbit Dilcm= Pd^6;  //
#define DilcmON  PORTD|=(1<<6)
#define DilcmOFF PORTD&=~(1<<6)

//sbit Wrlcm= Pd^5;  //
#define WrlcmON  PORTD|=(1<<5)
#define WrlcmOFF PORTD&=~(1<<5)

//液晶采用8080系列接口协议
//sbit RD= Pd^4;  //
#define RDlcmON  PORTD|=(1<<4)
#define RDlcmOFF PORTD&=~(1<<4)

  //数据口
#define Datalcm   PORTB

/***********常用操作命令和参数定义***************/
/*显示on  */
#define  DISPON  0xaf 
/*显示off  */
#define  DISPOFF 0xae 
/*显示起始行定义 */
#define  DISPFIRST 0x40
/*定位设定指令(页) */ 
#define  SETP   0xB0 
/*定位设定指令(列)低位字节 */
#define  SETCL  0x00 
/*定位设定指令(列)高位字节 */
#define  SETCH  0x10 

/*LCM忙判断位  */
#define  Lcdbusy 0x80 

/**************显示分区边界位置*****************/
/*左区   */
#define  MODL  0x00 
/*左区和右区分界 */
#define  MODR  0x40 
/*显示区的右边界*/
#define  LCMLIMIT  132 

/****************全局变量定义*******************/
Uchar col,row,cbyte;  /*列x,行(页)y,输出数据 */
Uchar xy;    /*画线方向标志:1水平 */
Uchar gStr[16]={0,0,0,0,0,0},gLength=0;//字符串及其长度

/*****************函数列表**********************/

void Draw1(int Temp,int TimeLeft,int Charged);/*LCD显示模式 界面1*/
void Draw2(int V1,int V2,int V3,int V4);	 /*故障诊断模式 界面2*/
void Draw3(int UsedTimes);                   /*数据检验模式 界面3*/

void IntToStr(int IntData, Uchar DigitN); /*将整型数据转换为字符串,返回字符串的长度*/
void Delay(Uchar);    /*延时,入口数为Ms */

void Lcminit(void);   /*液晶模块初始化 */
void DelayLCM(void);  /*液晶指令延时*/
void lcdbusy(void);   /*busy判断、等待*/

void Putedot(Uchar);  /*半角字符输出  */
void Putcdot(Uchar);  /*全角(汉字)输出 */
void Wrdata(Uchar);   /*数据输出给LCM  */
void Lcmcls( void );  /*LCM全屏幕清零(填充0) */
void Locatexy(void);  /*光标定位  */
void Wrcmd(Uchar);   /*左区命令输出  */
void Putstr(Uchar *puts,Uchar i); /*中英文字符串输出 */
void Rollscreen(Uchar x); /*屏幕向上滚动演示 */
void Rddata(void);  /*  从液晶片上读数据 */
void Linehv(Uchar length); /*横(竖)方向画线 */
void point(void);  /*打点   */
void Linexy(Uchar endx,Uchar endy);  /*画斜线*/
void TestPin(void);/*通用测试模块*/

/****************************************************************************
*代码编号:	1.0.0    
*名称: 		演示主程序
*模块功能: 初始化单片机、液晶屏幕、轮流显示三个界面
*创建日期:	2005年3月16日
*创建人:   阿仁工作室  刘忠仁
*
*修改日期: 2005年3月30日
*参考文档:
****************************************************************************/
void main(void)

{
 Uchar iii;
 
 //OSCCAL=0x7f;
 DDRD=0xF0;	    /* 端口D 高4位输出   控制液晶*/
 PORTD=0x80;	/* Rw=0 Dc=0 E=0 CS1=1*/
 DDRB=0xff;     /* 端口B 输出        控制液晶数据线*/
 PORTB=0xff;

 col=0;
 row=0;

 Delay(40);  /*延时大约40Ms,等待外设准备好 */
 
 Lcminit();  /*液晶模块初始化,包括全屏幕清屏*/
 

//while(1);

 while(1){
    TestPin();  /*指示灯闪烁*/
    
	Lcmcls();   /*清屏幕*/
    Draw1(31,5672,99);  /*显示温度、剩余时间、剩余电量*/
	for(iii=0;iii<10;iii++)
       Delay(200); /*延时,控制滚动速度 */
    
	Lcmcls();   /*清屏幕*/
    Draw2(36,36,225,37);/*显示故障诊断、电池组不平衡、四个电压值*/
    for(iii=0;iii<10;iii++)
      Delay(200); /*延时,控制滚动速度 */
        
	Lcmcls();   /*清屏幕*/
    
	Draw3(130);/*显示金粒子电池使用次数*/
    for(iii=0;iii<10;iii++)
      Delay(200); /*延时,控制滚动速度 */
        
  };
}


/****************************************************************************
*代码编号:	1.0.0    
*名称: 		演示主程序
*创建日期:	2005年3月16日
*创建人:   阿仁工作室  刘忠仁
*模块功能: 初始化单片机、液晶屏幕、轮流显示三个界面
*修改日期: 2005年3月30日
*参考文档:
****************************************************************************/

/**********************************************************
* 此函数显示 温度 剩余时间 和 百分比,并画出剩余电量的图形
* 输入参数依次为 温度 剩余时间 和 百分比
*
***********************************************************/
void Draw1(int Temp,int TimeLeft,int Charged)
{

  int xP,yP,ChargedP; 

    
  col=50;
  row=1*8;
  Putstr(STR1,5); /*第一行字符输出,10字节"温度:   ℃" */

  col=98; //50+48  输入数据
  row=1*8;
  IntToStr(Temp,0);/* 小数点位数为0 */
  Putstr(gStr,gLength);     /*温度输出" */
  
  
  col=50;
  row=3*8;
  Putstr(STR2,8); /*第二行字符输出,8字节"剩余时间" */
  

  col=60;
  row=5*8;
  Putstr(STR3,8); /*第三行字符输出,8字节"#####min" */

  col=65; //50  输入数据在 开始的空白处
  row=5*8;
  IntToStr(TimeLeft,0);/* 小数点位数为0 */
  Putstr(gStr,gLength);     /*剩余时间" */


    
   col=35;
   row=5*8;
   if(Charged==100)
   {    
     Putstr("Ok!",3); /*充电满*/
   }
   else
   {
    Putstr("  %",3); /*第三行字符输出,8字节"###%" */
    col=35;
    row=5*8;
    IntToStr(Charged,0);/* 小数点位数为0 */
    Putstr(gStr,gLength);     /*电量百分比" */
   } 
  


  //开始作图
  
  ChargedP=Charged*64/100;
  yP=64-ChargedP;
//  xP=-(yP-82)*10/18;

  for(yP=64-ChargedP;yP<64;yP++) 
  {
   
    xP=-(yP-82)*7/18; 

//    if(yP>40) xP=-(yP-82)*6/18;
    if(xP>25)xP=25;
    col=20;
    row=yP;
    xy = 1;
    Linehv(xP);  /*画一条横线(0,yP)-(xP,yP) */
  }
}


/**********************************************************
* 此函数显示 V1 V2 V3 V4 电压值
* 输入参数依次为 V1 V2 V3 V4
*
***********************************************************/
void Draw2(int V1,int V2,int V3,int V4)
{
  Uchar i;   
  col=20;
  row=0*8;
  Putstr(STR4,5); /*第一行字符输出,10字节"故障诊断:" */
    
  col=20;
  row=2*8;
  Putstr(STR5,6); /*第二行字符输出,12字节"电池组不平衡" */

  col=20; 
  row=4*8;
  IntToStr(V1,1);/* 小数点位数为1 */
  for(i=gLength;i>0;i--)   
  {
    gStr[i+3-1]= gStr[i-1];   
  }
  gStr[0]='V';
  gStr[1]='1';
  gStr[2]='=';
  gStr[3+gLength]='v';
  Putstr(gStr,gLength+4);     /*V1" */


  col=75; //  
  row=4*8;
  IntToStr(V2,1);/* 小数点位数为1 */
  for(i=gLength;i>0;i--)   
  {
    gStr[i+3-1]= gStr[i-1];   
  }
  gStr[0]='V';
  gStr[1]='2';
  gStr[2]='=';
  gStr[3+gLength]='v';
  Putstr(gStr,gLength+4);     /*V2" */

  col=20; 
  row=6*8;
  IntToStr(V3,2);/* 小数点位数为2 */
  for(i=gLength;i>0;i--)   
  {
    gStr[i+3-1]= gStr[i-1];   
  }
  gStr[0]='V';
  gStr[1]='3';
  gStr[2]='=';
  gStr[3+gLength]='v';
  Putstr(gStr,gLength+4);     /*V3" */


  col=75; //  
  row=6*8;
  IntToStr(V4,1);/* 小数点位数为1 */
  for(i=gLength;i>0;i--)   
  {
    gStr[i+3-1]= gStr[i-1];   
  }
  gStr[0]='V';
  gStr[1]='4';
  gStr[2]='=';
  gStr[3+gLength]='v';
  Putstr(gStr,gLength+4);     /*V4" */
}


/**********************************************************
* 此函数显示 欢迎界面和使用次数
* 输入参数依次为 使用次数
*
***********************************************************/
void Draw3(int UsedTimes)
{
  //此函数显示 温度 剩余时间 和 百分比
  
  
  col=20;
  row=1*8;
  Putstr(STR6,7); /*第一行字符输出,16字节"欢迎使用金粒子" */
  
  col=20;
  row=3*8;
  Putstr(STR7,7); /*第二行字符输出,8字节"系列锂离子电池" */

  col=20;
  row=5*8;
  Putstr(STR8,7); /*第三行字符输出,8字节"已使用:####次" */
  col=80; //     输入数据在 中间的空白处,第6个字节
  row=5*8;
  IntToStr(UsedTimes,0);/* 小数点位数为0 */
  Putstr(gStr,gLength);     /*使用次数" */
}


/****************************************************************************
*代码编号:	1.0.0    
*名称: 		通用测试模块
*创建日期:	2005年3月29日
*创建人:   阿仁工作室  刘忠仁
*模块功能: 测试管脚,并给出工作指示
*修改日期: 2005年3月30日
*参考文档:
****************************************************************************/

void TestPin(void)
{ int i;
 DDRC=0x20;

 for(i=0;i<1;i++)
 {
 PORTC&=~(1<<5);   Delay(10); 
 PORTC|=(1<<5);   Delay(10); 
 }
 	
}

/**********************************************************
*  将整型数据转换为字符串,返回字符串的长度
*  转换过的数据放在 全局变量 gStr 中 
***********************************************************/
void IntToStr(int IntData, Uchar DigitN)
{  Uchar  position=15,i;
   Uchar  sig;
   if(IntData<0)
   { sig=1;
     IntData=-IntData;
   }
      
   while(IntData)
   {
     gStr[position]=  IntData%10+0x30;
     IntData=IntData/10;
     position--;
     if(15-position==DigitN)
     { 
       gStr[position]='.';
       position--;
      }
   }
   if(sig==1)
   {
       gStr[position]='-';       
   }
  gLength=15-position; 

//左对齐  
  for(i=0;i< gLength;i++)
  { 
    gStr[i]=gStr[position+1];
    position++;
  }  
}


/************************************************/

⌨️ 快捷键说明

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