📄 example_dps2812m_lcd.c
字号:
/* =================================================================================
File name: Example_DPS2812M_DA.C
Originator: SEED R&D Group
Description:
DPS2812M Device Digital to Analog test program.
=====================================================================================
History:
-------------------------------------------------------------------------------------
10-20-2005 Release Rev 1.0 Jijunhui
------------------------------------------------------------------------------*/
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "Example_DPS2812M_LCD.H"
#ifndef bool
#define bool unsigned short
#define FALSE 0
#define TRUE 1
#endif
unsigned int i;
unsigned int x1,y1;
int a[128];
/***************************************************************************
* 函数: void wr_data(unsigned int data)
* 目的: 写LCD数据参数,判断0和1位
* 输入: dat1 参数单元
* 输出: 无
* 参数: status局部变量,用来存储LCD的状态量
***************************************************************************/
void wr_data(unsigned int dat1)
{
unsigned int status;
do
{
status = *c_addr & 0x03; /* 屏蔽status的2~15位为0 */
}while(status != 0x03);
*d_addr = dat1;
}
/***************************************************************************
* 函数: void wr_data1(unsigned int dat1)
* 目的: 写LCD数据参数,判断3位
* 输入: dat1 参数单元
* 输出: 无
* 参数: status局部变量,用来存储LCD的状态量
***************************************************************************/
void wr_data1(unsigned int dat1)
{
unsigned int status;
do
{
status = *c_addr & 0x08; /* 屏蔽status的0~2和3~15位为0 */
}while(status != 0x08);
*d_addr = dat1;
}
/***************************************************************************
* 函数: void wr_com(WORD com)
* 目的: 写LCD指令参数
* 输入: com 指令单元
* 输出: 无
* 参数: status局部变量,用来存储LCD的状态量
***************************************************************************/
void wr_com(unsigned int com)
{
unsigned int status;
do
{
status = *c_addr & 0x03;
}while(status != 0x03);
*c_addr = com;
}
/***************************************************************************
* 函数: extern void GUILCD_init(void)
* 目的: 初始化LCD显示,设置显示方式为图形方式,开显示
* 输入: 无
* 输出: 无
****************************************************************************/
extern void GUILCD_init(void)
{
wr_data(0x00); /*设置图形显示区域首地址*/
wr_data(0x00); /*或为文本属性区域首地址*/
wr_com(0x42);
wr_data(0x20); /*设置图形显示区域宽度*/
wr_data(0x00); /*或为文本属性区域宽度*/
wr_com(0x43);
wr_com(0xa0); /*光标形状设置*/
wr_com(0x81); /*显示方式设置,逻辑或合成*/
wr_com(0x9b); /*显示开关设置,仅文本开显示*/
}
/***************************************************************************
* 函数: extern void GUILCD_clear(void)
* 目的: 清LCD屏,用自动方式,将LCD屏清为白屏
* 输入: 无
* 输出: 无
参数: page0局部变量
***************************************************************************/
extern void GUILCD_clear(void)
{
int page0;
wr_data(0x00); /*设置显示RAM首地址*/
wr_data(0x00);
wr_com(0x24);
wr_com(0xb0); /*设置自动写方式*/
for(page0 = 0x2000; page0 >= 0; page0--)
{
wr_data1(0x00); /* 清0 */
}
wr_com(0xb2); /* 自动写结束 */
}
/***************************************************************************
* 函数: void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian)
* 目的: 写字母,根据字母代码,将查找到的字母写到LCD的Y和X坐标处
* 输入: code 字母代码,字母为16×16点阵
o_y y坐标,范围0~7
o_x x坐标,范围0~14
fanxian 字母是否需要反显,0不需要反显,1需要反显
* 输出: 无
参数:
***************************************************************************/
void wr_letter(unsigned int code,unsigned int o_y,unsigned int o_x,unsigned short fanxian)
{
unsigned int i1,dat1_temp,dat2_temp;
unsigned int asc_code[8];
int i2;
i1 = o_y * 0x20;
i1 = i1 + o_x;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
//getasc(code,&asc_code[0]); /* 从FLASH中读取字母点阵 */
for(i2 = 0; i2 <8; i2++)
{
asc_code[i2] = zimu[8*code + i2];
}
if(fanxian == TRUE) /* 是否反显 */
{
for(i2 = 0; i2 < 8; i2++)
{
asc_code[i2] = (~asc_code[i2]) & 0xff;
}
}
for(i2 = 0; i2 < 8; i2++)
{
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24); /* 字母在LCD的位置 */
wr_data(asc_code[i2]); /* 写字母点阵 */
wr_com(0xc0);
//wr_data(asc_code[2*i2+1]); /* 写字母点阵 */
//wr_com(0xc0);
i1 = i1 + 0x20;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff; /* 写完后,修改在LCD的位置 */
}
}
/***************************************************************************
* 函数: void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,bool fanxian)
* 目的: 写汉字,将汉字区位代码中的字写入X和Y位置,可以设置为反显
* 输入: code 汉字区位代码
o_y y坐标,范围0~7
o_x x坐标,范围0~14
fanxian 反显 0:无 1:反显
* 输出: 无
***************************************************************************/
void wr_hex(unsigned int code,unsigned int o_y,unsigned int o_x,unsigned short fanxian)
{
unsigned int dat1_temp,dat2_temp;
unsigned int *code_temp;
int i1,i2;
unsigned int hanzi_conv[32];
unsigned int hex_code[32];
/* code_temp1 = (code >> 8) & 0xff;
code_temp1 = code_temp1 - 0xa1;
code_temp1= code_temp1 * 94;
code_temp1 = code_temp1 + (code & 0xff);
code_temp1 = code_temp1 - 0xa1;
//gethz(code_temp1,&hanzi_conv[0]);
*/
for(i1 = 0; i1 <32; i1++)
{
hanzi_conv[i1] = hanzi[32*code + i1];
}
for(i2 = 0; i2 < 32; i2++)
{
if(fanxian == FALSE) /* 是否反显 */
{
hex_code[i2] = hanzi_conv[i2];
}
else
{
hex_code[i2] = (~hanzi_conv[i2]) & 0xff;
}
}
i1 = o_y * 0x20;
i1 = i1 + o_x;
dat1_temp = i1 & 0xff;
dat1_temp = dat1_temp ;
dat2_temp = (i1>>8) & 0xff;
dat2_temp = dat2_temp;
code_temp = &hex_code[0];
for(i2 = 0; i2 < 16 ; i2++)
{
wr_data(dat1_temp); /* 汉字点阵在LCD中的位置 */
wr_data(dat2_temp);
wr_com(0x24);
wr_data(*(code_temp+i2*2)); /* 写入汉字点阵 */
wr_com(0xc0);
wr_data(*(code_temp+i2*2+1));
wr_com(0xc0);
//code_temp++;
i1 = i1 + 0x20;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff; /* 修改汉字点阵在LCD中的位置 */
}
}
/***************************************************************************
* 函数: void wr_dot(unsigned int o_y,unsigned int o_x,unsigned short flag)
* 目的: 描点,根据flag的状态,在LCD显示器的指定在o_y和o_x处描点,如果flag=1,
描点;如果flag=0,清除点
* 输入: o_y Y轴,范围0~127
o_x Y轴,范围0~239
flag 是否描点,flag=1,描点;flag=0,清点
* 输出: 无返回
***************************************************************************/
void wr_dot(unsigned int o_y,unsigned int o_x,unsigned short flag)
{
int i,dat1_temp,dat2_temp,temp,temp1;
// i = o_y & 0x7f;
i = o_y * 0x20;
dat1_temp = i & 0xff;
dat2_temp = (i >> 8) & 0xff;
temp = o_x / 8;
dat1_temp = dat1_temp + temp;
temp1 = o_x - (temp * 8);
temp1 = 7 - temp1; /* 设定描点的位置 */
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
if(flag == 1)
{
wr_com(0xf8 | temp1);
}
else
{
wr_com(0xf0 | temp1);
}
}
/***************************************************************************
* 函数: extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned char *cString ,bool fanxian)
* 目的: 写汉字字符串,将函数传递的字符串放在LCD屏的ROW行和COLUMN列的位置显示
自动写屏,直到字符串尾,判断为0停止。根据变量fanxi是否为0,
决定当前字符串是否反显。显示位置从LCD屏的ROW行和COLUMN列的位置开始,
为行显示,既ROW不变,COLUMN加1变化。
* 输入: //string 代码字符串
location 汉字在hanzi[]中的位置
ROW 汉字行,范围(0到7),代表字符串起始Y位置
COLUMN 汉字列,范围(0到14),代表字符串起始X位置
fanxian 反显 0:无 非0:反显
* 输出: 无
***************************************************************************/
extern void GUILCD_writeCharStr(unsigned int Row, unsigned int Column, unsigned int location ,unsigned short fanxian)
{
unsigned int ii4;
ii4 = 0;
//ii1 = *cString;
//while(ii1 != 0) /* 判断字符串是否结束 */
{
wr_hex(location,Row*0x10,Column*2,fanxian); /* 写汉字 */
//Column++; /* 列位置+1 */
//ii4++;
//ii1 = *(cString + ii4); /* 读字符串内的值 */
}
}
/***************************************************************************
* 函数: extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column, unsigned char *cString,unsigned short fanxian )
* 目的: 写ASC码字符串,16*16点阵格式,将字符串string中的ASC码在LCD屏的
ROW和COLUMN坐标处显示,连续显示,直到字符串string串尾为0,ROW保持
不变,COLUMN加1。
* 输入: string ASC代码字符串
ROW y坐标,范围(0到7),代表字符串起始Y位置
COLUMN x坐标,范围(0到14),代表字符串起始X位置
fanxian 反显 0:无 非0:反显
* 输出: 无
***************************************************************************/
extern void GUILCD_writeLetterStr(unsigned int Row, unsigned int Column, unsigned int location,unsigned short fanxian )
{
//unsigned int iii1,iii2;
//iii2 = 0;
//iii1 = *cString;
//while(iii1 != 0) /* 判断字符串是否结束 */
{
//iii2++;
wr_letter(location,Row*0x08,Column,fanxian);
//Column++;
//iii1 = *(cString + iii2);
}
}
/***************************************************************************
* 函数: extern void GUILCD_writeCurse(unsigned int Row, unsigned int Column)
* 目的: 显示光标,光标地址为Row(y轴),Column(x轴)
* 输入: Row y坐标(范围:0到7,代表8行汉字)
Column x坐标(范围:0到14,代表15列汉字)
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_writeCurse(unsigned int Row, unsigned int Column)
{
unsigned int i1,dat1_temp,dat2_temp;
Row = Row * 0x10;
Column = Column * 2;
i1 = Row * 0x20;
i1 = i1 + Column + 0x1e0;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
wr_data(0xff);
wr_com(0xc0);
wr_data(0xff);
wr_com(0xc0);
}
/***************************************************************************
* 函数: extern void GUILCD_clearCurse(unsigned int Row, unsigned int Column)
* 目的: 清光标,光标地址为ROW(y轴),COLUMN(x轴)
* 输入: ROW y坐标(范围:0到7,代表8行汉字)
COLUMN x坐标(范围:0到14,代表15列汉字)
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_clearCurse(unsigned int Row, unsigned int Column)
{
unsigned int i1,dat1_temp,dat2_temp;
Row = Row * 0x10;
Column = Column * 2;
i1 = Row * 0x20;
i1 = i1 + Column + 0x1e0;
dat1_temp = i1 & 0xff;
dat2_temp = (i1>>8) & 0xff;
wr_data(dat1_temp);
wr_data(dat2_temp);
wr_com(0x24);
wr_data(0x00);
wr_com(0xc0);
wr_data(0x00);
wr_com(0xc0);
}
/***************************************************************************
* 函数: extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data, unsigned short flag)
* 目的: 描点,从原点ROW和COLUMN处起始画一条线,线上每个点的位置根据*DATA定,FLAG来判断是否显示这条线。
* 输入: Column y坐标原点(范围:0到127,代表128行点)
Row x坐标(范围:0到239,代表240列点)
*Data 数据,函数表达式为y=f(x),y为y轴,x为x轴
flag 显示 1:显示 0:不显示
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_drawChart(unsigned int Row, unsigned int Column, int *Data, unsigned short flag)
{
int i,x,y;
for(i = 0; i < 240 - Column; i++)
{
x = Column + i;
y = Row - *(Data + i);
wr_dot(y,x,flag);
}
}
/***************************************************************************
* 函数: extern void GUILCD_onLed(void)
* 目的: 开背光灯
* 输入: 无
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_onLed(void)
{
// asm(" ssbx XF");
}
/***************************************************************************
* 函数: extern void GUILCD_offLed(void)
* 目的: 关背光灯
* 输入: 无
* 输出: 无
* 参数: 无全局变量
***************************************************************************/
extern void GUILCD_offLed(void)
{
// asm(" rsbx XF");
}
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/* 关中断 */
DINT;
IER = 0x0000;
IFR = 0x0000;
/* 初始化PIE控制寄存器 */
InitPieCtrl();
/* 初始化PIE参数表 */
InitPieVectTable();
/* 初始化外设寄存器 */
//InitPeripherals();
/*初始化LCD*/
GUILCD_init();
//清屏
GUILCD_clear();
/* 写光标 */
GUILCD_writeCurse(0x02,0x02);
/* 清光标 */
GUILCD_clearCurse(0x02,0x02);
/* 准备画线数据 */
x1 = 0;
y1 = 0;
for(i = 0; i <128; i++)
{
a[i] = - i/2;
}
/* 画线,显示 */
GUILCD_drawChart(0,0,&a[0],1);
/* 画线,不显示 */
GUILCD_drawChart(0,0,&a[0],0);
/* 写汉字,无反显 */
GUILCD_writeCharStr(0x01,0x01,0,FALSE);
/* 写汉字,有反显 */
GUILCD_writeCharStr(0x01,0x02,1,TRUE);
/* 写字母,无反显 */
GUILCD_writeLetterStr(0x01,0x02,0,FALSE);
/* 写字母,有反显 */
GUILCD_writeLetterStr(0x01,0x00,1,TRUE);
/* 开中断 */
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
}
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -