#include "reg51.h"
#include <intrins.h>
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DIS1[] = {" 长江大学 "};
uchar code DIS2[] = {"单片机原理与应用"};
uchar code DIS3[] = {"Welcom Everybody"};
/***************** 12864LCD引脚定义 *********************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^0; //寄存器选择输入
sbit LCD_RW = P2^1; //液晶读/写控制
sbit LCD_EN = P2^2; //液晶使能控制
sbit LCD_PSB = P2^3; //串/并方式控制
sbit LCD_RST = P2^5; //液晶复位端口
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/************************ 毫秒延时函数 ****************************/
void Delayms(){ //1ms @12MHz
uchar i, j;
i = 2;
j = 239;
do {
while (--j);
} while (--i);
}
/*************************** 延时函数 *****************************/
void Delay(uint t){
while(--t) Delayms();
}
/*************************** 检查忙状态函数 ****************************/
bit lcd_busy(){
bit result;
LCD_RS = 0; LCD_RW = 1; LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80); LCD_EN = 0;
return(result);
}
/**************************** 写命令函数 **********************************/
void lcd_wcmd(uchar cmd){
while(lcd_busy());
LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;
_nop_(); _nop_();
P0 = cmd;
delayNOP(); LCD_EN = 1;
delayNOP(); LCD_EN = 0;
}
/*************************** 写数据函数 ***********************************/
void lcd_wdat(uchar dat){
while(lcd_busy());
LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;
P0 = dat;
delayNOP(); LCD_EN = 1;
delayNOP(); LCD_EN = 0;
}
/*************************** LCD初始化函数 ********************************/
void lcd_init(){
LCD_PSB = 1; //并口方式
LCD_RST = 0;Delay(3); //液晶复位
LCD_RST = 1;Delay(3);
lcd_wcmd(0x34); Delay(5); //扩充指令操作
lcd_wcmd(0x30); Delay(5); //基本指令操作
lcd_wcmd(0x0C); Delay(5); //显示开,关光标
lcd_wcmd(0x01); Delay(5); //清除LCD的显示内容
}
/*************************** 设定显示位置函数 *****************************/
void lcd_pos(uchar X,uchar Y){
uchar pos;
if (X==1) X=0x80;
else if (X==2) X=0x90;
else if (X==3) X=0x88;
else if (X==4) X=0x98;
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/**************************** 图形显示函数 *******************************/
void photodisplay(uchar *bmp){
uchar i,j;
lcd_wcmd(0x34);
for(i=0;i<32;i++){ //显示图片的上半部分
lcd_wcmd(0x80+i); //先写入垂直坐标值
Delay(2);
lcd_wcmd(0x80); //写入水平坐标值
for(j=0;j<16;j++){ //再写入两个字节的图形数据
lcd_wdat(*bmp++);
Delay(2);
}
}
for(i=0;i<32;i++){ //显示图片的下半部分
lcd_wcmd(0x80+i); //先写入垂直坐标值
Delay(2);
lcd_wcmd(0x88); //写入水平坐标值
for(j=0;j<16;j++){ //再写入两个字节的图形数据
lcd_wdat(*bmp++);
Delay(2);
}
}
lcd_wcmd(0x36); //写完数据,开图形显示
}
/**************************** 清屏函数 *********************************/
void clr_screen(){
lcd_wcmd(0x34); Delay(5); //扩充指令操作
lcd_wcmd(0x30); Delay(5); //基本指令操作
lcd_wcmd(0x01); Delay(5); //清屏
}
/************************** 显示字符表函数 *******************************/
void bytecode(){
uchar s;
clr_screen(); //清屏
lcd_wcmd(0x80); //设置显示位置为第一行
for(s=0;s<16;s++){
Delay(2);
lcd_wdat(0x30+s);
}
lcd_wcmd(0x90); //设置显示位置为第二行
for(s=0;s<16;s++){
Delay(2);
lcd_wdat(0x40+s);
}
lcd_wcmd(0x88); //设置显示位置为第三行
for(s=0;s<16;s++){
Delay(2);
lcd_wdat(0x50+s);
}
lcd_wcmd(0x98); //设置显示位置为第四行
for(s=0;s<16;s++){
Delay(2);
lcd_wdat(0x60+s);
}
}
/*************************** 主函数 ******************************/
void main(){
uchar i;
Delay(100); //上电,等待稳定
lcd_init(); //初始化LCD
while(1){
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++){
lcd_wdat(DIS1[i]);
Delay(30);
}
lcd_pos(2,0); //设置显示位置为第二行
for(i=0;i<16;i++){
lcd_wdat(DIS2[i]);
Delay(30);
}
lcd_pos(3,0); //设置显示位置为第三行
for(i=0;i<16;i++){
lcd_wdat(DIS3[i]);
Delay(30);
}
Delay(1000);
clr_screen(); //清屏
photodisplay(Photo); //显示图片
Delay(2000);
bytecode(); //显示字符表代码
Delay(1000);
clr_screen();
}
}
评论1