📄 dsp_lcd.c
字号:
void Dot(unsigned int x, unsigned int y, unsigned int color)
{
//----------------------------------------------
// 画点时,先输入x和y的坐标值,再输入颜色值
// 当x或y的值写入行列地址寄存器时,需要加上偏移量
//----------------------------------------------
Lcd.x = X_bias + x;
Lcd.y = Y_bias + y;
Lcd.data = color;
}
void Line(unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1,
unsigned int color)
{
unsigned int j, tmp;
int dx, dy, n, k, i, x, y, f;
if(y0 == y1)
{
if(x0 >= x1) { tmp = x0; x0 = x1; x1 = tmp; }
// 初始化起始点、终止点、和线的颜色值
Lcd.x = X_bias + x0-1;
Lcd.y = Y_bias + y0;
Lcd.cmd.all = bit6 + bit1;
for(j = x0; j <=x1; j++)
{
Lcd.data = color;
asm(" RPT #32 || NOP "); // 延时语句
}
}
else
{
dx = abs(x1 - x0); dy = abs(y1 - y0); n = dx + dy;
if(x1 >= x0) { k = y1 >= y0 ? 1 : 4; x = x0; y = y0; }
else { k = y1 >= y0 ? 2 : 3; x = x0; y = y1; }
for(i = 0, f = 0; i < n; i++)
{
if(f >= 0)
switch(k){
case 1: Dot(x++, y, color); f -= dy; if(dx == 0){ x--; i--; } break;
case 2: Dot(x, y++, color); f -= dx; if(dy == 0){ y--; i--; } break;
case 3: Dot(x--, y, color); f -= dy; break;
case 4: Dot(x, y--, color); f -= dx; break;
}
else
switch(k){
case 1: Dot(x, y++, color); f += dx; break;
case 2: Dot(x--, y, color); f += dy; break;
case 3: Dot(x, y--, color); f += dx; break;
case 4: Dot(x++, y, color); f += dy; break;
}
}
}
}
void Clearlcd(unsigned int color)
{
unsigned int x, y;
for(y = 0; y < 480; y++) // (行*列) 640 * 480
{
//----------------------------------------------
// 采用自动功能写时,每行要提前1,当读时要后延1
// 下面采用的是行自动加1功能
//----------------------------------------------
Lcd.x = X_bias-1; //系统硬件决定
Lcd.y = Y_bias + y;
Lcd.cmd.all = bit6 + bit1;
for(x = 0; x < 640; x++)
{
Lcd.data = color;
asm(" RPT #32 || NOP ");
}
}
}
void Disp_pho(unsigned int x0, unsigned int y0, const unsigned int * sta_addr,
unsigned int color)
{
unsigned int char_byte, high, wide, i, j, p = 0, k, tmp, T;
int x = x0, y = y0;
// 获取字模特征字,然后字模指针加一,进入字模首字
tmp = *sta_addr++;
// 特征字中,高字节为字宽,低字节为字高
wide = (tmp & 0xFF00) >> 8;
high = tmp & 0x00FF;
// 从第一行开始写点作用
for( k = 0; k < high; k++) // 高即为行
{
// 从第一列开始写点
for( j = 0; j < wide; j++,p++) // 宽即为列
{
// 仅当为第一行时,取字模的首字
if(!k) { T = *sta_addr; }
if((p >> 3) % 2 == 0) // 取当前字的高字节
{ char_byte = (T & 0xFF00) >> 8; }
else // 取当前字的低字节,字模指针下移一个字
{ char_byte = T & 0x00FF; T = *(++sta_addr); }
for( i = 0; i < 8; i++) // 从左到右依次写点
{
// 仅当当前字节的当前位为真时,写点
if((char_byte & 0x80) == 0x80) Dot(x, y, color);
char_byte = char_byte << 1; x++;
if(i < 7) { j++; p++; } // 之所以到6,是因为上一级循环体中也会加一
}
}
x = x0; y++;
}
}
void Rect(int x0, int y0, int x1, int y1, unsigned int color)
{
Line(x0, y0, x1, y0, color);
Line(x1, y0, x1, y1, color);
Line(x0, y0, x0, y1, color);
Line(x0, y1, x1, y1, color);
}
void color_fill(int x0, int y0, int x1, int y1, unsigned int color)
{
int i;
for(i=y0;i<=y1;i++)
Line(x0, i, x1, i, color);
}
//---------------------------------------------------------
void Button(int x0,unsigned int color)
{
Line(x0,6,x0,25,color);
Line(x0,6,x0+6,0,color);
Line(x0+5,0,x0+80,0,color);
Line(x0+80,0,x0+86,6,color);
Line(x0+86,6,x0+86,25,color);
}
void Check_Mold(int x0,int y0,int flag) //flag:1感叹 2错误 3完成
{
// Rect(x0,y0,x0+300,y0+120,lime);
// Rect(x0+1,y0+1,x0+299,y0+119,lime);
color_fill(x0,y0,x0+300,y0+120,aqua);
// Rect(x0+2,y0+21,x0+298,y0+118,black);
color_fill(x0+2,y0+21,x0+298,y0+118,black);
if(flag==1)
{
Disp_pho(x0+10,y0+30,tx3,yellow);
Disp_pho(x0+26,y0+41,tx4,black);
Rect(x0+50,y0+90,x0+112,y0+110,white);
Rect(x0+185,y0+90,x0+247,y0+110,white);
Disp_pho(x0+65,y0+92,hz21,blue);
Disp_pho(x0+200,y0+92,hz22,blue);
}
else if(flag==2)
{
Disp_pho(x0+10,y0+30,tx5,red);
Rect(x0+119,y0+90,x0+181,y0+110,white);
Disp_pho(x0+134,y0+92,hz21,blue);
}
else if(flag==3)
{
Disp_pho(x0+10,y0+30,tx6,green);
Rect(x0+119,y0+90,x0+181,y0+110,white);
Disp_pho(x0+134,y0+92,hz21,blue);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -