鱼C论坛

 找回密码
 立即注册
查看: 938|回复: 4

[已解决]想跟着老板学学编程,结果给我这个东西让我自己看,我是不是没救了= =,

[复制链接]
发表于 2019-12-21 23:27:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
感觉老板是在为难我= = ,我刚才刚看懂了hello world的程序OTL










#include "LCD12864.H"
#include "base.h"
#include "FONTZK.H"

//*********************************************************************************************************
//** 函数名称 :delay(void)
//** 函数功能 :us级延时
//** 入口参数 :延时长短
//** 出口参数 :无
//*********************************************************************************************************

void delay(uint8 value)
{
    uint8 i;
    uint32 j;
    for(i=1; i<value; i++)
       for(j=1; j<5000; j++);

}

//*********************************************************************************************************
//** 函数名称 :delayNS(void)
//** 函数功能 :NS级延时
//** 入口参数 :延时长短 NS
//** 出口参数 :无
//*********************************************************************************************************

void delayNS(uint8 value)
{
    uint8 i;
    uint16 j;
    for(i=1; i<value; i++)
       for(j=1; j<50; j++);

}

//*********************************************************************************************************
//** 函数名称 :SendData(uint8 d)
//** 函数功能 :总线数据发送
//** 入口参数 :d 上传数据
//** 出口参数 :无
//*********************************************************************************************************

void SendData(uint8 d)
{
    IO1CLR= LCD_S8;
    delayNS(0);
    IO1SET= LCD_S8 & (d<<18);
    delayNS(0);

}

//*********************************************************************************************************
//** 函数名称 :LCDWrite(uint8 side, uint8 flag, uint8 d)
//** 函数功能 :写控制字,数据
//** 入口参数 :side:左=1,右=0; flag:控制=1,数据=0; d:数据字
//** 出口参数 :无
//*********************************************************************************************************

void LCDWrite(uint8 side, uint8 flag, uint8 d)
{

    if(side)  // 左屏幕
    {  
        IO0SET = LCD_CS1;
        delayNS(0);
        IO0CLR = LCD_CS2;        
        delayNS(1);
        
        if(flag)
        {
            IO0CLR = LCD_RS;
            delayNS(0);
        }
        else
        {
            IO0SET = LCD_RS;
            delayNS(0);
        }
    }
    else // 右屏幕
    {
        IO0CLR = LCD_CS1;
        delayNS(0);
        IO0SET = LCD_CS2;
   
        delayNS(1);  //判断忙比较麻烦,给足够时间让液晶显示完毕

        if(flag)
        {
            IO0CLR = LCD_RS;
            delayNS(0);
        }
        else
        {
            IO0SET = LCD_RS;
            delayNS(0);
        }
    }
    IO0CLR = LCD_RW;
    delayNS(0);
    SendData(d);
    IO0SET = LCD_E;    //模拟下降沿触发
    delayNS(0);
    IO0CLR = LCD_E;
}

//*********************************************************************************************************
//** 函数名称 :ClearPage(uint8 page, uint8 scol, uint8 ecol)
//** 函数功能 :清页函数
//** 入口参数 :page :起始页, scol :起始列, ecol :结束列
//** 出口参数 :无
//*********************************************************************************************************

void ClearPage(uint8 page, uint8 scol, uint8 ecol)
{
    uint8 i;
  
    LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETPAGE | page);  // 设置左屏幕页面
    LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETPAGE | page); // 设置右屏幕页面
  
    if(ecol < 64) // 左屏幕
    {
        LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW | scol);
    }
    else if(scol>=64) // 右屏幕
    {
        LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW | (scol-64));
    }
    else // 跨页
    {
        LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW | scol);
        LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW);
    }
  
    for(i=scol; i<=ecol; i++)
    {
        if(i<64) // 左屏幕
            LCDWrite(LCD_LEFT, LCD_DATA, 0);
        else     // 右屏幕
            LCDWrite(LCD_RIGHT, LCD_DATA, 0);
    }
}

//*********************************************************************************************************
//** 函数名称 :ClearScreen(void)
//** 函数功能 :清屏函数
//** 入口参数 :无
//** 出口参数 :无
//*********************************************************************************************************

void ClearScreen(void)
{
    uint8  i;
  
    for(i=0; i<8; i++)
    {
        ClearPage(i, 0, 127);
    }
}

