彩红晴天 发表于 2019-12-21 23:27:52

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

感觉老板是在为难我= ={:10_249:} ,我刚才刚看懂了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)
{
    uint8i;

    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)
{
    uint8i;

    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);
            else
                LCDWrite(LCD_LEFT, LCD_DATA, ~d);
      }
      else // 右屏幕
      {
         if(flag)
               LCDWrite(LCD_RIGHT, LCD_DATA, d);
         else
               LCDWrite(LCD_RIGHT, LCD_DATA, ~d);
      }
    }

}

//*********************************************************************************************************
//** 函数名称 :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);
    PrintPage(flag, page+1, col, 16, &d);
}

//*********************************************************************************************************
//** 函数名称 :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);
    PrintPage(flag, page+1, col, 8, &d);
}

//*********************************************************************************************************
//** 函数名称 :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)
{
    uint8i;
    for(i=0; i<pagecnt; i++)// 页
    {
      PrintPage(flag, spage+i, scol, colcnt, &d);
    }
}

//*********************************************************************************************************
//** 函数名称 :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;
    charc1;
    chartmpBuf;    // LCD显示数据缓冲区
    uint8offset=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 = tmpBuf;      // 取字符索引
      c1 = tmpBuf;
      
      for(j=0; j<sizeof(CHI16X16)/sizeof(CHI16X16); j++)// 索引字模
      {
            if((c1 == CHI16X16.Index)&(c1 == CHI16X16.Index)) break;
      }
      
      PrintChar_16X16(flag, page, col+offset, (char*)CHI16X16.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;
    charc1;
    chartmpBuf;    // LCD显示数据缓冲区
    uint8offset=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;      // 取字符索引
      if((c1<0x20) || (c1>0x7E))c1 = 0x20; // 超出显示范围,显示空格
      
      for(j=0; j<sizeof(NUM_8x16)/sizeof(NUM_8x16); j++)// 索引字模
      {
            if(c1 == NUM_8x16.Index) break;
      }
      
      PrintChar_8x16(flag, page, col+offset, (char*)NUM_8x16.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;
    charc1;
    chartmpBuf;    // LCD显示数据缓冲区
    uint8offset=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;      // 取字符索引
      if((c1<0x20) || (c1>0x7E))c1 = 0x20; // 超出显示范围,显示空格
      
      for(j=0; j<sizeof(ASC_6x8)/sizeof(ASC_6x8); j++)// 索引字模
      {
            if(c1 == ASC_6x8.Index) break;
      }
      
      PrintChar_6x8(flag, page, col+offset, (char*)ASC_6x8.Msk); // 显示字符
      offset = offset+6;// 显示完一个字符,列上移动1格
    }
    return uLen;
}

人造人 发表于 2019-12-21 23:36:16

感觉的确是在为难你,这看起来像 c51

彩红晴天 发表于 2019-12-21 23:40:30

人造人 发表于 2019-12-21 23:36
感觉的确是在为难你,这看起来像 c51

他给我说先把这个搞懂了,就可以继续学,

人造人 发表于 2019-12-21 23:46:14

彩红晴天 发表于 2019-12-21 23:40
他给我说先把这个搞懂了,就可以继续学,

按照你这么说,首先可以确定他是在为难你
至于你应该如何做,由你自己决定

彩红晴天 发表于 2019-12-22 10:43:48

人造人 发表于 2019-12-21 23:46
按照你这么说,首先可以确定他是在为难你
至于你应该如何做,由你自己决定

页: [1]
查看完整版本: 想跟着老板学学编程,结果给我这个东西让我自己看,我是不是没救了= =,