|
|
发表于 2016-12-15 14:35:13
|
显示全部楼层
#include <reg51.h>
#include <intrins.h>
#include "12864Data.h"
#define uchar unsigned char
#define uint unsigned int
#define u8 unsigned char
#define u16 unsigned int
/*****************************************************/
//STC12 系列新增寄存器
sfr P0M0=0x94;
sfr P1M1=0x91;
sfr P1M0=0x92;
sfr P2M1=0x95;
sfr P2M0=0x96;
sfr P3M0=0xb2;
sfr P3M1=0xb1;
sfr P4M0=0xb4;
sfr P4=0xc0;
sfr P4SW=0xbb;
sfr P5M1=0xC9;
sfr P5M0=0xCA;
sfr IPH=0xb7;
sfr P1ASF=0x9d;
/*************************************************/
//萝莉控LCD引脚定义
/*
sbit CS=P0^6;
sbit RST=P0^7;
sbit RS=P4^6;
sbit SDA=P4^5;
sbit CLK=P4^4;
sbit LEDA=P2^5;
测试LCD引脚定义成功点亮
stc15w204s
_______
P1.2--1 | | 16--P1.1
P1.3--2 | | 15--P1.0
P1.4--3 | | 14--P3.7--txd
P1.5--4 | | 13--P3.6--rxd
P5.4--5 | | 12--P3.3
VCC --6 | | 11--P3.2
P5.5--7 | | 10--P3.1--txd
GND --8 |_______| 9 --P3.0--rxd
sbit SCK=P1^1;
sbit SDA=P1^0;
sbit RS=P3^7;
sbit RST=P3^6;
sbit CS=P3^3;
/**修改为兼容萝莉控LCD引脚定义无法点亮*********************/
/*
sbit CS=P0^6;
sbit RST=P0^7;
sbit RS=P4^6;
sbit SDA=P4^5;
sbit SCK=P4^4;
sbit LEDA=P2^5;
/***************LCD引脚定义*********************/
sbit SCK=P1^1;
sbit SDA=P1^0;
sbit RS=P3^7;
sbit RST=P3^6;
sbit CS=P3^3;
sbit LEDA=P3^2;
u8 lcd[10];//显示缓存
void Delay1ms() //@12.000MHz
{
u8 i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void DelayMs(u16 i) //延时N毫秒,0~65535ms
{
while(i--) Delay1ms();
}
/*****************液晶屏函数**********************/
/*写指令到 LCD 模块*/
void Command(u8 Data)
{
u8 i;
CS=0;
RS=0;
for(i=0;i<8;i++)
{
SCK=0;
if(Data&0x80) SDA=1;
else SDA=0;
SCK=1;
Data=Data<<=1;
}
}
/*写数据到 LCD 模块*/
void SendData(u8 Data)
{
u8 i;
CS=0;
RS=1;
for(i=0;i<8;i++)
{
SCK=0;
if(Data&0x80) SDA=1;
else SDA=0;
SCK=1;
Data=Data<<=1;
}
}
/*LCD 模块初始化*/
void InitLCD()
{
CS=0;
RST=0; /*低电平复位*/
DelayMs(2);
RST=1; /*复位完毕*/
DelayMs(10);
Command(0xE2); /*软复位*/
DelayMs(1);
Command(0x2C); /*升压步聚 1*/
Command(0x2E); /*升压步聚 2*/
Command(0x2F); /*升压步聚 3*/
DelayMs(1);
Command(0x23); /*粗调对比度,可设置范围 0x20~0x27*/
Command(0x81); /*微调对比度*/
Command(0x28); /*0x1a,微调对比度的值,可设置范围 0x00~0x3f*/
Command(0xA2); /*1/9 偏压比(bias)*/
Command(0xC8); /*行扫描顺序:从上到下*/
Command(0xA0); /*列扫描顺序:从左到右*/
Command(0x40); /*起始行:第一行开始*/
Command(0xAF); /*开显示*/
CS=1;
}
/*设置液晶屏的显示地址*/
void Address(u8 Page,u8 Column)
{
CS=0;
Column=Column-1; //我们平常所说的第 1 列,在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1.
Page=Page-1;
Command(0xB0+Page); //设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。
//我们平常所说的第 1 页,在 LCD 驱动 IC 里是第 0 页,所以在这里减去 1
Command(((Column>>4)&0x0F)+0x10); //设置列地址的高 4 位
Command(Column&0x0F); //设置列地址的低 4 位
}
/*全屏清屏*/
void ClearScreen()
{
u8 i,j;
CS=0;
for(i=0;i<9;i++)
{
Address(1+i,1);
for(j=0;j<132;j++)
{
SendData(0x00); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
}
}
CS=1;
}
/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/
void Display16x16(u8 Page,u8 Column,u8 *dp)
{
u8 i,j;
CS=0;
for(j=0;j<2;j++)
{
Address(Page+j,Column);
for (i=0;i<16;i++)
{
SendData(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/
dp++;
}
}
CS=1;
}
//显示8*16的字符串
void Display8x16(u8 Page,u8 Column,u8 *text)
{
u8 i=0,j,k,n;
CS=0;
while(text[i]>0x00)
{
if((text[i]>=0x20)&&(text[i]<=0x7E)) //32~126 ASCII码表的字符串数值之内
{
j=text[i]-0x20;//ASCII码值-32,刚好是该字符的ascii_table_8x16数组中点阵开始地址
for(n=0;n<2;n++)
{
Address(Page+n,Column);
for(k=0;k<8;k++)
{
SendData(ascii_table_8x16[j][k+8*n]);/*显示 5x7 的 ASCII 字到 LCD 上,y 为页地址,x 为列地址,最后为数据*/
}
}
i++;
Column+=8;
}
else
i++;
}
}
/***********************液晶屏函数结束****************/
void main(void)
{
LEDA=1;
DelayMs(100);//延时100ms等待稳定运行
InitLCD();
ClearScreen();
Display16x16(1,1,zong);
Display16x16(1,17,dian);
Display16x16(1,33,ya);
Display8x16(1,50,":");
Display16x16(1,68,":");
Display16x16(3,1,dian);
Display16x16(3,17,chi);
Display8x16(3,33,"1");
Display8x16(3,41,":");
Display16x16(5,1,dian);
Display16x16(5,17,chi);
Display8x16(5,33,"2");
Display8x16(5,41,":");
Display16x16(7,1,dian);
Display16x16(7,17,chi);
Display8x16(7,33,"3");
Display8x16(7,41,":");
lcd[6]=' ';
lcd[7]=' ';
lcd[8]=' ';
lcd[9]=' ';
while(1)
{
}
} |
| |