160160屏 esp8266从51移值-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5351|回复: 17

160160屏 esp8266从51移值

[复制链接]
发表于 2020-11-3 15:19 | 显示全部楼层 |阅读模式
有个160160的电表屏,驱动为UC1698u,在U8G2库中没有发现它的驱动,想把它从51上移值到esp8266上(在51上程序可以运行),怎么也不显示,有哪位大佬看一下
这块屏使用的是SPI接线方式,网上有很多并口驱动的手册,好不容易找到一下个串口,有需要自行下载

#define sda D0 //sbit sda= P3^6;
#define sck D1  //sbit sck= P3^1;
#define rst D2  //sbit rst=P3^2;
#define cd D3  //sbit cd=P3^3;  //A0
#define cs  D4   //sbit cs=P3^4;

#define uchar unsigned char

//sbit key=P1^3;
uchar hanzi[]=
{
0x00,0x00,0x00,0xFC,0xF8,0x08,0x08,0x0C, //"欣",
0x06,0x06,0x06,0x04,0x00,0xE0,0x7F,0x5E,
0x42,0x40,0x40,0x40,0xE0,0xE0,0x40,0x00,
0x00,0x00,0x00,0xFF,0xFF,0x02,0x02,0xFE,
0xFE,0x03,0x02,0x08,0x07,0x01,0xC0,0xFF,
0x3E,0xC2,0x00,0x02,0x01,0x00,0x00,0x00,
0x00,0x20,0x18,0x0F,0x03,0x00,0x00,0x3F,
0x5F,0x40,0x20,0x10,0x18,0x0E,0x07,0x01,
0x00,0x03,0x0E,0x38,0x70,0x20,0x20,0x00,
};

//写数据
void write_data (uchar dat)
{
  uchar i;
  digitalWrite(cd, 1);
  digitalWrite(cs, 0);
  for(i = 0; i < 8; i++)
  {  
    if(sda&0x80==1)   digitalWrite(sda, 1);
    else digitalWrite(sda, 0);
    dat=dat<<1;     
    digitalWrite(sck, 1);   
    digitalWrite(sck, 0);
  }
  digitalWrite(cs,1);
}
//写命令
void write_comd (uchar dat)
{
  uchar i;
  digitalWrite(cd, 0);
  digitalWrite(cs, 0);
  for(i = 0; i < 8; i++)
  {  
    if(sda&0x80==1)   digitalWrite(sda,1);
    else digitalWrite(sda,0);
    dat=dat<<1;     
    digitalWrite(sck, 1);   
    digitalWrite(sck, 0);
  }
  digitalWrite(cs,1);
}

//lcd160160初始化//
void init_160160(void) //this subprogram is very important,please reference P50 of uc1698 datasheet
{

  digitalWrite(cs, 0);
  /*************************reset*************************/
  digitalWrite(rst, 0);
  delay(2);
  digitalWrite(rst,1);
  delay(200);
  write_comd(0xe2);//24:reset by command
  delay(2);
  /**********************power control*********************/
  write_comd(0xe9);///27:Bias Ratio:1/10 bias LCD 偏压比  偏压比设置为1/10
  write_comd(0x2b);///6:power control set as internal power 电源控制   启用内部升压电路10倍压
  write_comd(0x24);///5:set temperate compensation as 0%  温度补偿   设置驱动偏压(VBIAS)的温度补偿系TC
  write_comd(0x81);///11:electronic potentionmeter   设置对比度调节值 取值范围为0 ~255
  write_comd(198);
  /**********************display control*******************/
  write_comd(0xa4);///16:all pixel off    启动全显示功能
  write_comd(0xa6);///17:inverse display off    a6为正性显示;a7为负性显示
  //write_comd(0xa9);//..显示使能  开关灰度
  /*************************lcd control********************/
  write_comd(0xc0);///19:partial display and MX disable,MY enable  设置显示RAM 驱动数据的输出与驱动行COM 端和驱动列SEG 端的对应关系
  write_comd(0xa3);///15:line rate 15.2klps   设置帧频率
  write_comd(0xd1);///21:rgb-rgb  显示数据格式   
  write_comd(0xd5);///18:4k color mode  
  write_comd(0x84);//12:partial display control disable   局部显示控制
  /********************n-line inversion********************/
  write_comd(0xc8);//20,set n-line inversion
  write_comd(0x10);//enable NIV
  /********************com scan fuction********************/
  write_comd(0xda);//23:enable FRC,PWM,LRM sequence     设置COM 扫描模式
  /***********************window****************************
  *column and row set fix the display district,for example
  *when AC[0]=1,AC[1]=0;(automatic wraparound,column first)
  *column auto_icrement will restart after the end address
  *********************************************************/
  write_comd(0xf4);///31:wpc0:column   操作窗口的左边界列地址
  write_comd(0x25);//start from 130
  write_comd(0xf6);///33:wpc1     操作窗口右边界(结束列地址)设置
  write_comd(0x5A);//end of:272
  write_comd(0xf5);///32:wpp0:row   操作窗口上边界(起始行地址)设置
  write_comd(0x00);//start from 0
  write_comd(0xf7);///34:wpp1     操作窗口下边界(结束行地址)设置
  write_comd(0x9F);//end 160
  write_comd(0xf8);///35:inside mode     窗口操作的使能   0xf9:使能无效
  write_comd(0x89);//13:RAM control
  write_comd(0xad);//18:display on,select on/off mode.Green Enhance mode disable  显示使能设置 关灰度,增强模式无效
  /************************scroll line*********************/
  write_comd(0x40);///8:low bit of scroll line
  write_comd(0x50);///8:high bit of scroll line
  write_comd(0xc4);//19,enable FLT and FLB    set lcd Mapping control
  write_comd(0x90);//14:FLT,FLB set     局部卷动功能而分解卷动区域和固定区域
  write_comd(0x00);
  /**********************partial display*******************/
  write_comd(0x84);///12,set partial display controlff    控制局部显示功能 0x84: 局部显示无效;0x85:局部显示使能
  write_comd(0xf1);///28:com end       COM 扫描结束行设置
  write_comd(0x9f);//160         取值范围0~9F。复位后默认为9FH。
  write_comd(0xf2);///29:display start    局部显示起始行设置
  write_comd(0);//0
  write_comd(0xf3);///30:display end      局部显示结束行设置
  write_comd(159);//160
}

