您的位置:首页 > 其它

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

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

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

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

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

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

#include <NXP/iolpc2148.h>

//管脚宏定义

#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++); //显示下半个汉字

}

}

图片如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: