×
单片机 > 单片机程序设计 > 详情

arm力天电子 lpc2148 无字库的12864显示一个汉字(串行)

发布时间:2020-06-15 发布时间:
|

力天电子lpc2148开发板中配的12864小屏是不带字库的,并且没有所谓的左右屏,上下屏之分,是一个整屏.(是北京集粹电子设备有限公司生产的,资料详见


http://download.csdn.net/detail/yueniaoshi/4507741 此资料介绍的芯片的相关东西


http://download.csdn.net/detail/yueniaoshi/4507754 此资料介绍的是驱动函数


http://download.csdn.net/detail/yueniaoshi/4507775 此资料介绍的是小小日历钟,这个里面的函数更全一点)


(再说点题外话,当初买板子的时候老板服务很周到,也很热心,问什么说什么!可是一旦板子买回来了,有些地方不懂的时候,想问问老板,就变得爱理不理了啊,美哦办法啊!谁让咱是菜鸟呢?没人说,咱就自己想办法解决吧!)


#include

//管脚宏定义

#define  SCLK 0x01<<24  //595时钟端

#define  MISO 0x01<<5   //数据输入端

#define  MOSI 0x01<<6   //数据输出端

#define  RCK  0x01<<7   //SO12864时钟输入端


//LCD Define 

#define LCD_A 1<<30  //命令数据选择端,高电平:数据  低电平:命令

#define LCD_CLK 1<<4 //时钟端

#define LCD_DATA MOSI //数据端

#define B_LED   1<<13 //背光


#define Sclk_L() IO0CLR |=LCD_CLK //时钟高电平

#define Sclk_H() IO0SET |=LCD_CLK //时钟低电平

#define Res_L()  HC595_DATA &=~(1<<2);Write595() //复位低电平

#define Res_H()  HC595_DATA |=(1<<2); Write595() //复位高电平

#define Data_L() IO0CLR |=LCD_DATA //数据低电平

#define Data_H() IO0SET |=LCD_DATA //数据高电平

#define CS_L() HC595_DATA &=~1; Write595() //片选低电平

#define CS_H() HC595_DATA |=1;  Write595() //片选高电平

#define Write_C() IO0CLR |=LCD_A //选择写命令

#define Write_D() IO0SET |=LCD_A //选择写数据

#define Writecommand

//#define pgm_read_byte

//#define LcdCls



//函数声明

void Delayn(unsigned long n);

void Write595();

void HC595_Init(void);

void Lcd_Init(void);

void display_HZ(unsigned char x,unsigned char y,unsigned char *p);

void LcdCls(unsigned char data);

void Setxy(unsigned char x,unsigned char y);

//全局变量

unsigned int HC595_DATA=0xFFFFFFFF;

unsigned char ZHONG[]={

  //取的字模

0x90,0x8C,0x84,0x84,0x84,0x84,0x85,0xF6,0x84,0x84,0x84,0x84,0x84,0xD4,0x8C,0x00,

0x00,0x20,0x10,0x08,0x04,0x02,0x01,0xFF,0x01,0x02,0x04,0x04,0x08,0x18,0x08,0x00,     //"宋"

};

//主函数

int main(void)

{

  HC595_Init(); //初始化74HC595

  IO0DIR |=LCD_A|B_LED|LCD_CLK; //初始化IO口

  Lcd_Init(); //初始化液晶屏

  LcdCls(0x00);//清屏

  Delayn(10000000); //此处是自己加的,清屏的时候可能会出现正在清上一次的图案时,字就显示出来了

  display_HZ(6,2,ZHONG); //在第2页,第6列开始显示一个"宋"

  while(1); //stop

}

//初始化595接口

void HC595_Init(void)

{

  IO0DIR |= MOSI|RCK;

  IO1DIR |= SCLK;

  IO1CLR |= SCLK;

  IO0DIR |= RCK;

  

  HC595_DATA =0xFFFFFFFF;Write595();

}

//写字节

void WriteByte(unsigned char data)

{

  unsigned char i;

  //IO0CLR;

  for(i=0;i<8;i++)

  {

    if(data&0x01) IO0SET=MOSI;

    else IO0CLR =MOSI;

    IO1SET=SCLK;

    data>>=1;

    IO1CLR=SCLK;

  }

    //IO0SET=RCK;

}

 //刷新595的数据

void Write595()

{

  IO0CLR=RCK;

  WriteByte(HC595_DATA&0xff);

  WriteByte((HC595_DATA&0xff00)>>8);

  WriteByte((HC595_DATA&0xff0000)>>16);

  WriteByte((HC595_DATA&0xff000000)>>24);

  IO0SET=RCK;

}

//延时周期数

void Delayn(unsigned long n)

{

while(n--);

}

//向SPI总线上写一个字节的数据

void LCDWriteByte(unsigned char data)

{

  unsigned char i,s;

  s=data;

  for(i=0;i<8;i++)

  { //Delayn(1000000); //自己加的

    if(s&0x80) Data_H();

    else  Data_L();

    Sclk_H();

    s<<=1;

    Sclk_L(); 

  }

}

//向液晶屏写数据

void WriteData(unsigned char Data)

{

  Write_D();

  CS_L();

  LCDWriteByte(Data);

  CS_H();

}

//向液晶屏写命令

void WriteCommand(unsigned char Command)

{

  Write_C();

  CS_L();

  LCDWriteByte(Command);

  CS_H();

}

//打开液晶背光  0:关闭 1:打开

void Lcd_BackLed(unsigned char on)

{

  if(on==1)

  {

    IO0CLR=B_LED; //打开背光

  }

  else if(on==0)

  {

    IO0SET=B_LED; //关闭背光

  }

}

//液晶复位

void Lcd_Reset(void)

{

  Res_L();

  Delayn(10000000);

  Res_H();

}

//列顺序翻转,左右翻转 0:正常 1:翻转

void Lcd_ColRev(unsigned char i)

{

  WriteCommand(0xa0|(i&0x01));

}

//清屏

void LcdCls(unsigned char data)

{

  unsigned char i,j;

  for(i=0;i<9;i++)          //依次刷8页

  {

    Setxy(0,i);                //每次从0列开始

    for(j=0;j<128;j++)  //每页写128列


    {

      WriteData(data); //128次每次列地址自动递增

   

    } 

  }

}

//液晶初始化

void Lcd_Init(void)

{

  Lcd_Reset();    //液晶复位

  //Lcd_BackLed(0);

  Lcd_BackLed(1); //打开液晶背光

  WriteCommand(0xaf); //打开显示

  WriteCommand(0x40); //指定显示RAM的行地址,起始行为:0然后63,62,....2,1依次减小

  WriteCommand(0xa1); //ADC正常???

  WriteCommand(0xa6); //没有反白,正常显示

  WriteCommand(0xa4); //全屏显示

  WriteCommand(0xa2); //设置LCD的偏压比

  WriteCommand(0xc0); //正常:意思是下端为0,往上依次为63,62....

  WriteCommand(0x2f); //电源设置

  WriteCommand(0x24); //粗调对比度

  WriteCommand(0x81); //

  WriteCommand(0x24); //跟上一行在一起相当于细调对比度

  Lcd_ColRev(1);     //左右翻转

}

//选择列x,页y

void Setxy(unsigned char x,unsigned char y)

  unsigned char tmp=0;

  y=y&0x0F;    //把页号变换为0XB0……0XB7的页定位码

  y=y|0xb0;

  tmp=x;

  tmp>>=4;     //变换出列号的定位码高低4位

  tmp|=0x10;

  x&=0x0F;

  WriteCommand(y);  //写页定位码

  WriteCommand(tmp);//写列定位码(高)

  WriteCommand(x);  //写列定位码(低)

}

//显示汉字 x是列,y是页,p指向字模数组

void display_HZ(unsigned char x,unsigned char y,unsigned char *p)  //p是汉字的首地址

{

    unsigned char i;

    WriteCommand(0xa4);

    Setxy(x,y);      //起始列,页

    for(i=0;i<16;i++)

    {

      WriteData(*p++);//显示上半个汉字   

    }                           

    y+=1;

    Setxy(x,y);     //到下页起点

    for(i=16;i<32;i++)

    {

      WriteData(*p++); //显示下半个汉字

      

    }    

}

图片如下:


关键字:arm  lpc2148  12864  串行 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会