您的位置 首页 汽车

12864实践使用的驱动程序

一下程序在使用时,紧紧结合每句后面的注释进行修改,比如端口的衔接问题这是一个12864结合ST168进行方位显示的程序:使用技巧:只需从中复

一下程序在运用时,紧紧结合每句后边的注释进行修正,比方端口的联接问题

这是一个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(500); } }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/257924.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部