📄 dsp2812lcd.c
字号:
//BUS LCD
#include "DSP28_Device.h"
#include "string.h"
unsigned int * LED_COMM=(unsigned int *)0x20C0;
unsigned int * LED_STAT=(unsigned int *)0x20E0;
///////////////////////////////////////////////////
void delay(unsigned int t)
{
while(t>0)
t--;
}
void delayms(unsigned int k)
{
while(k>0)
{
k--;
delay(500);
}
}
//////////////////////////////////////////////////
//---寄存器设置---------------------------------------------------------
unsigned int Set_F500[]={4,0x83,0x00,0xf5,0x00};
unsigned int Set_F504[]={4,0x83,0x04,0xf5,0x04};
unsigned int Set_F505[]={4,0x83,0x05,0xf5,0x80};
unsigned int Set_F6C4[]={4,0x83,0xc4,0xf6,0x10};
unsigned int Set_F080[]={4,0x83,0x80,0xf0,0xfc};
unsigned int Set_F08E[]={4,0x83,0x8e,0xf0,0x32};
unsigned int Set_F090[]={4,0x83,0x90,0xf0,0x14};
unsigned int Set_F091[]={4,0x83,0x91,0xf0,0x25};
unsigned int Set_F092[]={4,0x83,0x92,0xf0,0x1e};
unsigned int Set_F094[]={4,0x83,0x94,0xf0,0x05};
unsigned int Set_F095[]={4,0x83,0x95,0xf0,0x0e};
unsigned int Set_F096[]={4,0x83,0x96,0xf0,0x03};
unsigned int Set_8F[]={7,0x8f,0x69,0x45,0x61,0x67,0x6c,0x65};
////////////////////////////////////////////////////////
// 一个指令代码或数据传送子程序
void SdCmd(unsigned int Command) //send a command
{
* LED_COMM= Command;
}
// 指令包传送结束子程序
void CmdEnd() //send state bit
{
* LED_STAT= 1;
}
// 一个指令包传送子程序
void WritePKG(unsigned int *pkg) // send a command package
{
unsigned int i;
for(i=*pkg;i;i--) //pkg 数组首地址存放指令包的数据量,包括指令代码
SdCmd(*(++pkg));
CmdEnd();
}
//////////////////////////////////////////////////////
//------初始化子程序------------------------------------------------------
void initLCDM(void)//初始化程序
{
// execute all the setting in above
WritePKG(Set_F500);
WritePKG(Set_F504);
WritePKG(Set_F505);
WritePKG(Set_F6C4);
WritePKG(Set_F080);
WritePKG(Set_F08E);
WritePKG(Set_F090);
WritePKG(Set_F091);
WritePKG(Set_F092);
WritePKG(Set_F094);
WritePKG(Set_F095);
WritePKG(Set_F096);
WritePKG(Set_8F);
}
///////////////////////////////////////////////
void SetDrawFgColor(unsigned int color) //前景色设置程序
{
unsigned int Buffer[4];
Buffer[0]=3;
Buffer[1]=0x20; // 或者0x14 前景色设置指令代码
Buffer[2]=color; // 色彩数据低8 位
Buffer[3]=color>>8; // 色彩数据高8 位
WritePKG(Buffer);
}
//背景色设置子程序(仅用于字符)
void SetFontBgColor(unsigned int color) //背景色设置程序
{
unsigned int Buffer[4];
Buffer[0]=3;
Buffer[1]=0x15; //背景色设置指令代码
Buffer[2]=color; //色彩数据低8 位
Buffer[3]=color>>8; //色彩数据高8 位
WritePKG(Buffer);
}
void SetFontColor(unsigned int color) //前景色设置程序
{
unsigned int Buffer[4];
Buffer[0]=3;
Buffer[1]=0x14; // 或者0x14 前景色设置指令代码
Buffer[2]=color; // 色彩数据低8 位
Buffer[3]=color>>8; // 色彩数据高8 位
WritePKG(Buffer);
}
/////////////////////////////////////////////////////
//ASCII 字符串写入子程序(最多一次写入63 个字符)
void PrintASCII(unsigned int X,unsigned int Y, unsigned int *pstr)
{
unsigned int Buffer[6], NoOfChar;
Buffer [0]=2; // 指令包数据量设置
Buffer [1]=0x10; // 字库选择指令代码
Buffer [2]=0x00; // 字库选择,使用内部 8x8 ASCII 字库
WritePKG(Buffer);
Buffer[0]=5; // 指令包数据量设置
Buffer[1]=0x12; // 显示位置设置指令代码
Buffer[2]=X; // X 坐标低8 位
Buffer[3]=X>>8; // X 坐标高8 位
Buffer[4]=Y; // Y 坐标低8 位
Buffer[5]=Y>>8; // Y 坐标高8 位
WritePKG(Buffer);
NoOfChar=strlen((const char*)pstr); // 计算数组长度
SdCmd(0x17); // 字串写入指令代码
SdCmd(NoOfChar); // 字符数量
while(*pstr>0)
{
SdCmd(*pstr++); //写入字符代码
}
CmdEnd();
}
//汉字字串写入子程序(最多一次写入31 个汉字)
void PrintGB(unsigned int X,unsigned int Y, unsigned int *pstr,unsigned int NoOfChar)
{
unsigned int TempData[3], Buffer[6];
TempData[0]=2; // 指令包数据量设置
TempData[1]=0x10; // 字库选择指令代码
TempData[2]=0x04; // 字库选择,使用模块内部 16*16GB2132 汉字库
WritePKG(TempData);
Buffer[0]=5; // 指令包数据量设置
Buffer[1]=0x12; // 显示位置设置指令代码
Buffer[2]=X; // X 坐标低8 位
Buffer[3]=X>>8; // X 坐标高8 位
Buffer[4]=Y; // Y 坐标低8 位
Buffer[5]=Y>>8; // Y 坐标高8 位
WritePKG(Buffer);
//NoOfChar=6; // 计算数组长度
SdCmd(0x17); // 字串写入指令代码
SdCmd(NoOfChar); // 字符数量
while(*pstr>0)
{
SdCmd(*pstr++); //写入字符代码
}
CmdEnd();
}
//////////////////////////////////////////
//画点子程序
void Draw_Dot(unsigned int X,unsigned int Y)
{
unsigned int Buffer[6];
Buffer[0]=5; // 指令包数据量设置
Buffer[1]=0x23; // 画点指令代码
Buffer[2]=X; // 点坐标X 低8 位
Buffer[3]=X>>8; // 点坐标X 高8 位
Buffer[4]=Y; // 点坐标Y 低8 位
Buffer[5]=Y>>8; // 点坐标Y 高8 位
WritePKG(Buffer);
}
//画线子程序
void Draw_Line(unsigned int x1, unsigned int y1,unsigned int x2, unsigned int y2)
{
unsigned int Buffer[10];
Buffer[0]=9; // 指令包数据量设置
Buffer[1]=0x24; // 画线指令代码
Buffer[2]=x1; // 起始坐标X 低8 位
Buffer[3]=x1>>8; // 起始坐标X 高8 位
Buffer[4]=y1; // 起始坐标Y 低8 位
Buffer[5]=y1>>8; // 起始坐标Y 高8 位
Buffer[6]=x2; // 结束坐标X 低8 位
Buffer[7]=x2>>8; // 结束坐标X 高8 位
Buffer[8]=y2; // 结束坐标Y 低8 位
Buffer[9]=y2>>8; // 结束坐标Y 高8 位
WritePKG(Buffer);
delayms(5);
}
//画矩形边子程序
void Draw_Rect(unsigned int x1, unsigned int y1,unsigned int x2, unsigned int y2)
{
unsigned int Buffer[10];
Buffer[0]=9; // 指令包数据量设置
Buffer[1]=0x26; // 画矩形边线指令代码
Buffer[2]=x1; // 起始角坐标X 低8 位
Buffer[3]=x1>>8; // 起始角坐标X 高8 位
Buffer[4]=y1; // 起始角坐标Y 低8 位
Buffer[5]=y1>>8; // 起始角坐标Y 高8 位
Buffer[6]=x2; // 对角坐标X 低8 位
Buffer[7]=x2>>8; // 对角坐标X 高8 位
Buffer[8]=y2; // 对角坐标Y 低8 位
Buffer[9]=y2>>8; // 对角坐标Y 高8 位
WritePKG(Buffer);
delayms(20);
}
//画圆边子程序
void Draw_Circle(unsigned int X,unsigned int Y, unsigned int R)
{
unsigned int Buffer[7];
Buffer[0]=6; // 指令包数据量设置
Buffer[1]=0x28; // 画圆指令代码
Buffer[2]=X; // 圆心坐标X 低8 位
Buffer[3]=X>>8; // 圆心坐标X 高8 位
Buffer[4]=Y; // 圆心坐标Y 低8 位
Buffer[5]=Y>>8; // 圆心坐标Y 高8 位
Buffer[6]=R; //圆半径R
WritePKG(Buffer);
delayms(20);
}
//画矩形面子程序
void Fill_Rect(unsigned int x1, unsigned int y1,unsigned int x2, unsigned int y2)
{
unsigned int Buffer[10];
Buffer[0]=9; // 指令包数据量设置
Buffer[1]=0x27; // 画矩形面指令代码
Buffer[2]=x1; // 起始角坐标X 低8 位
Buffer[3]=x1>>8; // 起始角坐标X 高8 位
Buffer[4]=y1; // 起始角坐标Y 低8 位
Buffer[5]=y1>>8; // 起始角坐标Y 高8 位
Buffer[6]=x2; // 对角坐标X 低8 位
Buffer[7]=x2>>8; // 对角坐标X 高8 位
Buffer[8]=y2; // 对角坐标Y 低8 位
Buffer[9]=y2>>8; // 对角坐标Y 高8 位
WritePKG(Buffer);
delayms(20);
}
//画圆面子程序
void Fill_Circle(unsigned int X,unsigned int Y, unsigned int R)
{
unsigned int Buffer[7];
Buffer[0]=6; // 指令包数据量设置
Buffer[1]=0x29; // 画圆面指令代码
Buffer[2]=X; // 圆心坐标X 低8 位
Buffer[3]=X>>8; // 圆心坐标X 高8 位
Buffer[4]=Y; // 圆心坐标Y 低8 位
Buffer[5]=Y>>8; // 圆心坐标Y 高8 位
Buffer[6]=R; // 圆半径R
WritePKG(Buffer);
delayms(20);
}
////////////////////////////////////////////
//图画写入子程序
void ShowBMP(unsigned int x,unsigned int y,unsigned int width,unsigned int high,unsigned int bmp[])
//width:图形水平像素点数;high:图形垂直像素行数;bmp[]:图形数组名
{
unsigned int Buffer[5];
unsigned int i,j,k;
unsigned long p;
unsigned long addr; // 设置显示RAM 指针
addr=y*640+2*x; // RAM 单元地址计算公式 addr= X*2 + Y*320*2
p=0; // 图形数据寻址指针
for(i=0;i<high;i++) // 图形行数据写入循环
{
Buffer[0]=4;
Buffer[1]=0x81; // 图形行写入首地址设置
Buffer[2]=addr;
Buffer[3]=addr>>8;
Buffer[4]=addr>>16;
WritePKG(Buffer);
j=width;
while(j>=16) // 以下为图形行数据写入
{
SdCmd(0x84); // 显示RAM 写入指令
SdCmd(32); // 固定一次写入32 字节图形数据
for(k=0;k<16;k++) // 即16 个像素数据
{
SdCmd(bmp[p]); // 写入像素数据低8 位
SdCmd(bmp[p]>>8); // 写入像素数据高8 位
p++;
}
CmdEnd();
j=j-16;
}
if (j>0) //16 倍数余下数据写入
{
SdCmd(0x84);
SdCmd(2*j); // 设置写入数据字节数
for(k=0;k<j;k++) // 即J 个像素数据
{
SdCmd(bmp[p]); // 写入像素数据低8 位
SdCmd(bmp[p]>>8); // 写入像素数据高8 位
p++;
}
CmdEnd();
}
addr=addr+640; // 下一行单元首地址修正
}
}
////////////////////////////////////////////////
//游标建立子程序
void SET_SPRITE()
{
unsigned int j,k;
unsigned int Buffer[5];
//下面是一个箭头(16*16 点阵)的游标图案数据,仅作为示例
unsigned int pic03[]= { 0xff, 0xff, 0xff, 0xf0, 0xea, 0xaa, 0xaa, 0xc0, //1-2 行
0xea,0xaa,0xab,0x00, 0xea,0xaa, 0xac, 0x00, //3-4 行
0xea,0xaa,0xb0,0x00, 0xea,0xaa, 0xb0, 0x00, //5-6 行
0xea,0xaa,0xac,0x00, 0xea,0xaa, 0xab, 0x00, //7-8 行
0xea,0xaa,0xaa,0xc0, 0xea,0xfa, 0xaa, 0xb0, //9-10 行
0xeb,0x0e,0xaa,0xac, 0xec,0x03, 0xaa, 0xab, //11-12 行
0xf0,0x00,0xea,0xab, 0xc0,0x00, 0x3a, 0xac, //13-14 行
0x00,0x00,0x0e,0xb0, 0x00,0x00, 0x03,0xc0 }; //15-16 行
unsigned int WHITE=0xffff,BLACK=0x0000,BLUE=0x001f,GREEN=0x07e0;//RED=0xf800;
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x00;
Buffer[3]=0xf1;
Buffer[4]=0x01; //激活游标寄存器 D[1:0]=01 2bpp
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x02;
Buffer[3]=0xf1;
Buffer[4]=BLUE; //设置游标数据00 的显示色彩(低8 位)
WritePKG(Buffer);
Buffer[0]=4; //LUT 00 high
Buffer[1]=0x83;
Buffer[2]=0x03;
Buffer[3]=0xf1;
Buffer[4]=BLUE>>8; //设置游标数据00 的显示色彩(高8 位)
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x04;
Buffer[3]=0xf1;
Buffer[4]=GREEN; //设置游标数据01 的显示色彩(低8 位)
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x05;
Buffer[3]=0xf1;
Buffer[4]=GREEN>>8; //设置游标数据01 的显示色彩(高8 位)
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x06;
Buffer[3]=0xf1;
Buffer[4]=WHITE; //设置游标数据10 的显示色彩(低8 位)
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x07;
Buffer[3]=0xf1;
Buffer[4]=WHITE>>8; //设置游标数据10 的显示色彩(高8 位)
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x08;
Buffer[3]=0xf1;
Buffer[4]=BLACK; //设置游标数据11 的显示色彩(低8 位)
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x09;
Buffer[3]=0xf1;
Buffer[4]=BLACK>>8; //设置游标数据11 的显示色彩(高8 位)
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x0a;
Buffer[3]=0xf1;
Buffer[4]=0x0f; // 设置游标图案水平像素点数,示例为16*16 点阵
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x0b;
Buffer[3]=0xf1;
Buffer[4]=0x0f; // 设置游标图案水蛭像素点数,示例为16*16 点阵
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x42;
Buffer[3]=0xf1;
Buffer[4]=0x00; //设置游标图案存储单元起始地址(低8 位) 示例为2b000H
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x43;
Buffer[3]=0xf1;
Buffer[4]=0xb0; //设置游标图案存储单元起始地址(中8 位) 示例为2b000H
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x44;
Buffer[3]=0xf1;
Buffer[4]=0x02; //设置游标图案存储单元起始地址(高2 位) 示例为2b000H
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x81; //写游标图案存储单元起始地址 示例为2b000H
Buffer[2]=0x00;
Buffer[3]=0xb0;
Buffer[4]=0x02;
WritePKG(Buffer);
for(j=0;j<2;j++) //写入游标图案数据给2b000H 后单元
{
SdCmd(0x84); //写入显示RAM 指令码
SdCmd(32); //写入数据量
for(k=0;k<32;k++) //写入数据
{
SdCmd(pic03[k+j*32]);
}
CmdEnd();
}
}
//游标显示子程序
void use_sprite(unsigned int x,unsigned int y)
{
unsigned int Buffer[5];
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x00;
Buffer[3]=0xf1; // 启用游标设置
Buffer[4]=0xc1; //D7 enable;D6 transparency edable; D[1:0]=01 2bpp
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x0c;
Buffer[3]=0xf1;
Buffer[4]=x; // 游标显示坐标X 值低8 位
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x0d;
Buffer[3]=0xf1;
Buffer[4]=x>>8; // 游标显示坐标X 值高8 位
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x0e;
Buffer[3]=0xf1;
Buffer[4]=y; // 游标显示坐标Y 值低8 位
WritePKG(Buffer);
Buffer[0]=4;
Buffer[1]=0x83;
Buffer[2]=0x0f;
Buffer[3]=0xf1;
Buffer[4]=y>>8; // 游标显示坐标Y 值高8 位
WritePKG(Buffer);
}
////////////////////////////////////////////////////
void main(void)
{
// unsigned int i;
unsigned int BLACK=0x0000,GREEN=0x07e0,RED=0xf800;
//unsigned int WHITE=0xffff,BLUE=0x001f;
InitSysCtrl(); //初始化系统
DINT; //关中断
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE参数表
InitPeripherals(); //初始化外设寄存器
InitGpio(); //初始化IO口
EINT; //Enable INTM
ERTM; //Enable DBGM
initLCDM();
SetDrawFgColor(BLACK);
Fill_Rect(0, 0,320, 240);
SetFontBgColor(0x0000);
SetFontColor(GREEN);
PrintGB(20,20, (unsigned int*)"我爱你,拓普!",7);
PrintASCII(20,60, (unsigned int *)"I LOVE YOU!");
SetDrawFgColor(RED);
Draw_Circle(200,150, 40);
Fill_Circle(100,100, 20);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -