微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 12864实际应用的驱动程序

12864实际应用的驱动程序

时间:11-26 来源:互联网 点击:
一下程序在使用时,紧紧结合每句后面的注释进行修改,比如端口的衔接问题

这是一个12864结合ST168进行方位显示的程序:

使用技巧:只需从中复制有关12864的驱动程序,修改相关参数即可

#include

#define uchar unsigned char

#define uint unsigned int //宏定义

sbit SID = P2^1; //串行数据RW端口

sbit SCLK = P2^2; //串行同步时钟 E

sbit cs=P2^0; //为写rs端口

sbit psb=P2^3;

uchar code display1[]={"123"},

//定义一个要显示的数据串,只当是12864中的字库,必须要双引号,特定意义

display8[]={"456"},

display2[]={"789"},

display9[]={"458"},

display3[]={"654"},

display7[]={"785!"},

display4[]={"4254"},

display10[]={"4587"},

display5[]={"1010"},

display11[]={"10201"},

display6[]={"15420"},

display12[]={"1201245"},

displayrt[]={"前42452!!"},

display13[]={"4524返回"};

char dir=0,dil=0,zongjil[]={"5204 次"},

zongjir[]={"右4520"};

void delayms(uint t) //约延时n(ms)

{ uint i;

while(t--)

{ for(i=0;i<125;i++); }

}

void SendByte(uchar Dbyte) //必须的子函数,写指令和写数据都需要调用

{

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

{ SCLK = 0;

Dbyte=Dbyte<1;

//左移一位

SID = CY; //移出的位给SID,CY为Dbyte的最好位,下降沿将数据传入

SCLK = 1;

SCLK = 0; }

}

uchar ReceiveByte(void) //检查忙碌的时候调用

{ uchar i,temp1,temp2;

temp1 = 0;

temp2 = 0;

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

{ temp1=temp1<1;//传出来的是从高位到低位,从SID中传出来

SCLK = 0;

SCLK = 1;

SCLK = 0;//下降沿传出数据

if(SID)

temp1++;

}

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

{

temp2=temp2<1;

SCLK = 0;

SCLK = 1;

SCLK = 0;

if(SID) temp2++;//低位先出来

}

return ((0xf0&temp1)+(0x0f&temp2));//高八位和低八位

}

void CheckBusy( void )

{

do SendByte(0xfc); //11111,RW(1),RS(0),0

while(0x80&ReceiveByte());

//BF(.7)=1 Busy

}

void Lcd_WriteCmd(uchar Cbyte )

{ CheckBusy();

SendByte(0xf8); //11111,RW(0)A(低表示从单片机到LCD,RS(0)B(低表示指令),0C固定我0;

SendByte(0xf0&Cbyte); //高四位

SendByte(0xf0&(Cbyte<4));

//低四位(先执行<)

}

void Lcd_WriteData(uchar Dbyte )

{ CheckBusy();

SendByte(0xfa);

//11111,RW(0),RS(1),0

SendByte(0xf0&Dbyte);

//高四位

SendByte(0xf0&Dbyte<4);//低四位(先执行<)

}

void Lcd_Init(void)

{ delayms(50);

Lcd_WriteCmd(0x30);

//选择基本指令集

delayms(1);

Lcd_WriteCmd(0x30);

//选择8bit数据流

delayms(1);

Lcd_WriteCmd(0x0c);

//开显示(无游标、不反白)

delayms(1);

Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H

delayms(20); }

void LCD12864_Write_Str(unsigned char x,unsigned char y,char *buff)//寻找地址

{ unsigned char addr,i=0;

if(x==1)addr=0x80;

if(x==2)addr=0x90;

if(x==3)addr=0x88;

if(x==4)addr=0x98;

addr=addr+y;

Lcd_WriteCmd(0x30); //基本指令功能

write_com(0x30);//发出寻地址指令 //

delay_ms(10);

Lcd_WriteCmd(addr);

//基本指令功能.

write_com(addr);//寻找地址

while(buff[i]!=)

{ Lcd_WriteData(buff[i]);

//write_data(buff[i]); i++; } }

void main()

{ uchar shuju,num[]={"0123456789"},a=1,b=1;

P1=0xff;

cs=1;

psb=0;

Lcd_Init(); // LCD初始化 ,让LCD处于白屏状态.

delayms(10);

while(1)

{ Lcd_Init();

shuju=P1;

//shuju&=0xf8;

if((shuju==0xf7|shuju==0xef)&&a==1)

dil++;

if((shuju==0xfd|shuju==0xfb)&&b==1)

dir++;

zongjil[8]=num[dil/10];

zongjil[9]=num[dil];

zongjir[8]=num[dir/10];

zongjir[9]=num[dir];

switch(shuju) { case 0xf7: { LCD12864_Write_Str(2,0,display8);//左

LCD12864_Write_Str(1,0,display1);

LCD12864_Write_Str(3,0,zongjil);

a++;

b=0;

break; }

case 0xef: { LCD12864_Write_Str(2,0,display9);//左

LCD12864_Write_Str(1,0,display2);

LCD12864_Write_Str(3,0,zongjil);

a++;

b=0;

break;

}

case 0xfe:

{ LCD12864_Write_Str(2,0,display7); LCD12864_Write_Str(1,0,display3); break; } //(行,列,字符)

case 0xfd: { LCD12864_Write_Str(2,0,display10);//右

LCD12864_Write_Str(1,0,display4);

LCD12864_Write_Str(3,0,zongjir);

b++;

a=0;

break;

}

case 0xfb:

{ LCD12864_Write_Str(2,0,display11);//右

LCD12864_Write_Str(1,0,display5);

LCD12864_Write_Str(3,0,zongjir);

b++; a=0;

break; }

case 0xe0: { LCD12864_Write_Str(2,0,display13);

LCD12864_Write_Str(1,0,displayrt); break; }

default: LCD12864_Write_Str(2,0,display12);

LCD12864_Write_Str(1,0,display6); break; }

delayms(

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top