void lcdscan(uchar dat1,uchar dat2)
{
  uchar i,j;
  write_comd(0x60);//row address LSB
  write_comd(0x70);//row address MSB
  write_comd(0x05);//culomn address LSB
  write_comd(0x12);//culomn address MSB
  for(j=0;j<160;j++)
  {
    for(i=0;i<27;i++)
    {
      if(j%2==0)
      {
        write_data (dat1);
        write_data (dat1);
        write_data (dat1);
      }
      else
      {
        write_data (dat2);
        write_data (dat2);
        write_data (dat2);
      }
    }
  }
}


void setup()
{
  pinMode(sda, OUTPUT);
  pinMode(sck, OUTPUT);
  pinMode(rst, OUTPUT);
  pinMode(cd, OUTPUT);
  pinMode(cs, OUTPUT);
  init_160160();
}
void loop() {
  write_comd(0x84);//12,set partial display off
  write_comd(0x40);
  write_comd(0x50);
  lcdscan(0xf0,0x0f);//雪花

  
}


000.png

160160.rar

4.24 KB, 下载次数: 16

移值程序

可用SPC-XRDFG-G160160D27DPSWSD-A0(1).part2.rar

457.04 KB, 下载次数: 14

160160手册

可用SPC-XRDFG-G160160D27DPSWSD-A0(1).part1.rar

1 MB, 下载次数: 9

160160手册

 楼主| 发表于 2020-11-30 13:44 | 显示全部楼层
终于可以显示了,虽然还有些问题


#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#define uchar unsigned char
#define uint unsigned int

#include <SimpleDHT.h>
int pinDHT11 = D5;
SimpleDHT11 dht11(pinDHT11);

int i=0;

int RST =D2;
int sck = D1;
int sda = D0;
int CS = D4;
int CD = D3;

// width: 144, height: 142

unsigned char col[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xf0,0x00,0x00,0x3f,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xf8,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xfc,0x00,0x1f,0xf0,0x00,0x07,0xfc,0x00,0x00,0x1e,0x00,0x00,0x01,0xff,0xff,0xfe,0x07,0xff,0x00,0x00,0x00,0x1f,0x80,0x01,0xff,0xc0,0x00,0x01,0xff,0xff,0xff,0x1f,0xf8,0x00,0x00,0x00,0x07,0xc0,0x07,0xff,0xf0,0x00,0x03,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x78,0x1f,0xff,0xfe,0x00,0x03,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x3e,0x3f,0xff,0xff,0x00,0x07,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x0f,0x3f,0xff,0xff,0x80,0x0f,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xc0,0x0f,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xc0,0x0f,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xc0,0x0f,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xe0,0x0f,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xf0,0x0f,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xf0,0x0f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xf8,0x0f,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xf8,0x0f,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xf8,0x0f,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xf8,0x0f,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xf8,0x0f,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xf8,0x0f,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xf8,0x0f,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xf8,0x0f,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xf8,0x07,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xf8,0x03,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xf8,0x03,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xf8,0x01,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xf0,0x01,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xf0,0x01,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xf0,0x00,0x7f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,0x07,0xff,0xe0,0x00,0x3f,0xc0,0x00,0x00,0x00,0x1f,0xe0,0x00,0x00,0x7b,0xf0,0x07,0xff,0xc0,0x00,0x1f,0xc0,0x00,0x00,0x00,0x3f,0xfe,0x00,0x00,0x7f,0xf0,0x03,0xff,0x80,0x00,0x07,0x80,0x00,0x00,0x00,0xdf,0xff,0x86,0x01,0xff,0xe0,0x03,0xff,0x00,0x00,0x01,0x80,0x00,0x00,0x07,0xc0,0xff,0xc7,0x13,0xff,0x80,0x01,0xfe,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x01,0xff,0xff,0x1f,0xff,0xe0,0x01,0xfc,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x0f,0xff,0xff,0x1f,0xff,0xe0,0x00,0xc0,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0xff,0xff,0xff,0x9f,0xfb,0xf0,0x00,0xc0,0x00,0x00,0x03,0x00,0x00,0x00,0x0f,0xff,0x9f,0xfc,0x3f,0xf1,0xf0,0x00,0xc0,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0xfe,0x0f,0xf8,0x3f,0xe0,0xe0,0x00,0xc0,0x00,0x00,0x06,0x00,0x00,0x00,0x0f,0xfe,0x07,0xc0,0x1f,0xc0,0xc0,0x00,0xc0,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x7c,0x0f,0x80,0x0f,0xe6,0x00,0x00,0x60,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x01,0xff,0x80,0x0f,0xfe,0x00,0x00,0x60,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0xff,0x00,0x07,0xfe,0x00,0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x03,0xf8,0x00,0x02,0x3e,0x00,0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x03,0xc0,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x07,0xc0,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x0f,0xc0,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x1f,0xc0,0x00,0x00,0x00,0x00,0xfe,0x01,0xfc,0x1f,0xfc,0x00,0x00,0x1e,0x00,0x3f,0xc0,0x00,0x00,0x00,0x00,0xfe,0x01,0xff,0xff,0x9f,0x00,0x00,0x1f,0x80,0x7f,0xc0,0x00,0x00,0x00,0x03,0xfc,0x00,0xff,0xff,0x1f,0x00,0x00,0x1f,0x80,0x7f,0xc0,0x00,0x00,0x00,0x00,0xf0,0x00,0x3f,0xfe,0x06,0x00,0x00,0x1f,0x80,0xff,0xc0,0x00,0x00,0x00,0x00,0xe0,0x00,0x07,0xf8,0x02,0x00,0x00,0x1f,0xc0,0xff,0xc0,0x00,0x00,0x00,0x00,0xc0,0x00,0x03,0xf0,0x00,0x00,0x00,0x1f,0xc0,0xff,0xe0,0x00,0x00,0x00,0x00,0x40,0x00,0x06,0x00,0x00,0x00,0x00,0x1f,0xe0,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x1f,0xf0,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xf0,0xff,0xf0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xf8,0xff,0xf8,0x00,0x00,0x00,0x00,0x0f,0xf1,0x60,0x00,0x00,0x00,0x00,0x3f,0xf8,0xff,0xf8,0x00,0x00,0x00,0x00,0x07,0xff,0xfc,0x7f,0x80,0x00,0x00,0x3f,0xfc,0xff,0xf8,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xe0,0x00,0x00,0x7f,0xfe,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0x80,0x00,0x00,0x7f,0xfe,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x7f,0xfe,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x01,0xd0,0x03,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x1f,0xff,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x0f,0xfc,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x07,0xf8,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x03,0xf0,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };


