|
这个程序的管脚设置是哪里出错了吗,因为一直出现
Error[Pe020]: identifier "P5OUT" is undefined C:\Users\Administrator\Desktop\脉搏波显示1\12864.c 186
的错误
是这个语句的错误吗#define LCD_CMDOut P5DIR|=0xe3
希望大家能够不吝赐教~~~
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define LCD_DataIn P4DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P4DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P4IN
#define MCU2LCD_Data P4OUT
#define LCD_CMDOut P5DIR|=0xe3
#define LCD_RS_H P5OUT|=BIT5 //P5.5
#define LCD_RS_L P5OUT&=~BIT5 //P5.5
#define LCD_RW_H P5OUT|=BIT6 //P5.6
#define LCD_RW_L P5OUT&=~BIT6 //P5.6
#define LCD_EN_H P5OUT|=BIT7 //P5.7
#define LCD_EN_L P5OUT&=~BIT7 //P5.7
#define LCD_PSB_H P5OUT|=BIT0 //P5.0
#define LCD_PSB_L P5OUT&=~BIT0 //P5.0
#define LCD_RST_H P5OUT|=BIT1 //P5.1
#define LCD_RST_L P5OUT&=~BIT1 //P5.1
/**************************************************
函数名称:Delay_1ms
功 能:延时1ms
参 数:无
返回值 :无
**************************************************/
void Delay_1ms(void)
{
uchar i;
for(i=150;i>0;i--) _NOP();
}
void Delay_Nms(uint n)
{
uint i;
for(i=n;i>0;i--) Delay_1ms();
}
/**************************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
**************************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
LCD_RS_L;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/**************************************************
函数名称:Write_Data
功 能:向液晶中写数据
参 数:dat--显示数据
返回值 :无
**************************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_RS_H;
LCD_RW_L;
LCD_DataOut;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/**************************************************
函数名称:Ini_lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
**************************************************/
void Ini_lcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出
// Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址归位
Delay_1ms();
Write_Cmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01); //清除显示
Delay_1ms();
Write_Cmd(0x06); //游标右移
Delay_1ms();
Write_Cmd(0x80); //设定显示的起始地址
}
/**************************************************
函数名称:Clear_GDRAM
功 能:清除液晶GDRAM中的随机数据
参 数:无
返回值 :无
**************************************************/
void Clear_GDRAM(void)
{
uchar i,j,k;
Write_Cmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
Write_Cmd(0x30); //回到基本指令集
}
/**************************************************
函数名称:Lcd_ReadData
功 能:读取12864中一个字节的数据
参 数:无
返回值 :显示的数据
**************************************************/
uchar Lcd_ReadData()
{
unsigned char Data_Temp;
uchar lcdtemp;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_RS_H;
LCD_RW_H;
LCD_DataIn;
LCD_EN_H;
_NOP();
Data_Temp = LCD2MCU_Data;
LCD_EN_L;
return Data_Temp;
}
/**************************************************
函数名称:LCD_Set_Dot
功 能:任意位置画点,但覆盖原来的数据
参 数:X--横坐标
Y--纵坐标
返回值 :无
**************************************************/
void LCD_Set_Dot(uchar X,uchar Y)
{
uchar X_byte,X_bit;
uchar Y_byte,Y_bit;
X_byte = X<<4;
X_bit = X%16;
Y_byte = Y<<5;
Y_bit = Y%32;
Write_Cmd(0x34);
Write_Cmd(0x80 + Y_bit);
Write_Cmd(0x80 + X_byte + (Y_byte<<3));
if(X_bit < 8)
{
Write_Data(0x01<<(7 - X_bit)) ;
Write_Data(0x00);
}
else
{
Write_Data(0x00);
Write_Data(0x01<<(15 - X_bit));
}
Write_Cmd(0x36);
// Write_Cmd(0x30);
}
/**************************************************
函数名称:LCD_Set_Dot1
功 能:任意位置画点,不覆盖原来的数据
参 数:X--横坐标
Y--纵坐标
返回值 :无
**************************************************/
void LCD_Set_Dot1(uchar X,uchar Y)
{
uchar X_byte,X_bit,Oldbyte_H;
uchar Y_byte,Y_bit,Oldbyte_L;
X_byte = X/16;
X_bit = X%16;
Y_byte = Y/32;
Y_bit = Y%32;
// Write_Cmd(0x34);
Write_Cmd(0x80 + Y_bit);
Write_Cmd(0x80 + X_byte + (Y_byte<<3));
Lcd_ReadData(); //没有这一条指令出错~!
Oldbyte_H = Lcd_ReadData();
Oldbyte_L = Lcd_ReadData();
// Write_Cmd(0x34);
Write_Cmd(0x80 + Y_bit);
Write_Cmd(0x80 + X_byte + (Y_byte<<3));
if(X_bit < 8)
{
Write_Data((Oldbyte_H) | (0x01<<(7 - X_bit))) ;
Write_Data(Oldbyte_L);
}
else
{
Write_Data(Oldbyte_H);
Write_Data((Oldbyte_L) | (0x01<<(15 - X_bit)));
}
Write_Cmd(0x36);
// Write_Cmd(0x30);
}
/**************************************************
函数名称:LCD_ReSet_Dot1
功 能:任意位置点复位,不覆盖原来的数据
参 数:X--横坐标
Y--纵坐标
返回值 :无
**************************************************/
void LCD_ReSet_Dot1(uchar X,uchar Y)
{
uchar X_byte,X_bit,Oldbyte_H;
uchar Y_byte,Y_bit,Oldbyte_L;
X_byte = X/16;
X_bit = X%16;
Y_byte = Y/32;
Y_bit = Y%32;
// Write_Cmd(0x34);
Write_Cmd(0x80 + Y_bit);
Write_Cmd(0x80 + X_byte + (Y_byte<<3));
Lcd_ReadData(); //没有这一条指令出错~!
Oldbyte_H = Lcd_ReadData();
Oldbyte_L = Lcd_ReadData();
// Write_Cmd(0x34);
Write_Cmd(0x80 + Y_bit);
Write_Cmd(0x80 + X_byte + (Y_byte<<3));
if(X_bit < 8)
{
Write_Data((Oldbyte_H) & (~(0x01<<(7 - X_bit)))) ;
Write_Data(Oldbyte_L);
}
else
{
Write_Data(Oldbyte_H);
Write_Data((Oldbyte_L) & (~(0x01<<(15 - X_bit))));
}
Write_Cmd(0x36);
// Write_Cmd(0x30);
}
/**************************************************
函数名称:Lcd_DrawLine_X
功 能:画横线
参 数:x_start--起始地址x坐标
x_end --结束地址x坐标
y --y坐标
返回值 :无
**************************************************/
void Lcd_DrawLine_X(uchar x_start,uchar x_end,uchar y)
{
uchar temp;
if(x_start > x_end)
{
temp = x_start;
x_start = x_end;
x_end = temp;
}
do
{
LCD_Set_Dot1(x_start,y);
x_start++;
}
while(x_start <= x_end);
}
/**************************************************
函数名称:Lcd_DrawLine_Y
功 能:画竖线
参 数:y_start--起始地址y坐标
y_end --结束地址y坐标
x --x坐标
返回值 :无
**************************************************/
void Lcd_DrawLine_Y(uchar y_start,uchar y_end,uchar x)
{
uchar temp;
if(y_start > y_end)
{
temp = y_start;
y_start = y_end;
y_end = temp;
}
do
{
LCD_Set_Dot1(x,y_start);
y_start++;
}
while(y_start <= y_end);
}
/**************************************************
函数名称:Lcd_ReDrawLine_Y
功 能:取消画的竖线
参 数:y_start--起始地址y坐标
y_end --结束地址y坐标
x --x坐标
返回值 :无
**************************************************/
void Lcd_ReDrawLine_Y(uchar y_start,uchar y_end,uchar x)
{
uchar temp;
if(y_start > y_end)
{
temp = y_start;
y_start = y_end;
y_end = temp;
}
do
{
LCD_ReSet_Dot1(x,y_start);
y_start++;
}
while(y_start <= y_end);
}
/**************************************************
函数名称:Lcd_DrawLine
功 能:画任意直线
参 数:x_start--起始地址x坐标
x_end --结束地址x坐标
y_start--起始地址y坐标
y_end --结束地址y坐标
返回值 :无
**************************************************/
void DrawLine(uchar x_start,uchar y_start,uchar x_end,uchar y_end)
{
int range_x,range_y;
int flagx,flagy;
uchar distance,t;
uchar xt,yt;
range_x = x_end - x_start;
range_y = y_end - y_start;
if(range_x > 0) flagx = 1;
else
if(range_x == 0)
{
Lcd_DrawLine_Y(y_start,y_end,x_start);
return;
}
else
{
flagx = -1;
}
/************Y轴****************/
if(range_y > 0) flagy = 1;
else
if(range_y == 0)
{
Lcd_DrawLine_X(x_start,x_end,y_start);
return;
}
else
{
flagy = -1;
}
range_x = abs(range_x);
range_y = abs(range_y);
if(range_x > range_y) distance = range_x;
else
distance = range_y;
/************Bresenham 画线算法****************/
for(t=0;t
{
LCD_Set_Dot1(x_start,y_start);
xt = xt + range_x;
yt = yt + range_y;
if(xt>distance)
{
xt = xt - distance;
x_start = x_start + flagx;
}
if(yt > distance)
{
yt = yt - distance;
y_start = y_start + flagy;
}
}
}
/**************************************************
函数名称:Draw_TX
功 能:画圆
参 数:Yaddr--Y地址
Xaddr--Y地址
dp --指向图形数据存放地址的指针
返回值 :无
**************************************************/
void Lcd_DrawCircle(uchar x,uchar y,uchar r)
{
uchar a,b;
float c;
a = 0;
b = r;
// c = 1.25 - r;
c = 3 - 2*r;
while(a < b)
{
LCD_Set_Dot1(x+a,y+b);
LCD_Set_Dot1(x-a,y+b);
LCD_Set_Dot1(x+a,y-b);
LCD_Set_Dot1(x-a,y-b);
LCD_Set_Dot1(x+b,y+a);
LCD_Set_Dot1(x-b,y+a);
LCD_Set_Dot1(x+b,y-a);
LCD_Set_Dot1(x-b,y-a);
if(c < 0)
{
c = c+4*a + 6;
}
else
{
c= c + 4*(a - b) + 10;
b-=1;
}
a = a + 1;
}
if(a == b)
{
LCD_Set_Dot1(x+a,y+b);
LCD_Set_Dot1(x-a,y+b);
LCD_Set_Dot1(x+a,y-b);
LCD_Set_Dot1(x-a,y+b);
LCD_Set_Dot1(x+b,y+a);
LCD_Set_Dot1(x-b,y+a);
LCD_Set_Dot1(x+b,y-a);
LCD_Set_Dot1(x-b,y-a);
}
}
/**************************************************
函数名称:Disp_HZ
功 能:显示汉字
参 数:addr--指定行
*pt--指向数据的指针
num--汉字的个数
返回值 :无
**************************************************/
void Disp_HZ(uchar addr,const uchar *pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}
/*******************************************
函数名称:Draw_PM
功 能:在整个液晶屏幕上画图
参 数:无
返回值 :无
********************************************/
void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
Write_Cmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k = 0;k < 16;k++)
{
Write_Data(*ptr++);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(*ptr++);
}
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集
}
/**************************************************
函数名称:Draw_TX
功 能:显示一个16X16的图形
参 数:Yaddr--Y地址
Xaddr--Y地址
dp --指向图形数据存放地址的指针
返回值 :无
**************************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar *dp)
{
uchar j;
uchar k=0;
Write_Cmd(0x34);
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++);
Write_Cmd(Xaddr);
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}
Write_Cmd(0x36);
}
/**************************************************
函数名称:Draw_Font
功 能:显示一个3X8的图形
参 数:Yaddr--Y地址
Xaddr--Y地址
dp --指向图形数据存放地址的指针
返回值 :无
**************************************************/
void Draw_Font(uchar Yaddr,uchar Xaddr,uchar *dp)
{
uchar j,i;
// uchar k=0;
// Write_Cmd(0x34);
for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
if( (0x80>>j) & (*dp) )
LCD_Set_Dot1(Xaddr+i,Yaddr+j);
else
LCD_ReSet_Dot1(Xaddr+i,Yaddr+j);
}
dp++;
}
/* for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++);
Write_Cmd(Xaddr);
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}*/
// Write_Cmd(0x36);
}
|
|