//*********************************************************************************************************
//** 函数名称 :LCDInit(void)
//** 函数功能 :初始化液晶
//** 入口参数 :无
//** 出口参数 :无
//*********************************************************************************************************

void LCDInit(void)
{
    LCDWrite(LCD_LEFT, LCD_CTL, LCD_SWITCH);   // 关闭左屏幕
    LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SWITCH);  // 关闭右屏幕
   
    LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETLINE);  // 设置左屏幕起始行 = 0
    LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETLINE); // 设置右屏幕起始行 = 0
  
    ClearScreen(); // 清屏
  
    LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETPAGE);  // 设置左屏幕页面
    LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETPAGE); // 设置右屏幕页面
    LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW);   // 设置左屏幕列
    LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW);  // 设置右屏幕列  
  
    LCDWrite(LCD_LEFT, LCD_CTL, LCD_SWITCH | 0x01);   // 开左屏幕
    LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SWITCH | 0x01);  // 开右屏幕
}

//*********************************************************************************************************
//** 函数名称 :PrintPage(uint8 flag, uint8 page, uint8 col, uint8 cnt, char *d)
//** 函数功能 :打印字符到指定页面上
//** 入口参数 :flag:正显反显标志  page:页面   col:列  cnt:字符的行占  *d 数据指针
//** 出口参数 :无
//*********************************************************************************************************

void PrintPage(uint8 flag, uint8 page, uint8 col, uint8 cnt, char *d)
{
    uint8  i;

    LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETPAGE | page);  // 设置左屏幕页面
    LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETPAGE | page); // 设置右屏幕页面
  
    if(col < 64) // 左, 跨页 屏幕
    {
        LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW | col);
        LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW);
    }
    else // 右屏幕
    {
        LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW | (col-64));
    }
  
    for(i=0; i<cnt; i++, col++)
    {
        if(col<64) // 左屏幕
        {
            if(flag)
                LCDWrite(LCD_LEFT, LCD_DATA, d[i]);
            else
                LCDWrite(LCD_LEFT, LCD_DATA, ~d[i]);
        }
        else // 右屏幕
        {
           if(flag)
               LCDWrite(LCD_RIGHT, LCD_DATA, d[i]);
           else
               LCDWrite(LCD_RIGHT, LCD_DATA, ~d[i]);
        }
    }

}

//*********************************************************************************************************
//** 函数名称 :PrintChar_6x8(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 6X8 字模
//** 入口参数 :flag:正显反显标志  page:页面   col:列   *d 数据指针
//** 出口参数 :无
//*********************************************************************************************************

void PrintChar_6x8(uint8 flag, uint8 page, uint8 col, char *d)
{
    PrintPage(flag, page, col, 6, d);
}

//*********************************************************************************************************
//** 函数名称 :PrintChar_4X8(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 6X8 字模
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************

void PrintChar_4X8(uint8 flag, uint8 page, uint8 col, char *d)
{
    PrintPage(flag, page, col, 4, d);
}

//*********************************************************************************************************
//** 函数名称 :PrintChar_16X16(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 6X8 字模
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************

void PrintChar_16X16(uint8 flag, uint8 page, uint8 col, char *d)
{
    PrintPage(flag, page, col, 16, &d[0]);
    PrintPage(flag, page+1, col, 16, &d[16]);
}

//*********************************************************************************************************
//** 函数名称 :PrintChar_12x16(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 12X16字符
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************
void PrintChar_8x16(uint8 flag, uint8 page, uint8 col, char *d)
{
    PrintPage(flag, page, col, 8, &d[0]);
    PrintPage(flag, page+1, col, 8, &d[8]);
}

//*********************************************************************************************************
//** 函数名称 :DrawIcon(uint8 flag, uint8 spage, uint8 scol, uint8 pagecnt, uint8 colcnt, char *d)
//** 函数功能 :显示图标
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************
void DrawIcon(uint8 flag, uint8 spage, uint8 scol, uint8 pagecnt, uint8 colcnt, char *d)
{
    uint8  i;
    for(i=0; i<pagecnt; i++)  // 页
    {
        PrintPage(flag, spage+i, scol, colcnt, &d[i*colcnt]);
    }
}