char shi1[] = {
0x00,0x00,0x00,0x00,0x7F,
      0x49,0x49,0x49,0x49,0x49,
      0x7F,0x00,0x00,0x80,0x00,
      0x00,0x01,0x81,0x41,0x21,
      0x1D,0x21,0x41,0x7F,0x89,
      0x89,0x8D,0x89,0x81,0xC1,
      0x41,0x00
};

char qiu[] = {
/*--  文字:  秋  --*/
/*--  宋体18;  此字体下对应的点阵为:宽x高=24x24   --*/
0x00,0x00,0x00,0x20,0x10,0x10,0x18,0xFC,
      0x06,0x86,0x00,0x80,0x00,0x00,0xD3,0xFF,
      0x02,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,
      0x00,0x00,0x02,0x82,0x63,0x31,0x1F,0xFF,
      0x0D,0x39,0x31,0x03,0x1E,0x80,0xFF,0x3F,
      0xC8,0x06,0x03,0x00,0x00,0x00,0x00,0x00,
      0x00,0x06,0x03,0x00,0x00,0x00,0xF7,0xFF,
      0x00,0xC0,0x60,0x30,0x0C,0x07,0x00,0x00,
      0x01,0x0E,0x38,0x70,0x60,0x40,0x40,0x00};
char one[] =
{
    0x00,0x10,0x10,0x18,0x18,  // -1-
  0xFC,0xFC,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0xFF,0xFF,0x00,
  0x00,0x00,0x00,0x00,0x00,
  0x00,0x20,0x20,0x20,0x3F,
  0x3F,0x20,0x20,0x20,0x00,
  0x00 };
char wen[]={      0x00,0x00,0x00,0xC0,0x80,0x82,0x06,0x1C,      0x80,0x00,0x00,0xFF,0x26,0x26,0x22,0x32,      0x32,0xC2,0xFF,0x03,0x00,0x00,0x00,0x00,      0x00,0x00,0x00,0x00,0x01,0x03,0xE0,0x3E,      0x01,0x70,0xE0,0x27,0x66,0xF2,0x33,0x13,      0xF1,0x11,0x11,0xF8,0x18,0x00,0x00,0x00,      0x00,0x00,0x00,0x0C,0x18,0x1F,0x03,0x00,      0x00,0x00,0x1F,0x10,0x10,0x1F,0x10,0x1C,      0x1F,0x10,0x1E,0x1F,0x10,0x18,0x10,0x00};
char du[]={0x00,0x00,0x00,0x00,0x00,0xF8,0x60,0x20,      0x20,0x60,0xF0,0x33,0x16,0x16,0x10,0xF0,      0x10,0x18,0x98,0x98,0x00,0x00,0x00,0x00,     0x00,0x00,0x00,0x00,0x80,0xFF,0x02,0x02,      0x82,0x82,0xBF,0x93,0xD3,0xD1,0x5D,0xDF,      0xE1,0x41,0x01,0x01,0x01,0x00,0x00,0x00,      0x00,0x80,0x60,0x38,0x0F,0x01,0x00,0x80,     0xC0,0x42,0x22,0x34,0x1C,0x1C,0x33,0x61,      0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x00};
char shi[]={0x00,0x00,0x00,0x00,0x02,0x04,0x1C,0x08,      0x80,0x00,0xFE,0x44,0x44,0x44,0x64,0x64,      0x24,0xE6,0x7E,0x06,0x00,0x00,0x00,0x00,      0x00,0x00,0x01,0x03,0x06,0x06,0xF0,0x1F,      0x00,0xC0,0x87,0x06,0xF6,0x22,0x02,0xFA,      0x12,0x03,0xC2,0x60,0x00,0x00,0x00,0x00,      0x00,0x00,0x08,0x18,0x38,0x3F,0x01,0x20,      0x20,0x20,0x23,0x20,0x3F,0x20,0x20,0x3F,      0x36,0x33,0x30,0x30,0x30,0x20,0x00,0x00};
char abc[]={  0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  0x81,0xC3,0xC3,0x81,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x01,  0x00,0x00,0x00,0x00};
char C[]={ 0xC0,0xF0,0x38,0x0C,0x04,0x04,0x04,0x0C,  0x18,0x38,0x7C,0x00,0xFF,0xFF,0x00,0x00,  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  0x03,0x0F,0x1C,0x30,0x20,0x20,0x20,0x30,  0x18,0x0E,0x06,0x00};

   char H[]={0x04,0xFC,0xFC,0x04,0x00,0x00,0x00,0x04,  0xFC,0xFC,0x04,0x00,0x00,0xFF,0xFF,0x08,  0x08,0x08,0x08,0x08,0xFF,0xFF,0x00,0x00,  0x20,0x3F,0x3F,0x20,0x00,0x00,0x00,0x20,  0x3F,0x3F,0x20,0x00};

