×
单片机 > 单片机程序设计 > 详情

12864实际应用的驱动程序

发布时间:2020-06-22 发布时间:
|
一下程序在使用时,紧紧结合每句后面的注释进行修改,比如端口的衔接问题

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

关键字:12864  实际应用  驱动程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址