在整個工程里,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
}}
主函數只有最后兩行在右屏有顯示。
|