char O[]={0xC0,0xE0,0x20,0x20,0x20,  0xE0,0xC0,0x00,0x07,0x0F,  0x08,0x08,0x08,0x0F,0x07,  0x00};

char num_24_12[][36]=
  {
     // -0-
    {0x00,0xC0,0xF0,0x38,0x0C,    0x04,0x0C,0x38,0xF0,0xC0,    0x00,0x00,0xFF,0xFF,0x00,    0x00,0x00,0x00,0x00,0x00,    0x00,0xFF,0xFF,0x00,0x00,    0x03,0x0F,0x1C,0x30,0x20, 0x30,0x1C,0x0F,0x03,0x00,0x00},
   // -1-
    {0x00,0x10,0x10,0x18,0x18,    0xFC,0xFC,0x00,0x00,0x00,    0x00,0x00,0x00,0x00,0x00,    0x00,0x00,0xFF,0xFF,0x00,    0x00,0x00,0x00,0x00,0x00,    0x00,0x20,0x20,0x20,0x3F,    0x3F,0x20,0x20,0x20,0x00,    0x00},
   // -2-
    {0x60,0xF0,0xF8,0x0C,0x04,    0x04,0x04,0x0C,0x18,0xF0,    0xE0,0x00,0x00,0x00,0x00,    0x80,0xC0,0x60,0x30,0x18,    0x0E,0x07,0x01,0x00,0x38,    0x3E,0x3F,0x33,0x30,0x30,    0x30,0x30,0x30,0x30,0x3C,    0x00},
    // -3-
    {0x00,0x30,0x78,0x78,0x0C,    0x04,0x04,0x0C,0x18,0xF8,    0xF0,0x00,0x00,0x00,0x00,    0x00,0x08,0x08,0x1C,0x16,    0x33,0xE1,0xC0,0x00,0x0C,    0x1E,0x3E,0x30,0x20,0x20,    0x20,0x30,0x18,0x1F,0x0F,    0x00},
   // -4-
    {0x00,0x00,0x00,0x00,0x80,    0xE0,0x38,0xFC,0xFC,0x00,    0x00,0x00,0x80,0xE0,0x38,    0x0E,0x03,0x00,0x00,0xFF,    0xFF,0x00,0x00,0x00,0x01,    0x01,0x01,0x01,0x01,0x21,    0x21,0x3F,0x3F,0x21,0x21,    0x01},
   // -5-
    {0x00,0xFC,0xFC,0x0C,0x0C,    0x0C,0x0C,0x0C,0x0C,0x0C,   0x00,0x00,0x00,0x1F,0x0F,    0x08,0x04,0x02,0x02,0x06,    0x1C,0xF8,0xE0,0x00,0x0C,    0x1E,0x3E,0x30,0x20,0x20,    0x20,0x30,0x1C,0x0F,0x03,    0x00},
  // -6-
    {0xC0,0xF0,0x38,0x0C,0x04,    0x04,0x0C,0x7C,0x78,0x30,    0x00,0x00,0xFF,0xFF,0x08,    0x04,0x02,0x02,0x02,0x06,    0x1C,0xF8,0xE0,0x00,0x03,    0x0F,0x1C,0x30,0x20,0x20,    0x20,0x30,0x1C,0x0F,0x03,    0x00},
   // -7-
    {0x78,0x1C,0x0C,0x0C,0x0C,    0x0C,0x0C,0x0C,0xCC,0x7C,   0x1C,0x00,0x00,0x00,0x00,   0x00,0x80,0xF0,0x7C,0x0F,    0x01,0x00,0x00,0x00,0x00,    0x00,0x00,0x00,0x3F,0x3F,    0x00,0x00,0x00,0x00,0x00,    0x00},
   // -8-
    {0x00,0xF0,0xF8,0x0C,0x04,    0x04,0x04,0x0C,0xF8,0xF0,    0x00,0x00,0xC0,0xE0,0x31,    0x1B,0x0E,0x0C,0x0E,0x1B,    0x31,0xE0,0xC0,0x00,0x07,  0x0F,0x18,0x30,0x20,0x20,    0x20,0x30,0x18,0x0F,0x07,    0x00},
   // -9-
    {0xC0,0xF0,0x38,0x0C,0x04,    0x04,0x04,0x0C,0x38,0xF0,    0xC0,0x00,0x07,0x1F,0x38,    0x60,0x40,0x40,0x40,0x20,    0x10,0xFF,0xFF,0x00,0x00,    0x0C,0x1E,0x3E,0x30,0x20,    0x20,0x30,0x1C,0x0F,0x03,    0x00},
};


char num_16_8[][16]=
{
   // -0-
  {0xF8,0xFC,0x04,0xC4,0x24,  0xFC,0xF8,0x00,0x07,0x0F,  0x09,0x08,0x08,0x0F,0x07,  0x00},
    // -1-
  {0x00,0x10,0x18,0xFC,0xFC,  0x00,0x00,0x00,0x00,0x08,  0x08,0x0F,0x0F,0x08,0x08,  0x00},
    // -2-
  {0x08,0x0C,0x84,0xC4,0x64,  0x3C,0x18,0x00,0x0E,0x0F,  0x09,0x08,0x08,0x0C,0x0C,  0x00},
  // -3-
  {0x08,0x0C,0x44,0x44,0x44,  0xFC,0xB8,0x00,0x04,0x0C,  0x08,0x08,0x08,0x0F,0x07,  0x00},
// -4-
  {0xC0,0xE0,0xB0,0x98,0xFC,  0xFC,0x80,0x00,0x00,0x00,  0x00,0x08,0x0F,0x0F,0x08,  0x00},
  // -5-
  {0x7C,0x7C,0x44,0x44,0xC4,  0xC4,0x84,0x00,0x04,0x0C,  0x08,0x08,0x08,0x0F,0x07,  0x00},
  // -6-
  {0xF0,0xF8,0x4C,0x44,0x44,  0xC0,0x80,0x00,0x07,0x0F,  0x08,0x08,0x08,0x0F,0x07,  0x00},
// -7-
  {0x0C,0x0C,0x04,0x84,0xC4,  0x7C,0x3C,0x00,0x00,0x00,  0x0F,0x0F,0x00,0x00,0x00,  0x00},
// -8-
  {0xB8,0xFC,0x44,0x44,0x44,  0xFC,0xB8,0x00,0x07,0x0F,  0x08,0x08,0x08,0x0F,0x07,  0x00},
  // -9-
  {0x38,0x7C,0x44,0x44,0x44,  0xFC,0xF8,0x00,0x00,0x08,  0x08,0x08,0x0C,0x07,0x03,  0x00},
  };

