#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);
}
|