标题: STC15F单片机12864源程序 [打印本页]

作者: q1427492841    时间: 2016-11-8 21:23
标题: STC15F单片机12864源程序
#include<STC15Fxxxx.h>
#define IO_12864  P0
sbit RS_12864 = P2^5;
sbit RW_12864 = P2^6;
sbit E_12864 = P2^7;
sbit RST_12864 = P2^2;
//忙检测,若忙则等待,最长等待时间为60ms
void busychk_12864(void)
{
unsigned int timeout = 0;
E_12864 = 0;
RS_12864 = 0;
RW_12864 = 1;
E_12864 = 1;
while((IO_12864 & 0x80) && ++timeout != 0);  //忙状态检测,等待超时时间为60ms
E_12864 = 0;
}

void delay_12864(unsigned int del)
{
unsigned int i;
for(i = 0; i < del; i++){; }
}

//写命令子程序
void wrtcom_12864(unsigned char com)
{
busychk_12864();
E_12864 = 0;
RS_12864 = 0;
RW_12864 = 0;
IO_12864 = com;
E_12864 = 1;
delay_12864(50);    //使能延时!!!注意这里,如果是较快的CPU应该延时久一些
E_12864 = 0;  
}

//读数据子程序
unsigned char reddat_12864(void)
{
unsigned char temp;
busychk_12864();
E_12864 = 0;
IO_12864 = 0xff;  //IO口置高电平,读引脚
RS_12864 = 1;
RW_12864 = 1;
E_12864 = 1;
delay_12864(50);    //使能延时!!!注意这里,如果是较快的CPU应该延时久一些
temp = IO_12864;

return temp;
}

//写数据子程序
void wrtdat_12864(unsigned char dat)
{
busychk_12864();
E_12864 = 0;
RS_12864 = 1;
RW_12864 = 0;
E_12864 = 1;
IO_12864 = dat;
delay_12864(50);    //使能延时!!!注意这里,如果是较快的CPU应该延时久一些
E_12864 = 0;  
}

//初始化12864子函数
void initial_12864(void)
{
delay_12864(40000);
RST_12864 = 1;
RST_12864 = 0;    //复位
delay_12864(500);
RST_12864 = 1;
wrtcom_12864(0x30);   //设置为基本指令集动作
delay_12864(100);
wrtcom_12864(0x30);   //设置为基本指令集动作
delay_12864(37);
wrtcom_12864(0x08);   //设置显示、光标、闪烁全关。
delay_12864(100);
wrtcom_12864(0x01);   //清屏,并且DDRAM数据指针清零
delay_12864(100000);
wrtcom_12864(0x06);   //进入模式设置
wrtcom_12864(0x0c);   //开显示

}


void main()
{
  unsigned char i,*addr;
  unsigned char defchar[] = {0x08,0x10,0x08,0x10,0x08,0x10,0x7F,0xFE,0x20,0x04,0x12,0x48,0x08,0x10,0x05,0xA0,0x02,0x40,0x01,0x80,0x01,0x80,0x07,0xE0,0x09,0x90,0x11,0x88,0x11,0x88,0x11,0x88};    //自定义字符,这里是笔者画的一个小机器人。
  P0M1 = 0;   P0M0 = 0;  
      P2M1 = 0;   P2M0 = 0;  
  delay_12864(100);      //启动延时
  initial_12864();       //初始化12864
  addr = defchar;
  wrtcom_12864(0x40+0x20); //写CGRAM首行地址
  for(i = 0; i < 32; i++)
{
    wrtdat_12864(*addr++);   
  }
  wrtcom_12864(0x80);     //在第一行第一个字符出显示自定义字符
  wrtdat_12864(0x00);     //写第三个自定义字符编码的高字节
  wrtdat_12864(0x04);     //写第三个自定义字符编码的低字节

  while(1);

}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1