📄 testlcd.c
字号:
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include "pic.h"#include "chinese.h"#include "fbutils.h"#include "font_8x16.c"#define LCD_TEST 0x1#define LCD_LOAD_PIC 0x2#define LCD_BACKLIGHT_ON 0x3#define LCD_CONTRAST_SET 0x4#define LCD_DISP_TIME 0x5#define XORMODE 0x80000000#define MAX_BUFF_LEN 3200#define LINE_LEN 20#define YRES 160#define XRES 160typedef struct lcd_data { unsigned int len; unsigned int data; unsigned char buf[MAX_BUFF_LEN+1];}lcd_data;#define MAX_CHAR_PERLINE 0xAunsigned char lcd_buffer[MAX_BUFF_LEN];int fontw = 8;
int fonth = 16;void WriteHz(char *s, int x, int y);void WriteEc(char *s, int x, int y);void WriteChar(unsigned int offset, int x, int y);void inline putdot(unsigned int x, unsigned int y);void fb_clear(unsigned colidx);
void fb_fresh(void);void fb_time_fresh(void);
void fb_blacklight(int on); //on =1 开
void pixel (int x, int y, unsigned colidx);
void line (int x1, int y1, int x2, int y2, unsigned colidx);
void rect (int x1, int y1, int x2, int y2, unsigned colidx);
void box (int x1, int y1, int x2, int y2, unsigned colidx);
void put_string(int x, int y, char *s, unsigned colidx);void put_char(int x, int y, int c, int colidx);int fdasc16, ffd16;int fd;static struct lcd_data ioctl_data;int main(){ unsigned int i, j; unsigned char * chp = Chinese; unsigned char * chq = Chinesemisc; fd = open("/dev/LCD", O_RDWR); if(fd < 0){ printf("Device open failed!\n"); exit(1); } if((fdasc16=open("asc16", O_RDONLY))==-1) { printf("asc16 open failed!\n"); return errno; } if((ffd16=open("nsong16", O_RDONLY))==-1) { printf("hzk16 open failed!\n"); return errno; } fb_blacklight(1); memset(lcd_buffer, 0x0, MAX_BUFF_LEN); put_string(10, 10, "This is a test!", 0x1); memcpy(ioctl_data.buf, lcd_buffer, MAX_BUFF_LEN); ioctl(fd, LCD_LOAD_PIC, &ioctl_data); sleep(1); memset(lcd_buffer, 0x0, MAX_BUFF_LEN); WriteHz(chp, 0, 0); WriteHz(chp, 2, 1); WriteHz(chp, 4, 2); WriteHz(chp, 6, 3); WriteHz(chp, 8, 4); WriteHz(chp, 10, 5); WriteHz(chp, 12, 6); memcpy(ioctl_data.buf, lcd_buffer, MAX_BUFF_LEN);// memcpy(ioctl_data.buf, pic1, sizeof(pic1)); ioctl(fd, LCD_LOAD_PIC, &ioctl_data); for ( i = 0; i < 320; i ++) lcd_buffer[i] = 0xAA; memcpy(ioctl_data.buf, lcd_buffer, 16*20); ioctl(fd, LCD_DISP_TIME, &ioctl_data); sleep(5); for ( i = 0; i < 320; i ++) lcd_buffer[i] = 0x1; memcpy(ioctl_data.buf, lcd_buffer, 16*20); ioctl(fd, LCD_DISP_TIME, &ioctl_data); sleep(5); fb_blacklight(0); sleep(1); fb_blacklight(1); memset(lcd_buffer, 0x0, MAX_BUFF_LEN); WriteEc(chq, 0, 0); WriteEc(chq, 1, 1); WriteEc(chq, 2, 2); WriteEc(chq, 3, 3); WriteEc(chq, 4, 4); WriteEc(chq, 5, 5); WriteEc(chq, 6, 6); memcpy(ioctl_data.buf, lcd_buffer, MAX_BUFF_LEN);// memcpy(ioctl_data.buf, pic2, sizeof(pic2)); ioctl(fd, LCD_LOAD_PIC, &ioctl_data); sleep(1); ioctl_data.data = 0x0505; ioctl(fd, LCD_CONTRAST_SET, &ioctl_data); sleep(1); fb_clear(0xAA); sleep(1); fb_clear(0x00); sleep(1); box(0, 0, 100, 50, 0x1); fb_fresh(); close(fdasc16); close(ffd16); close(fd); return 0;}void WriteHz(char *s, int x, int y){ unsigned char bit[8] = {128,64,32,16,8,4,2,1}; long int fpos, currpos, status; char bitdata[32]; int i,j; fpos = 32L*((s[0]-161)*94 + (s[1]-161)); currpos = lseek(ffd16, fpos, SEEK_SET); if(currpos == -1){ printf("lseek failed, fpos=%d!\n", fpos); return ; } status = read(ffd16, bitdata, 32); if(status != 32){ printf("Read file failed!\n"); return; } for(i=0; i<16; i++){ for(j=0; j<8; j++){ if(bitdata[2*i]&bit[j]) putdot(x*8+j,i+y*8); if(bitdata[2*i+1]&bit[j]) putdot(x*8+8+j,i+y*8); } }}void inline putdot(unsigned int x, unsigned int y){ pixel(x, y, 0x1);}void WriteEc(char *s, int x, int y){ unsigned char bit[8] = {128,64,32,16,8,4,2,1}; unsigned long int fpos, currpos, status; char bitdata[32]; int i,j; fpos = 16*s[0]; currpos = lseek(fdasc16, fpos, SEEK_SET); if(currpos == -1){ printf("lseek failed, fpos=%d!\n",fpos); return ; } status = read(fdasc16, bitdata, 16); if(status != 16){ printf("Read file failed!\n"); return ; } for(i=0; i<16; i++){ for(j=0; j<8; j++){ if(bitdata[i]&bit[j]) putdot(x*8+j,i+y*8); } }}void WriteChar(unsigned int offset, int x, int y){ memcpy(lcd_buffer+x*128+y*8, chinese8+offset*8, 8);}void fb_clear(unsigned colidx)
{
int i;
for(i=0; i<YRES*LINE_LEN; i++){
*(unsigned char*)(lcd_buffer+i) = colidx;
} fb_fresh();
}
void fb_time_fresh(void){ memcpy(ioctl_data.buf, lcd_buffer, 16*20); ioctl(fd, LCD_DISP_TIME, &ioctl_data);}
void fb_fresh(void)
{
memcpy(ioctl_data.buf, lcd_buffer, MAX_BUFF_LEN); ioctl(fd, LCD_LOAD_PIC, &ioctl_data);}
void fb_blacklight(int on) //on =1 开
{ ioctl_data.data = on;
ioctl(fd, LCD_BACKLIGHT_ON, &ioctl_data);
}
void pixel (int x, int y, unsigned colidx)
{
unsigned int xormode;
char *loc;
unsigned char data, mask,byte = 0;
if ((x<0) || (x>=XRES) || (y<0) || (y>=YRES))
return;
x = 159 - x;
xormode = colidx & XORMODE;
colidx &= ~XORMODE;
if(colidx){
byte = 0x01;
}
loc = lcd_buffer + y*LINE_LEN + x/8;
data = *loc;
x &= 0x07;
mask = 0x80>>x;
byte <<= (7 - x);
if(xormode){
data ^= byte;
}else{
data &= ~mask;
data |= byte;
}
*loc = data;
}
void put_char(int x, int y, int c, int colidx)
{
int i,j,bits;
for (i = 0; i < fonth; i++) {
bits = font_8x16_data[fonth * c + i];
for (j = 0; j < fontw; j++, bits <<= 1){
if (bits & 0x80)
pixel (x + j, y + i, colidx);
}
}
}
void put_string(int x, int y, char *s, unsigned colidx)
{
int i;
for (i = 0; *s; i++, x += fontw, s++)
put_char (x, y, *s, colidx);
}
void line (int x1, int y1, int x2, int y2, unsigned colidx)
{
int tmp;
int dx = x2 - x1;
int dy = y2 - y1;
if (abs (dx) < abs (dy)) {
if (y1 > y2) {
tmp = x1; x1 = x2; x2 = tmp;
tmp = y1; y1 = y2; y2 = tmp;
dx = -dx; dy = -dy;
}
x1 <<= 16;
/* dy is apriori >0 */
dx = (dx << 16) / dy;
while (y1 <= y2) {
pixel (x1 >> 16, y1, colidx);
x1 += dx;
y1++;
}
} else {
if (x1 > x2) {
tmp = x1; x1 = x2; x2 = tmp;
tmp = y1; y1 = y2; y2 = tmp;
dx = -dx; dy = -dy;
}
y1 <<= 16;
dy = dx ? (dy << 16) / dx : 0;
while (x1 <= x2) {
pixel (x1, y1 >> 16, colidx);
y1 += dy;
x1++;
}
}
}
void rect (int x1, int y1, int x2, int y2, unsigned colidx)
{
line (x1, y1, x2, y1, colidx);
line (x2, y1, x2, y2, colidx);
line (x2, y2, x1, y2, colidx);
line (x1, y2, x1, y1, colidx);
}
void box (int x1, int y1, int x2, int y2, unsigned colidx)
{
int y;
if(y1>y2){
y = y1;
y1 = y2;
y2 = y;
}
for(y=y1; y<=y2; y++){
line(x1, y, x2, y, colidx);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -