力天电子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--); } 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力天电子 lpc2148 基于DS18b20的温度采集实验程序详解
推荐阅读最新更新时间:2024-11-17 05:43
设计资源 培训 开发板 精华推荐
- AN54,使用 LTC1148HV-3.3、4-18V、3.3V/1A 高压降压转换器的应用电路
- 针对企业级以太网交换机的完备 PMBus 电源系统参考设计
- LF50CDT-TR 5V低压灯泡典型应用
- HV823,用于个人数字助理的 1 灯通用灯驱动器
- STEVAL-ISA182V1,使用 VIPER38HD 8.4W/30W 峰值功率离线反激转换器的评估板
- MCP1726 1A、低电压、低静态电流 LDO 固定输出稳压器的典型应用
- 使用 Infineon Technologies AG 的 OM1320SMM 的参考设计
- EVAL-ADG792GEB,用于高清电视的 ADG792 三路 4:1 模拟多路复用器的评估板
- SX8645EVK,用于 SX8645 超低功耗、完全集成、电容式触摸按钮解决方案的评估板
- 具有宽输入电压的 LT8410 34V 输出升压转换器的典型应用电路