📄 avrmega8_ssd1815c.c
字号:
/****************************************************************************
*代码编号: 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 + -