在整个工程里,SelectScreen()只在清屏函数里调用了,为什么也会影响后面的显示?
请各位老师帮我看看。
单片机源程序如下:
#ifndef __19264KS0107_H_
#define __19264KS0107_H_
#define uchar unsigned char //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
#define uint unsigned int //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535
/*定义19264液晶屏数据线—————————————————————————————————————————*/
#define Bus_Port P0 // 数据D0~D7
sbit LCD_RS = P2^6; // 数据=高,指令=低
sbit LCD_RW = P2^5; // 读=高,写=低
sbit LCD_EN = P2^4; // 读\写使能
sbit LCD_CS1 = P2^3; // 片选1
sbit LCD_RST = P2^2; // 液晶复位,低电平复位
sbit LCD_CS2 = P2^1; // 片选2
sbit LCD_CS3 = P2^0; // 片选3
/*写数据————————————————————————————————————————————————————*/
void Write19264_data(uchar dat)
{
LCD_RS=1;
LCD_RW=0;
Bus_Port=dat;
LCD_EN=1;
LCD_EN=0;
}
/*写指令———————————————————————————————————————————————*/
void Write19264_com(uchar com)
{
LCD_RS=0;
LCD_RW=0;
Bus_Port=com;
LCD_EN=1;
LCD_EN=0;
}
/*选择屏幕,screen: =0左屏;=1中屏;—————————————————————————————————————*/
void SelectScreen(uchar screen)
{
switch(screen)
{
case 0: LCD_CS1=0; LCD_CS2=1; LCD_CS3=1; break; //左屏
case 1: LCD_CS1=1; LCD_CS2=0; LCD_CS3=1; break; //中屏
case 2: LCD_CS1=1; LCD_CS2=1; LCD_CS3=0; break; //右屏
}
}
/*设定行地址(页面)--X=0-7———————————————————————————————————————————————*/
void SetLine(uchar Line)
{
Line=Line & 0x07; //0<=line<=7
Line=Line | 0xb8; //1011 1xxx
Write19264_com(Line); //向LCD发送命令
}
/*清屏函数,screen: =0左屏;=1中屏;=2右屏——————————————————————————————————————————————————————*/
void ClearScreen(uchar screen)
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{
SetLine(i);
for(j=0;j<64;j++)
{
Write19264_data(0x00);
}
}
}
/********************液晶片选并返回列地址***************************/
uchar LCD19264_PX(uchar add)
{
uchar ZZY; //ZZY代表左中右意思
ZZY = add/64;
if(ZZY==0){LCD_CS1=0;} else LCD_CS1=1;//片选左屏
if(ZZY==1){LCD_CS2=0;} else LCD_CS2=1;//片选中屏
if(ZZY==2){LCD_CS3=0;} else LCD_CS3=1;//片选左屏
return(add-ZZY*64); //返回在哪片小屏上的列开始写
}
/*初始化LCD函数———————————————————————————————————————————————————*/
void Init19264LCD(void)
{
uchar i;
LCD_RST=0; //液晶复位
Delay_ms(10);
LCD_RST=1;
for (i=0;i<3;i++)
{
LCD19264_PX(i); //选择左中右屏
ClearScreen(i); //清除左中右屏显示
}
Write19264_com(0x3f); //操作完毕开显示
}
/***********************************************************************
函数功能:指定位置显示8*16的字符
colcol列0~23,page行0~3 fb带表反白显示,fb=非0是反白显示,fb=0正常显示
************************************************************************/
void Disp_8x16(uchar col,uchar page,uchar fb,uchar code *cn)
{
uchar i,j,xpcol,page1;
xpcol =LCD19264_PX(col*8); //求出在哪片小屏上的列开始写
page1=page*2;
for(i=0;i<2;i++)
{
Write19264_com(0xb8+page1+i);
Write19264_com(0x40+xpcol);
for(j=0;j<8;j++)
{
if(fb) //如果f非0,则反白显示。
{
Write19264_data(~(cn[i*8+j]));
}
else //否则正常显示
{
Write19264_data(cn[i*8+j]);
}
}
}
}
void main()
{
Init19264LCD(); //19264屏初始化LCD函数
while(1)
{
/************说明*********************/
/*例如:Disp_8x16(0,0,1,ZM_8x16[0]);
括号第1个数指那一列开始
括号第2个数指那一行开始
括号第3个数指 0不反色显示 1反色显示
括号第4个数指 字库要显示的字或符号*/
Disp_8x16(0,0,1,ZM_8x16[0]); //0
Disp_8x16(1,0,1,ZM_8x16[1]); //1
Disp_8x16(2,0,1,ZM_8x16[2]); //2
Disp_8x16(3,0,1,ZM_8x16[3]); //3
Disp_8x16(4,0,1,ZM_8x16[4]); //4
Disp_8x16(5,0,1,ZM_8x16[5]); //5
Disp_8x16(6,0,1,ZM_8x16[6]); //6
Disp_8x16(7,0,1,ZM_8x16[7]); //7
Disp_8x16(20,0,1,ZM_8x16[8]); //8
Disp_8x16(21,0,1,ZM_8x16[9]); //9
}}
主函数只有最后两行在右屏有显示。
|