在
教大家如何点亮建行网银盾的液晶屏(附代码指令) 看到了驱动19264液晶,于是我也来试试,我驱动的U盾是这两种
这种U盾液晶是12864的,线序如下
最后驱动效果如图所示
我完成了在 51 MSP430 及STM32 的驱动程序的编写,现共享代码,顺便提一句,
U盾上的FLASH也被我做成了字库,用来显示汉字,具体过程略微麻烦,便不再赘述
下边是 51 的驱动代码 及所有代码打包的附件
- #include "12864.h"
- void Send_Cmd_To_Lcd12864(char cmd) //发送命令到Lcd
- {
- char i=0;
- Lcd12864_AO(0);
- for(i=0;i<8;i++) //从高位到地位依次发送数据
- {
- Lcd12864_CLK(0);
- if( cmd&0x80) {Lcd12864_DIO(1);}
- else {Lcd12864_DIO(0);}
- cmd <<= 1;
- Lcd12864_CLK(1);
- }
- }
- void Send_Data_To_Lcd12864(char dat) //发送数据到Lcd
- {
- char i=0;
- Lcd12864_AO(1);
- for(i=0;i<8;i++) //从高位到地位依次发送数据
- {
- Lcd12864_CLK(0);
- if( dat&0x80) {Lcd12864_DIO(1);}
- else {Lcd12864_DIO(0);}
- dat <<= 1;
- Lcd12864_CLK(1);
- }
- }
- void Lcd12864_Init(void)
- {
- #ifdef Lcd12864_CS_Pin
- Lcd12864_CS(0);
- #endif
- #ifdef Lcd12864_RES_Pin
- Lcd12864_RES(1);
- #endif
- Send_Cmd_To_Lcd12864(0xE2); //软件复位
- Send_Cmd_To_Lcd12864(0xA6); //0xA6:常规显示;0xA7:反色显示
- Send_Cmd_To_Lcd12864(0xA3); //0xA3:偏压1/7;0xA2:偏压1/9
- Send_Cmd_To_Lcd12864(0xA0); //0xA0:段方向正常;0xA1:段方向取反
- Send_Cmd_To_Lcd12864(0xC8); //0xC0:普通扫描顺序;0xC8:反转扫描顺序
- Send_Cmd_To_Lcd12864(0xA4); //0xA4:正常显示;0xA5:显示全开
-
- Send_Cmd_To_Lcd12864(0xF8);
- Send_Cmd_To_Lcd12864(0x00); //升压倍数选择,默认即可
-
- Send_Cmd_To_Lcd12864(0x23); //调节电阻率,粗调对比度
-
- Send_Cmd_To_Lcd12864(0x81);
- Send_Cmd_To_Lcd12864(0x5f); //内部电阻微调,微调对比度
-
- Send_Cmd_To_Lcd12864(0x2F); //打开内部升压,调压,跟随器电路
- Send_Cmd_To_Lcd12864(0x40); //设置显示初始行
-
- Send_Cmd_To_Lcd12864(0xAF); //0xAE:关显示;0xAF:开显示
- }
- /********************************************
- 函数功能:跳转至液晶坐标(row,column)处
- x:液晶第x行,数值范围1~8
- y:液晶x行的第y个地址,数值范围1~128
- ********************************************/
- void Lcd12864_Jump_Place(unsigned char row,unsigned char column)
- {
- char temp;
- if(row>=1&&row<=8&&column>=1&&column<=128)
- {
- Send_Cmd_To_Lcd12864(0xB0+row-1);
- temp = ((column-1)>>4)|0x10;
- Send_Cmd_To_Lcd12864(temp);
- temp = ((column-1)&0x0f);
- Send_Cmd_To_Lcd12864(temp);
- }
- }
- /********************************************
- 函数功能:以坐标(row,column)为起点显示width(宽)*height(高)的字模
- x:液晶第x行,数值范围1~8
- y:液晶x行的第y个地址,数值范围1~128
- width: 图片宽度0<width<=128
- height: 图片高度,为8的倍数,最大为8倍
- reverse_flag: 反白显示标志位,flag=0,常规显示;flag=1,反白显示
- add:字符数据地址
- ********************************************/
- void Lcd12864_Print(unsigned char row,unsigned char column,unsigned char width,unsigned char height,char reverse_flag,char* add)
- {
- unsigned char i=0,j=0,k=0;
- char* temp = add;
- k = height/8;
- if(reverse_flag)
- {
- for(i=0;i<k;i++)
- {
- Lcd12864_Jump_Place(row+i,column);
- for(j=0;j<width;j++)
- {
- Send_Data_To_Lcd12864(~(*temp++));
- }
- }
- }
- else
- {
- for(i=0;i<k;i++)
- {
- Lcd12864_Jump_Place(row+i,column);
- for(j=0;j<width;j++)
- {
- Send_Data_To_Lcd12864(*temp++);
- }
- }
- }
- }
- /********************************************
- 函数功能:液晶清屏
- ********************************************/
- void Lcd12864_Clear(void)
- {
- unsigned char i=0,j=0;
- for(i=0;i<8;i++)
- {
- Lcd12864_Jump_Place(i+1,1);
- for(j=0;j<128;j++)
- {
- Send_Data_To_Lcd12864(0x00);
- }
- }
- }
- #ifndef __12864_H__
- #define __12864_H__
- #include <reg52.h>
- #ifndef BIT0
- #define BIT0 0x01
- #endif
- #ifndef BIT1
- #define BIT1 0x02
- #endif
- #ifndef BIT2
- #define BIT2 0x04
- #endif
- #ifndef BIT3
- #define BIT3 0x08
- #endif
- #ifndef BIT4
- #define BIT4 0x10
- #endif
- #ifndef BIT5
- #define BIT5 0x20
- #endif
- #ifndef BIT6
- #define BIT6 0x40
- #endif
- #ifndef BIT7
- #define BIT7 0x80
- #endif
- /**********************重定义寄存器***********************/
- #define Lcd12864_Control_Port P1
- /************************定义结束************************/
- /***********************端口定义*************************/
- #define Lcd12864_CS_Pin BIT0
- //#define Lcd12864_RES_Pin BIT4
- #define Lcd12864_AO_Pin BIT1
- #define Lcd12864_CLK_Pin BIT2
- #define Lcd12864_DIO_Pin BIT3
- /************************定义结束************************/
- /********************定义IO端口赋值宏定义*****************/
- #ifdef Lcd12864_CS_Pin
- #define Lcd12864_CS(a) if(a) \
- Lcd12864_Control_Port |= Lcd12864_CS_Pin; \
- else \
- Lcd12864_Control_Port &= ~Lcd12864_CS_Pin;
- #endif
- #ifdef Lcd12864_RES_Pin
- #define Lcd12864_RES(a) if(a) \
- Lcd12864_Control_Port |= Lcd12864_RES_Pin; \
- else \
- Lcd12864_Control_Port &= ~Lcd12864_RES_Pin;
- #endif
- #define Lcd12864_AO(a) if(a) \
- Lcd12864_Control_Port |= Lcd12864_AO_Pin; \
- else \
- Lcd12864_Control_Port &= ~Lcd12864_AO_Pin;
- #define Lcd12864_CLK(a) if(a) \
- Lcd12864_Control_Port |= Lcd12864_CLK_Pin; \
- else \
- Lcd12864_Control_Port &= ~Lcd12864_CLK_Pin;
- #define Lcd12864_DIO(a) if(a) \
- Lcd12864_Control_Port |= Lcd12864_DIO_Pin; \
- else \
- Lcd12864_Control_Port &= ~Lcd12864_DIO_Pin;
- /******************************定义结束*******************************/
- void Send_Cmd_To_Lcd12864(char cmd); //发送命令到Lcd12864
- void Send_Data_To_Lcd12864(char dat); //发送数据到Lcd12864
- void Lcd12864_Init(void); //液晶初始化
- void Lcd12864_Jump_Place(unsigned char row,unsigned char column);
- void Lcd12864_Print(unsigned char row,unsigned char column,
- unsigned char width,unsigned char height,
- char reverse_flag,char* add);
- void Lcd12864_Clear(void);
-
- #endif
百度云下载链接http://pan.baidu.com/share/link?shareid=3038866867&uk=204610742
[ 此帖被sxlwh在2016-07-13 18:34重新编辑 ]