//*********************************************************************************************************
//** 函数名称 :Print_Chinese(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
//** 函数功能 :显示中文字符串 16X16
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :字符串长度
//*********************************************************************************************************
uint8 Print_Chinese(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
{
    va_list arg_ptr;
    char  c1[2];
    char  tmpBuf[40];    // LCD显示数据缓冲区
    uint8  offset=0, i, j, uLen;

    va_start(arg_ptr, fmt);
        uLen = (uint8)vsprintf(tmpBuf, fmt, arg_ptr);
    va_end(arg_ptr);
  
    for(i=0; i<uLen; i=i+2)
    {
        c1[0] = tmpBuf[i];        // 取字符索引
        c1[1] = tmpBuf[i+1];
      
        for(j=0; j<sizeof(CHI16X16)/sizeof(CHI16X16[0]); j++)  // 索引字模
        {
            if((c1[0] == CHI16X16[j].Index[0])&(c1[1] == CHI16X16[j].Index[1])) break;
        }
      
        PrintChar_16X16(flag, page, col+offset, (char*)CHI16X16[j].Msk); // 显示字符
        offset = offset+16;  // 显示完一个字符,列上移动1格
    }
    return uLen;  
}

//***********************  修改  大字符  8*16  *************


//*********************************************************************************************************
//** 函数名称 :Print_Large(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
//** 函数功能 :显示大字符串 12X16
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :字符串长度
//*********************************************************************************************************
uint8 Print_Large(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
{
    va_list arg_ptr;
    char  c1;
    char  tmpBuf[40];    // LCD显示数据缓冲区
    uint8  offset=0, i, j, uLen;

    va_start(arg_ptr, fmt);
        uLen = (uint8)vsprintf(tmpBuf, fmt, arg_ptr);
    va_end(arg_ptr);
  
    for(i=0; i<uLen; i++)
    {
        c1 = tmpBuf[i];        // 取字符索引
        if((c1<0x20) || (c1>0x7E))  c1 = 0x20; // 超出显示范围,显示空格
      
        for(j=0; j<sizeof(NUM_8x16)/sizeof(NUM_8x16[0]); j++)  // 索引字模
        {
            if(c1 == NUM_8x16[j].Index) break;
        }
      
        PrintChar_8x16(flag, page, col+offset, (char*)NUM_8x16[j].Msk); // 显示字符
        offset = offset+8;  // 显示完一个字符,列上移动1格
    }
    return uLen;  
}

//*********************************************************************************************************
//** 函数名称 :Print_Char(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
//** 函数功能 :显示小字符串模 6X8
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :字符串长度
//*********************************************************************************************************
uint8 Print_Char(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
{
    va_list arg_ptr;
    char  c1;
    char  tmpBuf[40];    // LCD显示数据缓冲区
    uint8  offset=0, i, j, uLen;

    va_start(arg_ptr, fmt);
        uLen = (uint8)vsprintf(tmpBuf, fmt, arg_ptr);
    va_end(arg_ptr);
  
    for(i=0; i<uLen; i++)
    {
        c1 = tmpBuf[i];        // 取字符索引
        if((c1<0x20) || (c1>0x7E))  c1 = 0x20; // 超出显示范围,显示空格
      
        for(j=0; j<sizeof(ASC_6x8)/sizeof(ASC_6x8[0]); j++)  // 索引字模
        {
            if(c1 == ASC_6x8[j].Index) break;
        }
      
        PrintChar_6x8(flag, page, col+offset, (char*)ASC_6x8[j].Msk); // 显示字符
        offset = offset+6;  // 显示完一个字符,列上移动1格
    }
    return uLen;
}
最佳答案
2019-12-21 23:46:14
彩红晴天 发表于 2019-12-21 23:40
他给我说先把这个搞懂了,就可以继续学,

按照你这么说,首先可以确定他是在为难你
至于你应该如何做,由你自己决定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-21 23:36:16 | 显示全部楼层
感觉的确是在为难你,这看起来像 c51
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-21 23:40:30 | 显示全部楼层
人造人 发表于 2019-12-21 23:36
感觉的确是在为难你,这看起来像 c51

他给我说先把这个搞懂了,就可以继续学,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-21 23:46:14 | 显示全部楼层    本楼为最佳答案   
彩红晴天 发表于 2019-12-21 23:40
他给我说先把这个搞懂了,就可以继续学,

按照你这么说,首先可以确定他是在为难你
至于你应该如何做,由你自己决定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-22 10:43:48 | 显示全部楼层
人造人 发表于 2019-12-21 23:46
按照你这么说,首先可以确定他是在为难你
至于你应该如何做,由你自己决定

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 23:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表