void num_str_2412(char x,char y,int data)
{
  int ge=data%10;
  int shi=data/10;
  words_2424(x, y, 1, num_24_12[shi]);
  words_2424(x+4, y, 1, num_24_12[ge]);

  }

void write_160160(bool flag, uchar dat)
{
  uchar i;
  digitalWrite(CD, flag);//flag=0,write command;flag=1,write data
  digitalWrite(CS, 0);
  for(i = 0; i < 8; i++)
  {  
    if(dat&0x80)
    {
      digitalWrite(sda, 1);
    }
    else
    {
      digitalWrite(sda, 0);
    }
    dat<<=1;     
    digitalWrite(sck, 1);   
    digitalWrite(sck, 0);
  }
  digitalWrite(CS,1);
}

void LCD_SetAddress(int x, int y)
{
  x = 0x25 + x / 3; //计算出该点所在的列地址,注意该液晶每3个点共有一个地址
  write_160160(0, 0x60 | (y & 0x0f)); //写行地址低位
  write_160160(0, 0x70 | (y >> 4)); //写行地址高位
  write_160160(0, x & 0x0f); //写列地址低位
  write_160160(0, 0x10 | (x >> 4)); //写列地址高位
}

void init160160(void)
{
  digitalWrite(CS, 0);
  /*************************reset*************************/
  digitalWrite(RST, 0);
  delay(2);      //power on reset
  digitalWrite(RST, 1);
  delay(800);
  write_160160(0, 0xe2);     //reset by command
  delay(2);
  /**********************power control*********************/
  write_160160(0, 0xe9);     //Bias Ratio:1/10 bias LCD 偏压比  偏压比设置为1/10
  write_160160(0, 0x2b);     //Bias Ratio:1/10 bias LCD 偏压比  偏压比设置为1/10
  write_160160(0, 0x24);     //set temperate compensation as 0%  温度补偿   设置驱动偏压(VBIAS)的温度补偿系TC
  write_160160(0, 0x81);     //electronic potentionmeter   设置对比度调节值 取值范围为0 ~255
  write_160160(0, 198);   //0xc6不起作用
/**********************display control*******************/
  write_160160(0, 0xa4); //0xa4 关闭所有像素    0xa5  启动全显示功能   
  write_160160(0, 0xa6); //关闭像素反显 决定屏幕反显     a6为正性显示;a7为负性显示
  //write_160160(0, 0xa8);//..显示使能  开关灰度

  /*************************lcd control********************/
   write_160160(0,0xc0);      //partial display and MX disable,MY enable设置显示RAM 驱动数据的输出与驱动行COM 端和驱动列SEG 端的对应关系
  //  write(0,0xc7);//
  //write_160160(0, 0xe2);    //系统初始化,启用此选项屏变淡
  write_160160(0, 0xa3);     //line rate 15.2klps 设置帧频率
  write_160160(0, 0xd1);     //rgb-rgb 显示数据格式
  write_160160(0, 0xd5);     //4k color mode  12-bit/RGB
  write_160160(0, 0x84);     //partial display control disable 局部显示控制
  /********************n-line inversion********************/
  write_160160(0, 0xc8);  //set n-line inversion
  write_160160(0,0x10);      //enable NIV
  /********************com scan fuction********************/
  write_160160(0, 0xd8);     //enable FRC,PWM,LRM sequence设置COM 扫描模式

    /***********************window***区域操作指令*************************
  *column and row set fix the display district,for example
  *when AC[0]=1,AC[1]=0;(automatic wraparound,column first)
  *column auto_icrement will restart after the end address
  *显示窗口大小设置
  *********************************************************/
  write_160160(0, 0xf4);     //wpc0:column   操作窗口的左边界列地址
  write_160160(0, 0x25);     //start from 130  
  write_160160(0, 0xf6);     //wpc1       ending column address   操作窗口右边界(结束列地址)设置
  write_160160(0, 0x5A);     //end:272      90
  //因为列开始到结尾共90-37=53个数所以 一个数代表160/53=3个像素
  write_160160(0, 0xf5);     //wpp0:row     starting row address   操作窗口上边界(起始行地址)设置
  write_160160(0, 0x00);     //start from 0
  write_160160(0, 0xf7);     //wpp1       ending  row address    操作窗口下边界(结束行地址)设置
  write_160160(0, 0x9F);     //end 160  0x9F=159
  //行开始到结束共160个数所以一个数代表160/160=1个像素
  write_160160(0, 0xf8);     //inside mode   窗口操作的使能   0xf9:使能无效
  write_160160(0, 0x89);     //RAM control   地址自动加一    AC1=0 列先增加    AC2=0  控制行增加+1还是-1   AC0=1
  write_160160(0, 0x8b);    //是0x89的90°翻转显示      AC1=1 行先增加                 AC0=1
  write_160160(0,0x8d);     //                 AC1=0             AC2=1  控制行增加+1还是-1   AC0=1
  write_160160(0,0x8a);     //这四行控制一次性写入时地址增加方向  直接向地址中写数据时不管用....

  write_160160(0, 0xad);     //display on,select on/off mode.Green Enhance mode disable     显示使能设置 关灰度,增强模式无效  背景深黑雪花
    /***************卷动指令*********scroll line**********滚动行***********/
  write_160160(0, 0x40);     //低4位卷动行号
  write_160160(0, 0x50);     //高4位卷动行号
  write_160160(0, 0xc4);     //19,enable FLT and FLB   set lcd Mapping control
  write_160160(0, 0x90);     //14:FLT,FLB set     局部卷动功能而分解卷动区域和固定区域,FLT,FLB 为固定区域
  write_160160(0, 0x00);
    /**********************partial display*******区域操作指令***********/
  write_160160(0, 0x84);     //12,set partial display controlff  控制局部显示功能 0x84: 局部显示无效;0x85:局部显示使能
  write_160160(0, 0xf1);     //com end      COM 扫描结束行设置
  write_160160(0, 0x9f);     //160           取值范围0~9F。复位后默认为9FH。
  write_160160(0, 0xf2);     //display start      局部显示起始行设置
  write_160160(0, 0);      //0
  write_160160(0, 0xf3);     //display end     局部显示结束行设置
  write_160160(0, 159);    //160
}

