免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1871 | 回复: 4
打印 上一主题 下一主题

[学习分享] 有关代码的问题,求大神指导!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-08 10:46 |只看该作者 |倒序浏览
20可用积分
  这个代码怎么显示中文或者可以向上翻页




#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include "font_8x16.h"

#define Width                320                        //LCD屏的宽度
#define Heigth                240                        //LCD屏的高度
#define Start_x         8                        //屏-左上角的起始坐标  x   y
#define Start_y                8
#define End_x                (Width -         //屏-左上角的起始坐标  x   y
#define End_y                (Heigth        -        
       
int fk;                                                         //按键的文件描述符
char button_status[6];
int fp=0;                                                        //LCD屏的文件描述符
struct fb_var_screeninfo vinfo;         //LCD可变参数结构体
struct fb_fix_screeninfo finfo;                //LCD固定参数结构体
char *fbp = 0;
long screensize=0;                                        //初始化屏幕大小为0
int s_x = 0, s_y = 0,id = 0;                     //屏幕的x y 坐标




//清屏
void clear_screen()
{
    memset(fbp, 0xf8, screensize);
}

//绘制单个字符
void Draw_8X16(int x, int y, const unsigned char ch[])
{
    int i = 0, j = 0;
    unsigned char mask, buffer;
    long location_tt;
    location_tt = x * vinfo.bits_per_pixel / 8 + y *finfo.line_length;

    for (i = 0; i < 16; i++)
    {
        mask = 0x80;
                buffer = ch[i];
                location_tt +=  finfo.line_length;
        for (j = 0; j < 8; j ++)
        {
            if ((buffer & mask)) {
                                *(fbp +location_tt + j * vinfo.bits_per_pixel / = 0;
                                *(fbp +location_tt + j * vinfo.bits_per_pixel / 8 + 1) = 0;
                         }
                         mask = mask >> 1;
        }
    }
        s_x += 8;
}

//绘制单个汉字    16 * 16
void Draw_16X16(int x, int y, const unsigned char ch[])
{
    int i = 0, j = 0;
    unsigned char mask, buffer;
    long location_tt;
    location_tt = x * vinfo.bits_per_pixel / 8 + y * finfo.line_length;

    for (i = 0; i < 16; i++)
        {
                mask = 0x80;
                buffer = ch[i * 2];
                location_tt +=  finfo.line_length;
                for (j = 0; j < 8; j++) {
                        if ((buffer & mask)) {
                                *(fbp +location_tt + j * vinfo.bits_per_pixel / = 0;
                                *(fbp +location_tt + j * vinfo.bits_per_pixel / 8 + 1) = 0;
                         }
                         mask = mask >> 1;
                 }

                mask = 0x80;
                buffer = ch[i * 2 + 1];
                for (j = 0; j < 8; j++)
                {
                        if ((buffer & mask))
                        {
                                *(fbp +location_tt + (8 + j) * vinfo.bits_per_pixel / = 0;
                                *(fbp +location_tt + (8 + j) * vinfo.bits_per_pixel / 8 + 1) = 0;
                        }
                        mask = mask >> 1;
                }
        }
        s_x += 16;
}

//判断是否换行   x坐标
int Is_next_line(int x)       
{
        if (x >= End_x)
                return 1;
        return 0;
}

//跳到下一行
int Next_line(int y)
{
        //sleep(1);
        y = y + 16;
        s_y = y;
        s_x = Start_x;
        return y;
}

//判断是否换屏   y坐标
int Is_next_screen(int y)
{
        if (y >= End_y -
                return 1;
        return 0;
}

//清屏,跳到下一屏
void   Next_screen()
{
        int ret;
int i;
        while (1)
        {
                ret = read(fk, button_status, 6);
                if (ret < 0)
                {
                        printf("read button status err\n";
                }
                //按键控制翻到下一页
                if (button_status[0] == '1')
                {
                        //清屏
                        clear_screen();
                        //s_x = Start_x;
                        s_y = Start_y;
                        break;
                }
                if (button_status[1] == '1'){
                        for(i=0;i<255;i++) ;
                        if (button_status[1] == '1'){
                                clear_screen();
                                printf("%d\n",id);
                                id=id-532;
                                        s_y = Start_y;
                                break;}
                       
                }
    }
//        sleep(2);

}

//清屏,跳到上一屏
void UP_screen(unsigned int zf_index)
{
        int ret;
        //int i=0;
//        unsigned char *buffer;
        //unsigned char buf[16];
        while (1)
        {
                ret = read(fk, button_status, 6);
                if (ret < 0)
                {
                        printf("read button status err\n";
                }
                //按键控制翻到上一页
                if (button_status[1] == '1')
                {
                        //清屏
                        clear_screen();
                        //s_x = Start_x;
                        //zf_index = buffer[i] * 16;
                //        memcpy(buf, (const void *)&Assic[zf_index], 16);
                        s_y=zf_index;
                        break;
                }
    }
//        sleep(2);
}



//绘制一行字符   
void Put_text_ch(int x, int y, int size, const unsigned char ch[])
{
    int i = 0, j = 0;
    unsigned char buffer[16];
    for (i = 0; i < size; i++)
    {
        for (j = 0; j < 16; j++)
        {
            buffer[j] = ch[i * 16 + j];
        }
                if (i != 0)
                        x += 8;
                if(Is_next_line(x))
                {
                        y = Next_line(y);
                        x = s_x;
                        if (Is_next_screen(y))
                        {
                                Next_screen();
                                y = s_y;
                        }
                }
        Draw_8X16(x, y, buffer);
    }
}

//绘制一行汉字   
void Put_text_hz(int x, int y, int size, const unsigned char ch[])
{
    int i = 0, j = 0;
    unsigned char buffer[32];
    for (i = 0; i < size; i++)
    {
        for (j = 0; j < 32; j++)
        {
            buffer[j] = ch[i * 32 + j];
        }
                if (i != 0)
                        x += 16;
                if(Is_next_line(x))
                {
                        y = Next_line(y);
                        x = s_x;
                        if (Is_next_screen(y))
                        {
                                Next_screen();
                                y = s_y;
                        }
                }
        Draw_16X16(x, y, buffer);
    }
}

//打开LCD设备
void open_lcd()
{
        //以可读可写的方式打开LCD设备
    fp = open ("/dev/fb0",O_RDWR);
        //错误冗余
    if (fp < 0){
        printf("Error : Can not open framebuffer device\n";
        exit(1);
    }
        //在超级终端打印下面两句话
        puts("hello, world.\n";
        printf("open framebuffer device\n";
        //获取屏幕相关参数       
    if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
        printf("Error reading fixed information\n";
        exit(2);
    }
    if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
        printf("Error reading variable information\n";
        exit(3);
    }

        //计算屏幕缓冲区大小
    screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;   //单帧画面空间

        printf("可见屏幕一行有多少个像素点:xres= %d\n", vinfo.xres);
        printf("可见屏幕一列有多少个像素点:yres = %d\n", vinfo.yres);
        printf("每个相似的位数即BPP: bits_per_pixel = %d\n", vinfo.bits_per_pixel);

    /*这就是把fp所指的文件中从开始到screensize大小的内容给映射出来,得到一个指向这块空间的指针*/
    fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);
    if ((int) fbp == -1)
    {
         printf ("Error: failed to map framebuffer device to memory.\n";
         exit (4);
    }
        printf("The Framebuffer device was mapped to memory successfully!\n";
}

//关闭LCD设备
void close_lcd()
{
        munmap (fbp, screensize); /*解除映射*/
    close (fp);    /*关闭文件*/
}

//打开文本文件
int open_txt()
{
        int fd_t;
        fd_t = open("./1.txt",0);
        if (fd_t < 0)
        {
                printf("txt can't open!\n";
                return (-1);
        }
        return fd_t;
}

//关闭文本文件
void close_txt(int fd_t)
{
        close(fd_t);
}

//计算文件总字节数       
off_t cal_filesize(fd_t)
{
        struct stat txt_stat;
        off_t file_size_t = 0;

        fstat(fd_t, &txt_stat);
        file_size_t = txt_stat.st_size;
        printf("file_size = %d\n", file_size_t);
        return file_size_t;       
}

int open_buttons()
{
        int fk_t;
        fk_t = open("/dev/buttons", O_RDWR);
        if (fk_t < 0)
        {
                printf("can't open /dev/buttons\n");
                return -1;
        }
        return fk_t;
}

void close_buttons(int fk_t)
{
        close(fk_t);       
}

int main(void)
{
        int fd;
        unsigned char *buffer;
        off_t file_size = 0;       
        int k = 0;
        unsigned int zf_index;
        unsigned char buf[16];
       
        fk = open_buttons();
       
        open_lcd();       
        clear_screen();
       
        s_x = Start_x;
        s_y = Start_y;

        //传过去的应该是文件路径
        fd = open_txt();
        if (fd < 0)
        {
                printf("txt can't open!\n");
                return (-1);
        }

        //计算文件总字节数       
        file_size = cal_filesize(fd);

        buffer = (unsigned char *)malloc(file_size);
        memset(buffer, 0, file_size);

        read(fd, buffer, file_size);
        //printf("%s\n", buffer);
       
        for (id = 0; id < file_size - 1; id++)
        {
               
                //判断文本中的当前字是不是换行符
                if (buffer[id] == '\n')
                {
                        //换行
                        Next_line(s_y);
                        //判断一下是不是又刚好是换屏
                        if (Is_next_screen(s_y))
                                Next_screen();
                               
                        continue;
                }
       
               
                zf_index = buffer[id] * 16;
                memcpy(buf, (const void *)&Assic[zf_index], 16);
                /*for (k = 0; k < 16; k++)
                        printf("0x%x\t",buf[k]);
                printf("\n");
                */
                Put_text_ch(s_x, s_y, 1, buf);
               
        }
       
        close_txt(fd);
        close_lcd();
        close_buttons(fk);
        return 0;
}



论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
2 [报告]
发表于 2013-01-08 12:37 |只看该作者
本帖最后由 mci2004 于 2013-01-08 12:44 编辑

编辑器用 vim吗?

在vim中会默认用 utf-8来编码中文,然后在vim中向下翻页是 Ctrl+d。

还是我理解错了你的问题?

论坛徽章:
0
3 [报告]
发表于 2013-01-08 13:10 |只看该作者
回复 2# mci2004
我是想改下这个程序,然后运行后能显示中文(现在运行后只能显示英文)

   

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
4 [报告]
发表于 2013-01-08 21:20 |只看该作者
回复 3# q1030965736

哦,这个意思啊。我看题不认真,不懂,坐等大神吧!
   

论坛徽章:
0
5 [报告]
发表于 2013-01-08 21:35 |只看该作者
回复 4# mci2004
没事,谢谢你回帖

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP