结构化程序设计
结构化程序设计模型 主张将项目的功能按板块划分不同的功能文件,并且同一板块也可以根据实际需求封装成不同的功能函数,以便项目的维护 和 设计 ==》请 将代码按功能封装成函数
上午任务:请将LCD屏封装成 lcd.c和lcd.h,并完成下列功能函数
lcd.h
#ifndef __LCD_H__
#define __LCD_H__
extern int lcdfd; //保存LCD屏幕文件的文件描述符
extern int *plcd; //保存LCD屏幕映射内存首地址
int lcd_init(void); //初始化LCD屏:打开和映射LCD屏幕文件
int lcd_uninit(void);//释放LCD屏:接触映射,关闭LCD屏幕文件
int lcd_draw_point(int x,int y,int color); //画点函数,用来将坐标为(x,y)的像素点显示为color色
int lcd_draw_clear(int x0,int y0,int w,int h,int color);//清屏函数,用来将从(x0,y0)为起点,宽w,高h的矩形区域显示为 color色
int lcd_draw_FourLeafClover(void);//在屏幕上显示一个四叶草(取上下左右四个圆两两的交集)
int lcd_draw_Rainbow(void);//在屏幕上显示一个彩虹
#endif
lcd.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int lcdfd = 0; //保存LCD屏幕文件的文件描述符
int *plcd = 0; //保存LCD屏幕映射内存首地址
int lcd_init(void) //初始化LCD屏:打开和映射LCD屏幕文件
{
/* 打开LCD屏驱动设备文件 */
lcdfd = open("/dev/fb0",O_RDWR);
if(-1 == lcdfd)
{
perror("open lcd error");
return -1;
}
/* 将LCD屏映射到内存空间 =》Frame Buffer 帧缓冲设备*/
plcd = (int*)mmap(NULL,//系统自动选择映射地址
800*480*32/8, //映射空间大小(单位 字节),屏幕800*480个像素点,每个像素点32位(32/8个字节)
PROT_READ|PROT_WRITE,//具备读写权限
MAP_SHARED,//共享映射,对映射内存空间的操作会被同步到文件
lcdfd,//指定映射的文件
0); //从文件头开始映射
if(MAP_FAILED == plcd)
{
perror("mmap lcd error");
close(lcdfd);
return -1;
}
return 0;
}
int lcd_uninit(void)//释放LCD屏:接触映射,关闭LCD屏幕文件
{
/* 收尾:解除映射,关闭屏幕文件 */
munmap(plcd,800*480*32/8);
close(lcdfd);
return 0;
}
int lcd_draw_point(int x,int y,int color) //画点函数,用来将坐标为(x,y)的像素点显示为color色
{
if(x<0 || x >=800 || y<0 || y>=480)
{
printf("指定画点的坐标超出屏幕范围\n");
return -1;
}
*(plcd + y*800 + x) = color;
return 0;
}
int lcd_draw_clear(int x0,int y0,int w,int h,int color)//清屏函数,用来将从(x0,y0)为起点,宽w,高h的矩形区域显示为 color色
{
int x = 0;
int y = 0;
for(x=x0;x<=x0+w;x++)
{
for(y=y0;y<=y0+h;y++)
{
lcd_draw_point(x,y, color);
}
}
return 0;
}
int lcd_draw_FourLeafClover(void)//在屏幕上显示一个四叶草(取上下左右四个圆两两的交集)
{
}
int lcd_draw_Rainbow(void)//在屏幕上显示一个彩虹
{
}
main.c
#include "lcd.h"
int main(void)
{
lcd_init();
lcd_draw_clear(0,0,800,480,0x000000); //将整个屏幕显示为了黑色
lcd_draw_clear(200,200,200,200,0xffff00); //在 (200,200)画一个长200,高200的矩形
lcd_uninit();
}
文字取模与显示
前面我们实现了LCD屏幕的显示操作
那我我们是否可以在LCD屏幕上显示文字呢
早期的文字本身就是一种象形文 ==》按照物品的形状用简单的线条来描绘
山 本质上 文字其实也是图片的一种,只不过文字是一种简单的两色图形,字体本身是一种颜色,字体周围是另外一种颜色构成的简单图形
在编程语言中,它是无法直接表示一副图像,因为计算机只能识别二进制码,如何在计算机中描述上诉的文字呢
==》上面的文字其实就是一副只有两种颜色的图片,可以用1和0来表示该图像中那些像素点显示颜色,那些像素点不显示颜色
00001000 0X08
00001000 0X08
00001000 0X08
01001001 0X49
01001001 0X49
01001001 0X49
01001001 0X49
01001001 0X49
01001001 0X49
01001001 0X49
01001001 0X49
01111111 0X7F
上述二进制码0表示底色,1表示字体颜色,按8bit为单位转换为十六进制表示,最高位表示对应的第一个像素点是否有颜色,最低bit表示第八个像素点是否有颜色
任意给定一个十六进制编码,就可以判断出那些bit位需要显示颜色,那些不需要显示颜色
//t是一个十六进制码,(x,y)是显示的位置
for(i=7;i >=0,i--)//遍历一个十六进制码的每一个bit
{
if( t>> i &1)
{
//说明对应的bit位需要上色
lcd_draw_point(x+(7-i),y,color);//x+(7-i)将十六进制码与其对应的像素点坐标确定下来
}
}
一个文字必然是有多个十六进制码
unsigned char shan[] = {0X08,0X08,0X08,0X49,0X49,0X49,0X49,0X49,0X49,0X49,0X49,0X7F};
for(j=0;j<12;j++)//遍历一个字对应的所有十六进制码
{
//j的变化对显示位置的影响
for(i=7;i >=0,i--)//遍历一个十六进制码的每一个bit
{
if(shan[j]>> i &1)
{
//说明对应的bit位需要上色
lcd_draw_point(x+(7-i),y+j,color);//x+(7-i)将十六进制码与其对应的像素点坐标确定下来
}
}
}
此函数显示的文字,受限于字模的大小,显示得比较小,并且每个文字都自己去取模太麻烦了
因此我们可以使用一个取模软件
在文字输入区 右键,可以选择字体和大小
使用方法:
1 在文字输入区输入要取模的文字
2 在参数设置中有一个其他选项,确认取模方式
3 在文字输入框中输入ctrl+回车 生成字模图案,看是否满足需要
麻烦了
因此我们可以使用一个取模软件
[外链图片转存中…(img-gARznoNC-1686929911754)]
在文字输入区 右键,可以选择字体和大小
使用方法:
1 在文字输入区输入要取模的文字
2 在参数设置中有一个其他选项,确认取模方式
[外链图片转存中…(img-GGqmxJ1y-1686929911755)]
3 在文字输入框中输入ctrl+回车 生成字模图案,看是否满足需要
4 在取模方式中选择c51格式 生成字模后,会将我们输入的每一个字都转换成十六进制码
案例代码:显示自己小组成员名字(只需在zimu.h中更改名字的字符编码后然后运行,二维数组的行数代表字的个数)
zimu.h
#ifndef __ZIMU_H__
#define __ZIMU_H__
static unsigned char myzimu[9][32*29/8] = {
/*-- 文字: 熊 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x03,0x81,0x80,0x00,0x03,0xC1,0xE0,0x00,0x07,0x81,0xC3,0x00,
0x07,0x39,0xCF,0x80,0x0C,0x1D,0xFE,0x00,0x3F,0xFF,0xF0,0xC0,0x3F,0xFF,0xC0,0xC0,
0x1C,0x07,0xC0,0xC0,0x08,0x19,0xFF,0xE0,0x1F,0xFC,0xFF,0xC0,0x0E,0x1D,0x80,0x00,
0x0E,0x1D,0xE0,0x00,0x0F,0xFD,0xC3,0x00,0x0E,0x1D,0xCF,0x80,0x0E,0x1D,0xFF,0x00,
0x0F,0xFD,0xF0,0xC0,0x0E,0x1D,0xC0,0xC0,0x0E,0x1D,0xC0,0xC0,0x0E,0xFD,0xFF,0xE0,
0x0E,0xF8,0xFF,0xE0,0x1C,0x38,0x00,0x00,0x06,0x01,0x87,0x00,0x0C,0x70,0xE3,0x80,
0x0C,0x38,0xE1,0xC0,0x1C,0x38,0xF1,0xE0,0x3C,0x3C,0x70,0xE0,0x38,0x18,0x70,0xC0,
0x00,0x00,0x00,0x00},
/*-- 文字: 全 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1F,0x00,0x00,
0x00,0x1F,0x00,0x00,0x00,0x3D,0x80,0x00,0x00,0x79,0xC0,0x00,0x00,0x70,0xE0,0x00,
0x00,0xE0,0x70,0x00,0x01,0xE0,0x3C,0x00,0x03,0xC0,0x1F,0x00,0x07,0x80,0x1F,0xE0,
0x0F,0xFF,0xFF,0xF0,0x1D,0x87,0x01,0xE0,0x78,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x0E,0x00,0x07,0xFF,0xFF,0x00,0x03,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x80,
0x00,0x07,0x01,0xC0,0x3F,0xFF,0xFF,0xE0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00},
/*-- 文字: 明 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x81,0xC0,0x18,0x31,0xFF,0xC0,
0x1F,0xF9,0xC1,0xC0,0x1C,0x39,0xC1,0xC0,0x1C,0x39,0xC1,0xC0,0x1C,0x39,0xC1,0xC0,
0x1C,0x39,0xC1,0xC0,0x1C,0x39,0xC1,0xC0,0x1C,0x39,0xFF,0xC0,0x1F,0xF9,0xC1,0xC0,
0x1C,0x39,0xC1,0xC0,0x1C,0x39,0xC1,0xC0,0x1C,0x39,0xC1,0xC0,0x1C,0x3B,0xC1,0xC0,
0x1C,0x3B,0xFF,0xC0,0x1F,0xFB,0x81,0xC0,0x1C,0x3B,0x81,0xC0,0x1C,0x33,0x81,0xC0,
0x1C,0x03,0x81,0xC0,0x00,0x07,0x01,0xC0,0x00,0x07,0x01,0xC0,0x00,0x0E,0x01,0xC0,
0x00,0x1C,0x31,0xC0,0x00,0x38,0x3F,0xC0,0x00,0xF0,0x07,0x80,0x01,0xC0,0x03,0x00,
0x00,0x00,0x00,0x00},
/*-- 文字: 张 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x63,0xC0,0x00,
0x7F,0xF3,0x81,0x00,0x30,0xE3,0x83,0x80,0x00,0xE3,0x87,0xC0,0x00,0xE3,0x87,0x80,
0x00,0xE3,0x8E,0x00,0x18,0xE3,0x9C,0x00,0x1F,0xE3,0xB8,0x00,0x1C,0xE3,0xF0,0x00,
0x38,0x03,0xC0,0x00,0x38,0x03,0x80,0xE0,0x38,0xFF,0xFF,0xF0,0x7F,0xFB,0xE0,0x00,
0x39,0xC3,0xB0,0x00,0x01,0xC3,0xB0,0x00,0x01,0xC3,0xB8,0x00,0x01,0xC3,0x98,0x00,
0x01,0xC3,0x9C,0x00,0x01,0xC3,0x8E,0x00,0x01,0xC3,0x8F,0x00,0x01,0xC3,0xBF,0x80,
0x33,0xC3,0xF3,0xF0,0x1F,0x83,0xC1,0xF0,0x0F,0x83,0x80,0xC0,0x06,0x03,0x80,0x00,
0x00,0x00,0x00,0x00},
/*-- 文字: 晨 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x00,0x03,0xFF,0xFF,0x00,0x03,0x80,0x07,0x00,
0x03,0x80,0x07,0x00,0x03,0xFF,0xFF,0x00,0x03,0x80,0x07,0x00,0x03,0x80,0x07,0x00,
0x03,0xFF,0xFF,0x00,0x03,0x80,0x07,0x00,0x0E,0x00,0x01,0x80,0x0F,0xFF,0xFF,0xC0,
0x0E,0x00,0x00,0x00,0x0E,0x00,0x0E,0x00,0x0F,0xFF,0xFF,0x00,0x0E,0x80,0x00,0x00,
0x0E,0x00,0x00,0xE0,0x0F,0xFF,0xFF,0xF0,0x0E,0xE6,0x1E,0x00,0x0E,0xE3,0x1E,0x00,
0x1C,0xE3,0xB8,0x00,0x1C,0xE1,0xF0,0x00,0x1C,0xE0,0xF0,0x00,0x1C,0xE3,0xFC,0x00,
0x18,0xFF,0x3F,0xE0,0x38,0xFC,0x0F,0xF0,0x70,0x70,0x03,0xC0,0x60,0x60,0x00,0x00,
0x00,0x00,0x00,0x00},
/*-- 文字: 宇 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x80,0x00,
0x00,0x07,0x80,0x00,0x0C,0x03,0x01,0xC0,0x0F,0xFF,0xFF,0xE0,0x0E,0x00,0x01,0xE0,
0x1E,0x00,0x03,0x80,0x3C,0x00,0x03,0x00,0x1C,0x00,0x1E,0x00,0x07,0xFF,0xFF,0x00,
0x03,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0xC0,0x00,0x07,0x01,0xE0,
0x7F,0xFF,0xFF,0xF0,0x30,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0xE7,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00},
/*-- 文字: 王 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,
0x1F,0xFF,0xFF,0xC0,0x08,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x07,0x00,0x0F,0xFF,0xFF,0x80,0x06,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0xE0,0x7F,0xFF,0xFF,0xF0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00},
/*-- 文字: 志 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x03,0x80,0x1F,0xFF,0xFF,0xC0,
0x0C,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,
0x00,0x07,0x0E,0x00,0x07,0xFF,0xFF,0x00,0x03,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,
0x00,0x0F,0x00,0x00,0x00,0x87,0x80,0x00,0x0E,0xE7,0x87,0x00,0x0C,0xE3,0x83,0x80,
0x0C,0xE3,0x9D,0xC0,0x1C,0xE0,0x1D,0xE0,0x3C,0xE0,0x1C,0xF0,0x3C,0xE0,0x1C,0xE0,
0x38,0xFF,0xFE,0x60,0x00,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00},
/*-- 文字: 鹏 --*/
/*-- 宋体22; 此字体下对应的点阵为:宽x高=29x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x31,0xB3,0x8F,0x00,0x3F,0xFF,0xEC,0xC0,0x3B,0xBB,0xFF,0xE0,0x3B,0xBB,0xF0,0xE0,0x3B,0xBB,0xFC,0xE0,0x3B,0xBB,0xFE,0xE0,
0x3B,0xBB,0xF7,0xE0,0x3B,0xBB,0xF7,0xE0,0x3F,0xBF,0xF7,0xE0,0x3B,0xBB,0xFF,0xC0,
0x3B,0xBB,0xF7,0xC0,0x3B,0xBB,0xF3,0x80,0x3B,0xBB,0xF0,0x60,0x3B,0xBB,0xFF,0xF0,
0x3F,0xBF,0xB0,0x70,0x3B,0xBB,0x80,0x70,0x3B,0xB3,0x80,0x70,0x3B,0xB3,0x83,0x60,
0x3B,0xB3,0xFF,0xE0,0x3B,0xF3,0xC0,0xE0,0x3B,0xF3,0x80,0xE0,0x33,0xF3,0x80,0xE0,
0x7F,0xE3,0x80,0xE0,0x67,0xFF,0x8F,0xE0,0x60,0xCF,0x07,0xC0,0xC1,0x86,0x01,0x80,
0x00,0x00,0x00,0x00}
};
#endif
main.c
#include"lcd.h"
#include"zimu.h"
int main(void)
{
int i = 0;
lcd_init();
lcd_draw_clear(0,0,800,480,0x000000);//清屏函数,用来将从(x0,y0)为起点,宽w高h的矩形区域显示为color
//show_shan(200,200,0xff0000);
for ( i = 0; i < 9; i++)
{
lcd_draw_word(myzimu[i],32,29,100+i*32,100,0xff0000);
}
lcd_uninit();//释放LCD屏幕;解除映射,关闭LCD屏幕文件
return 0;
}
lcd.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int lcdfd = 0;
ssize_t rsize = 0;
int x=0,y=0;
int*plcd =NULL;//LCD屏幕文件的内容是像素点的颜色值,一个颜色值是32位的,因此可以直接用int*指针指向映射空间的首地址,即plcd指向的就是一个像素点
/*打开LCD屏驱动设备文件*/
int lcd_init(void)
{
lcdfd = open("/dev/fb0",O_RDWR);//打开lcd屏幕
if (lcdfd == -1)
{
perror("open lcd error");
return -1;
}
/*da将LCD屏映射到内存空间 =》Frame Buffer 帧缓冲设备*/
plcd = (int*)mmap(NULL,//系统自动选择映射地址
800*480*32/8,//映射空间大小(单位 字节),屏幕800*480个像素点,每个像素点32位(32/8)字节
PROT_READ|PROT_WRITE, //具备读写权限
MAP_SHARED,//共享映射,对映射内存空间的操作会被同步到文件
lcdfd,//指定映射的文件
0);//从文件头开始映射
if (MAP_FAILED == plcd)
{
perror("mmap lcd error");
close(lcdfd);
return -1;
}
}
int lcd_draw_point(int x,int y,int color)
{
if(x<0||x>=800||y<0||y>=480)
{
printf("指定画点坐标超出屏幕范围\n");
return -1;
}
*(plcd+y*800+x)=color;
}
int lcd_draw_clear(int x0,int y0,int w,int h,int color)
{
int x=0,y=0;
for(x=x0;x<x0+w;x++)
{
for (y=y0; y < y0+h; y++)
{
lcd_draw_point(x,y,color);
}
}
}
int lcd_draw_fourleafclover(void)//四叶草
{
}
int lcd_draw_rainbow(void)//彩虹
{
}
/*解除映射,关闭屏幕文件*/
int lcd_uninit(void)
{
munmap(plcd,800*480*32/6);
close(lcdfd);
return 0;
}
void show_shan(int x0,int y0,int color)
{
unsigned char shan[] = {/*-- 文字: 山 --*/
/*-- 楷体22; 此字体下对应的点阵为:宽x高=30x29 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=32x29 --*/
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x00,0x0C,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x02,0x00,
0x00,0x07,0x03,0xC0,0x00,0x07,0x03,0xC0,0x1C,0x07,0x03,0xC0,0x1E,0x07,0x03,0x80,
0x0F,0x07,0x03,0x80,0x0F,0x07,0x03,0x80,0x07,0x07,0xFF,0x80,0x06,0xFF,0xFF,0x80,
0x0F,0xFE,0x03,0x80,0x1F,0xC0,0x07,0x80,0x0E,0x00,0x07,0x80,0x00,0x00,0x07,0x00,
0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
};
int i,j;
for(j=0;j<32*29/8;j++)//遍历一个字对应的所有十六进制码
{
//j的变化对显示位置的影响
for(i=7;i >=0;i--)//遍历一个十六进制码的每一个bit
{
if(shan[j]>> i &1)
{
//说明对应的bit位需要上色
lcd_draw_point(x0+(7-i)+(j%4)*8,y0+j/4,color);
//x+(7-i)将十六进制码与其对应的像素点坐标确定下来
//+(j%4)*8 每一行有32个像素点,由四个字节来表示
}
}
}
}
void lcd_draw_word(unsigned char word16[],int w,int h,int x0,int y0,int color)
{
int i,j;
for(j=0;j<w*h/8;j++)//遍历一个字对应的所有十六进制码
{
//j的变化对显示位置的影响
for(i=7;i >=0;i--)//遍历一个十六进制码的每一个bit
{
if(word16[j]>> i &1)
{
//说明对应的bit位需要上色
lcd_draw_point(x0+(7-i)+(j%(w/8))*8,y0+j/(w/8),color);
//x+(7-i)将十六进制码与其对应的像素点坐标确定下来
//+(j%4)*8 每一行有32个像素点,由四个字节来表示
}
}
}
}
lcd.h
#ifndef __LCD_H__
#define __LCD_H__
extern int lcdfd;//保存LCD屏幕文件的文件描述符
extern int *plcd;//保存LCD屏幕映射内存首地址
int lcd_init(void);//初始化LCD屏幕;打开和映射LCD屏幕文件
int lcd_uninit(void);//释放LCD屏幕;解除映射,关闭LCD屏幕文件
int lcd_draw_point(int x,int y,int color);//花点函数,用来将坐标为(x,y)的像素点显示为color
int lcd_draw_clear(int x0,int y0,int w,int h,int color);//清屏函数,用来将从(x0,y0)为起点,宽w高h的矩形区域显示为color
int lcd_draw_fourleafclover(void);//四叶草
int lcd_draw_rainbow(void);//彩虹
void show_shan(int x0,int y0,int color);
void lcd_draw_word(unsigned char word16[],int w,int h,int x0,int y0,int color);
#endif