void cleadlCD()
{
  uint i;
  write_160160(0,0xf4); write_160160(0,0x25); //设置操作窗口左边界 0--53
  write_160160(0,0xf5); write_160160(0,0x00); //设置操作窗口上边界
  write_160160(0,0xf6); write_160160(0,0x5a); //设置操作窗口右边界
  write_160160(0,0xf7); write_160160(0,0x9f); //设置操作窗口下边界
  write_160160(0,0xf8); //设置窗口操作使能
  write_160160(0,0x05);write_160160(0,0x12); //设置起始列地址
  write_160160(0,0x60); write_160160(0,0x70); //设置起始行地址

  for (i=0;i<160*28;i++) //循环总的数据量(列块x 行数)
  {
    write_160160(1,0x00); //写入数据pixel1,pixel2
    write_160160(1,0x00); //写入数据pixel3,pixel4
    write_160160(1,0x00); //写入数据pixel5,pixel6
  }
}

void cleadlCD1()
{
  uint i;
  write_160160(0,0xf4); write_160160(0,0x25); //设置操作窗口左边界 0--53
  write_160160(0,0xf5); write_160160(0,0x00); //设置操作窗口上边界
  write_160160(0,0xf6); write_160160(0,0x5a); //设置操作窗口右边界
  write_160160(0,0xf7); write_160160(0,0x9f); //设置操作窗口下边界
  write_160160(0,0xf8); //设置窗口操作使能
  write_160160(0,0x05);write_160160(0,0x12); //设置起始列地址
  write_160160(0,0x60); write_160160(0,0x70); //设置起始行地址

  for (i=0;i<160*28;i++) //循环总的数据量(列块x 行数)
  {
    write_160160(1,0xff); //写入数据pixel1,pixel2
    write_160160(1,0xff); //写入数据pixel3,pixel4
    write_160160(1,0xff); //写入数据pixel5,pixel6
  }
}

void lcdscan(uchar dat1,uchar dat2)
{
  uchar i,j;
  write_160160(0,0x60); write_160160(0,0x25); //设置操作窗口左边界 0--53
  write_160160(0,0x70); write_160160(0,0x00); //设置操作窗口上边界
  write_160160(0,0x05); write_160160(0,0x5a); //设置操作窗口右边界
  write_160160(0,0x12); write_160160(0,0x9f); //设置操作窗口下边界
  write_160160(0,0xf8);//设置窗口操作使能
  write_160160(0,0x05);write_160160(0,0x12); //设置起始列地址
  write_160160(0,0x60); write_160160(0,0x70); //设置起始行地址
  for(j=0;j<160;j++)
  {
    for(i=0;i<27;i++)
    {
      if(j%2==0)
      {
        write_160160(1,dat1);
        write_160160(1,dat1);
        write_160160(1,dat1);
      }
      else
      {
        write_160160(1,dat2);
        write_160160(1,dat2);
        write_160160(1,dat2);
      }
    }
  }
}


void words_1616(char x, char y, char type, char *p) //type=1,ascii;type=2,Chinese character   显示16*16像素 汉字  小四
{ //x控制列显示地址  y控制行显示地址  
  //汉字取模方式 16*16 从左到右从上到下 纵向8点下高位
  char i, k, j, m, n, l, x0, dat0, dat1, dat2, dat3, dat6;
  x = 37 + x; //控制LCD RAM地址用
  x0 = 0x00 | (x & 0x0f);
  x = 0x10 | ((x & 0xf0) >> 4);
  for (i = 0; i < 2; i++) //横向 2个字节 因为是纵向取模 所以横向 共2*8=16个像素点  i的上限为字符宽度/8 eg:16/8=2
  { //i的值控制着字符宽度若显示48*24则for(i=0;i<6;i++)
    n = i * 8 * type; //纵向 type==2时为汉字 因为是16*16尺寸的汉字所以纵向每次需要16个bit
    //n的值控制着字符高度像素若显示24*48则n=i*24*type (type==2时显示汉字)
    for (j = 0; j < 8; j++) //j的8次循环负责将取模字节中的数据还原成8bit像素数据
    {
      m = i * 8 + j; //控制LCD RAM的地址
      write_160160(0, 0x89); //地址自动加一
      write_160160(0, x0); // write display address   area
      write_160160(0, x); //  write display address   area
      write_160160(0, 0x60 | ((y + m) & 0x0f)); //  write display address   area
      write_160160(0, 0x70 | (((y + m) & 0xf0) >> 4)); //  write display address   area
      for (k = 0; k < 2 * type; k++) //此循环显示汉字的时候执行4*4=16个字节(for循环中用dat0-dat4计算字模中的4个字节)
      {
        l = k * 4 + n; //l和n联合控制汉字高度因为是24*24所以每次执行4*4=16个循环  其中(4表示k的数据范围 4表示k的公倍数)
        dat6 = 0x01 << j; //通过上一层j的for循环来取出没个字节中的8bit数据
        dat0 = (*(p + l))&dat6;
        dat0 = dat0 >> j;
        dat0 <<= 7; //取出字模数组中第p+l个字节的第j位并移到第8位上
        dat1 = (*(p + l + 1))&dat6;
        dat1 = dat1 >> j;
        dat1 <<= 3; //取出字模数组中第p+l+1个字节的第j位并移到第4位上
        dat2 = *(p + 2 + l)&dat6;
        dat2 = dat2 >> j;
        dat2 <<= 7; //取出字模数组中第p+l+2个字节的第j位并移到第8位上
        dat3 = (*(p + 3 + l))&dat6;
        dat3 = dat3 >> j;
        dat3 <<= 3; //取出字模数组中第p+l+3个字节的第j位并移到第8位上
        write_160160(1, dat0 | dat1); //写入的数据是16进制包含2个字节数据  将dat0放到高4位 dat1放到第4位
        write_160160(1, dat2 | dat3);
      }
      write_160160(0, 0x88);
    }
  }
  write_160160(0, 0x89);
}



