/****************************************************************************************
LCD12864 ST7920控制芯片测试程序 本实验采用P3口和P0口驱动 实验时将跳线帽接至+3V
****************************************************************************************/
#include <c8051f020.h>
#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//------------------------------------
void PORT_Init (void);
void delay(uint z);
//-----------------------------------
#define LCDBUS P3
sbit RS = P0^0;
sbit RW = P0^1;
sbit E = P0^2;
sbit PSB = P0^3;
sbit RST = P0^4;
void PORT_Init (void)
{
XBR2 = 0x40; /*使能交叉开关*/
P3MDOUT =0xff;
P0MDOUT =0xff;
}
/*******************************/
void delay(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<121;y++);
}
/*******************************/
uchar code symbo[]={
/*-- 调入了一幅图像:D:\guoq files\technic support\pic\128x32 Symbo.bmp --*/
/*-- 宽度x高度=128x32 --*/
0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00,
0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x08,0x00,0x80,0x10,0x00,0x00,0x08,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08,
0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8,
0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00,
0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00,
0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
//-----------------------------------
// Delay Routine
//-----------------------------------
void delay100us(void) //delay TIMER1*1 ms for 12MHz
{
uchar data i;
for(i=0;i<=10;i++)
{
_nop_();
_nop_();
}
}
void delayms( uint m ) // 12MHz Xtal, close to ms value
{
uint j;
uint i;
for(i=0; i<m; i++)
for(j=0; j<109; j++)
_nop_();
}
void SdCmd(uchar Command) //send command
{
RS = 0;
RW=0;
LCDBUS = Command;
E = 1;
E = 0;
delay100us();
}
void SdData(uchar DData) //send display data
{
RS = 0;
RS=1;
RW=0;
LCDBUS = DData;
E = 1;
E = 0;
delay100us();
}
uchar RdData()
{
uchar DData;
RS = 0;
RW = 1;
RS=1;
LCDBUS=0xff;
E=1;
DData = LCDBUS;
E = 0;
return(DData);
}
//-----西文写入函数----------------
void PrintASCII(uint x,y,uchar *pstr) //通用函数
{
uint addr;
y=y<<4;
addr=y|0x80+x;
SdCmd(addr);
while(*pstr>0)
{
SdData(*pstr++);
}
}
//----中文写入函数-----------------
void PrintGB(uchar x,y,uchar *pstr)
{
uint addr;
y=y<<4;
addr=y|0x80+x;
SdCmd(addr);
while(*pstr>0)
{
SdData(*pstr++);
delayms(300); //演示用
}
}
//----初始化函数-----------------
void initLCM()
{
RST=0;
delayms(5);
RST=1;
delayms(800);
SdCmd(0x30); /* 设置工作方式(8位总线) */
SdCmd(0x06); /* 设置输入方式 */
SdCmd(0x0f); /* 设置显示方式 */
SdCmd(0x01); /* 清屏 */
delayms(2);
}
//----清屏函数------------------
void ClearRAM()
{
uchar i,j;
SdCmd(0x34);
for(i=0;i<32;i++)
{
SdCmd(i|0x80);
SdCmd(0x80);
for(j=0;j<16;j++)
{
SdData(0x00);//
SdData(0x00);
}
}
SdCmd(0x30);
}
//---- 画图函数-----------------------------
void ShowBmp(uchar x,y, width,high,uchar *bmp)
{
uchar i,j;
SdCmd(0x34);
SdCmd(0x36);
for(i=y;i<(y+high);i++)
{
if (i<32)
{
SdCmd(0x80|i);
SdCmd(0x80|x);
}
else
{
SdCmd(0x80|(i-32));
SdCmd(0x80|(x+8));
}
for(j=0;j<width;j++)
{
SdData(*bmp++);
SdData(*bmp++); //
}
}
SdCmd(0x30);
}
//---画点函数----------------
void Draw_Dot(uint x,y)
{
uchar m,n;
uint k;
if(y>=32)
{
y=y-32;
x=x+128;
}
SdCmd(y|0x80);
k=x/16;
SdCmd(k|0x80);
k=0x8000;
k=k>>x%16;
m=RdData();
m=RdData()|k>>8;
n=RdData()|k;
k=x/16;
SdCmd(y|0x80);
SdCmd(k|0x80);
SdData(m);
SdData(n);
}
//--- 画线函数---------------
void Draw_Line(uint x1,y1,x2,y2)
{
uint temp;
int dalt_x,dalt_y,err=0;
if (y1>y2)
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
Draw_Dot(x1,y1);
dalt_x=x2-x1;
dalt_y=y2-y1;
if(dalt_x>=0)
{
if(dalt_y>dalt_x)//k>1
{
while(y1<y2)
{
if(err<0)
{
x1=x1+1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
else
{
y1=y1+1;
err=err-dalt_x;
}
Draw_Dot(x1,y1);
}
}
else // 0<=k=<1
{
if (dalt_y==0)
y1=y1-1;
while(x1<x2)
{
if(err<0)
{
x1=x1+1;
err=err+dalt_y;
}
else
{
y1=y1+1;
x1=x1+1;
err=err+dalt_y-dalt_x;
}
Draw_Dot(x1,y1);
}
}
}
else
{
dalt_x=x1-x2;
if(dalt_y>dalt_x)//k<-1
{
while(y1<y2)
{
if(err<0)
{
x1=x1-1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
else
{
y1=y1+1;
err=err-dalt_x;
}
Draw_Dot(x1,y1);
}
}
else //0>k>=-1
{
if (dalt_y==0)
y1=y1-1;
while(x1>x2)
{
if(err<0)
{
x1=x1-1;
err=err+dalt_y;
}
else
{
x1=x1-1;
y1=y1+1;
评论2
最新资源