void words_2424(char x, char y, char type, char *p)
{ //x控制列显示地址  y控制行显示地址 type=1,ascii;type=2,Chinese character   显示24*24像素   宋体 小二
  //汉字取模方式 24*24 纵向取模  从上往下一次八个点,从左往右  每个ascii加4
  char i, k, j, m, n, l, x0, dat0, dat1, dat2, dat3, dat4, dat5, dat6;
  x = 37 + x;
  x0 = 0x00 | (x & 0x0f);
  x = 0x10 | ((x & 0xf0) >> 4);

  for (i = 0; i < 3; i++) //横向 3个字节 因为是纵向取模 所以横向 共3*8=24个像素点  i的上限为字符宽度/8 eg:24/8=3
  { //i的值控制着字符宽度若显示48*24则for(i=0;i<6;i++)
    n = i * 12 * type; //纵向 type==2时为汉字 因为是24*24尺寸的汉字所以纵向每次需要24个bit
    //n的值控制着字符高度像素若显示24*48则n=i*24*type (type==2时显示汉字)
    for (j = 0; j < 8; j++) //j的8次循环负责将取模字节中的数据还原成8bit像素数据
    {
      m = i * 8 + j; //控制LCD RAM的地址
      write_160160(0, 0x89); //地址自动加一
      write_160160(0, x0); // write display address   area
      write_160160(0, x); //  write display address   area
      write_160160(0, 0x60 | ((y + m) & 0x0f)); //  write display address   area
      write_160160(0, 0x70 | (((y + m) & 0xf0) >> 4)); //  write display address   area
      for (k = 0; k < 2 * type; k++) //此循环显示汉字的时候执行4*6=24个字节(for循环中用dat0-dat6计算字模中的6个字节)
      {
        l = k * 6 + n; //l和n联合控制汉字高度因为是24*24所以每次执行4*6=24个循环  其中(4表示k的数据范围 6表示k的公倍数)
        dat6 = 0x01 << j; //通过上一层j的for循环来取出没个字节中的8bit数据
        dat0 = (*(p + l))&dat6;
        dat0 = dat0 >> j;
        dat0 <<= 7; //取出字模数组中第p+l个字节的第j位并移到第8位上
        dat1 = (*(p + l + 1))&dat6;
        dat1 = dat1 >> j;
        dat1 <<= 3; //取出字模数组中第p+l+1个字节的第j位并移到第4位上
        dat2 = *(p + 2 + l)&dat6;
        dat2 = dat2 >> j;
        dat2 <<= 7; //取出字模数组中第p+2个字节的第j位并移到第8位上
        dat3 = (*(p + 3 + l))&dat6;
        dat3 = dat3 >> j;
        dat3 <<= 3; //取出字模数组中第p+l+3个字节的第j位并移到第4位上
        dat4 = (*(p + 4 + l))&dat6;
        dat4 = dat4 >> j;
        dat4 <<= 7; //取出字模数组中第p+l+4个字节的第j位并移到第8位上
        dat5 = (*(p + 5 + l))&dat6;
        dat5 = dat5 >> j;
        dat5 <<= 3; //取出字模数组中第p+l+5个字节的第j位并移到第4位上
        write_160160(1, dat0 | dat1); //写入的数据是16进制包含2个字节数据  将dat0放到高4位 dat1放到第4位
        write_160160(1, dat2 | dat3);
        write_160160(1, dat4 | dat5);
      }
      write_160160(0, 0x88); //
    }
  }
  write_160160(0, 0x89);
}

//--图形写入函数-------------------
// 图形格式要求:水平方向宽度要以3 和8 的倍数出现
// 8 的倍数是数据以字节形式出现
// 3 的倍数是因为DDRAM 列地址以列块形式计算的,即3 点像素数据为一个列块
void ShowBMP(uchar x,uchar y,uchar width,uchar high,uchar bmp[])
{
  // 坐标X 为像素列块0-79 列块,3 像素点数据/列块
  // 坐标Y 为像素点行数0-159
  // 图形宽度width 为水平方向点列数,要求该值为3 和8 的倍数
  // 图形高度high 为垂直方向点行数,取值为0-159
  // 图形数组bmp[]为所要写入的图形数据,以1bpp(8dots/byte)、水平排列格式表示
  uint p;
  uchar i,j,k,m,Ddata;
    write_160160(0,0xf4);  write_160160(0,0x25+x);        // 设置操作窗口左边界
    write_160160(0,0xf5);  write_160160(0,y);             // 设置操作窗口上边界
    write_160160(0,0xf6);  write_160160(0,0x25+x+width/3-1);  // 设置操作窗口右边界
    write_160160(0,0xf7);  write_160160(0,high-1+y);        // 设置操作窗口下边界
    write_160160(0,0xf8);                          // 设置窗口操作使能
    x=x+0x25;
    write_160160(0,x&0x0f);  write_160160(0,0x10|(x>>4)); // 设置起始列地址
    write_160160(0,0x60+(y&0x0f));   write_160160(0,0x70+(y>>4)); // 设置起始行地址
  p=0; // 数组指针初始化
  for(i=0;i<high;i++) // 循环行数数据量
  {
    for ( j=0;j<width/8;j++) // 循环字节数/行
    {
      k=bmp[p++]; // 取图形数据
      for (m=0;m<4;m++) // 1 字节转换成4 字节数据写入
      {
        switch (k&0xc0) // 根据数据位值设置显示数据
        {
          case 0x00 : Ddata=0x00;break;
          case 0x40 : Ddata=0x0f;break;
          case 0x80 : Ddata=0xf0;break;
          case 0xc0 : Ddata=0xff;break;
        }
          write_160160(1,Ddata); // 写入数据
        k=k<<2;
      }
    }
    switch (width%3)
    {
      case 0 : break;
      case 1 : write_160160(1,0x00);break; //补充余数据为0
      case 2 : write_160160(1,0x00); write_160160(1,0x00);break;// 补充余数据为0
    }
  }
}


void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(RST, OUTPUT);
  pinMode(sda, OUTPUT);
  pinMode(sck, OUTPUT);
  pinMode(CS, OUTPUT);
  pinMode(CD, OUTPUT);

  pinMode(pinDHT11, OUTPUT);

  Serial.begin(115200);

  init160160();
  words_1616(8,24,2,shi);
  cleadlCD();
  Serial.println("初始化完成");
   }

void loop() {

  words_2424(10, 1, 2, wen);
  words_2424(18, 1, 2, du);
  words_2424(26, 1, 1, abc);
  words_2424(10, 25, 2, shi);
  words_2424(18, 25, 2, du);
  words_2424(26, 25, 1, abc);

  Serial.println("=================================");
  Serial.println("Sample DHT11...");

  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
   Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
   return;
  }
  
  Serial.print("Sample OK: ");
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" H");
  delay(1500);
  num_str_2412(30,1,(int)temperature);
words_1616(39, 0, 1, O);
  words_2424(42, 1, 1, C);

  num_str_2412(30,25,(int)humidity);
  words_2424(39, 25, 1, H);


num_str_2412(0,0,i);
i++;
if(i>30) i=0;

  ShowBMP(10,50,120,110,col);
  delay(1000);


  Serial.println("start");
}
IMG_20201130_133839.jpg
发表于 2020-12-4 19:32 | 显示全部楼层
楼主继续努力,期待做一个万年历+时钟+天气的应用出来。
发表于 2020-12-7 21:20 | 显示全部楼层
这是造福大家啊,这屏可以很便宜从废品站找到
发表于 2020-12-23 21:30 | 显示全部楼层
楼主,你好。
我的160160屏是并口屏。金鹏OCM160160-3。可以使用这个程序驱动起来吗?
也准备使用nodemcu来做个天气预报。
 楼主| 发表于 2020-12-25 11:26 | 显示全部楼层
本帖最后由 songyx005 于 2020-12-25 11:29 编辑
fanqizc 发表于 2020-12-23 21:30
楼主,你好。
我的160160屏是并口屏。金鹏OCM160160-3。可以使用这个程序驱动起来吗?
也准备使用nodemcu来 ...

并口的话,你要参照手册更改一下这个函数  void write_160160(bool flag, uchar dat)
发表于 2020-12-25 22:16 | 显示全部楼层
songyx005 发表于 2020-12-25 11:26
并口的话,你要参照手册更改一下这个函数  void write_160160(bool flag, uchar dat)
...

不是很懂。
digitalWrite(CD, flag) 这个是负责写数据还是写命令的
digitalWrite(CS, 0) 这个是片选?
if(dat&0x80) 这个是什么含义? dat同0x80进行与运算?

digitalWrite(sda, 1)和digitalWrite(sda, 0)是写数据?

发表于 2020-12-25 22:26 | 显示全部楼层
大佬,能把这个做成一个库文件吗?方便调用。
 楼主| 发表于 2020-12-26 11:38 | 显示全部楼层
fanqizc 发表于 2020-12-25 22:16
不是很懂。
digitalWrite(CD, flag) 这个是负责写数据还是写命令的
digitalWrite(CS, 0) 这个是片选?

003.png void write_160160(bool flag, uchar dat)这个函数就是手册上的读写函数void write(bit flag,uchar dat),
digitalWrite(CD, flag) 当flag =1时,写命令,当flag=0 时,写数据;这一句等效于CD=flag
digitalWrite(CS, 0) 这个是片选,参照手册
if(dat&0x80)  这是判断dat 最高位是1还是0,然后用digitalWrite(sda, 1)或digitalWrite(sda, 0)写进去;通过8次循环,1个字节就写进去了
其实你问的这些都是串口写数据和命令,不能用到并口上,并口你看下手册用什么时序,把51改成esp8266就行
这个程序又更改了一版,基本没问题了,初始化部分进行简化,可以再参考下
我当时就是参考的这个程序 https://www.arduino.cn/thread-96001-1-1.html




004.png

uc1698.rar

8.61 KB, 下载次数: 16

新版

 楼主| 发表于 2020-12-26 11:40 | 显示全部楼层
fanqizc 发表于 2020-12-25 22:26
大佬,能把这个做成一个库文件吗?方便调用。

不是大佬,还不会做库部件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:47 , Processed in 0.098675 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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