欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機xdata可以直接映射到IO口嗎?全局變量搞不懂
[打印本頁]
作者:
mengsiu
時間:
2018-5-27 23:01
標題:
單片機xdata可以直接映射到IO口嗎?全局變量搞不懂
最近淘到一片顯示屏,用的是6963的芯片。在網上找了段驅動代碼,但是自己讀不懂...代碼可以正常通過編譯,說明代碼是正確的。
而我不懂的是:
程序中沒有明顯地定義液晶屏引腳與單片機的連接,而在第12 13行定義了兩個xdata,后面的程序直接操作這兩個變量,難道這樣可以直接映射到IO口嗎?
要是我實際線路連接不一樣,我要怎么重新定義這些變量?
附單片機代碼:
/*----------------------------------------------------------------------------------------*/
//240*128液晶顯示驅動程序
//控制器件為:AT89S52
//T6963C接口:直接訪問形式
//程序設計:盧印舉
/*----------------------------------------------------------------------------------------*/
#include <reg51.h>
#include <math.h>
#include <hzk.c>
//信號管腳定義(全局變量)(注意:因為液晶數據口接P0,直接訪問方式)
unsigned char xdata Lcd_Cmd_Reg _at_ 0xfdff; // C/D-P2.0 CE-P2.1 p2.0=1 p2.1=0
unsigned char xdata Lcd_Data_Reg _at_ 0xfcff; // C/D-P2.0 CE-P2.1 p2.0=0 p2.1=0
//以8*8字符計算,顯示屏橫向、縱向可以顯示的點陣坐標;左、上、右、下以及當前的位置坐標
#define LCD_LEFT 0
#define LCD_TOP 0
#define LCD_RIGHT 239
#define LCD_BOTTOM 127
unsigned char data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask;
unsigned char data LeftMask[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};
unsigned char data RightMask[]={0xff,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe};
/*----------------------------------------------------------------------------------------*/
//延時子程序
/*----------------------------------------------------------------------------------------*/
void Lcddelay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
void lcdwc(unsigned char cmdcode)
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ; //當Lcd_Cmd_Reg低兩位不同時為1
Lcd_Cmd_Reg = cmdcode;
}
void lcdwc2(unsigned char cmdcode,unsigned char cmddata)
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = cmddata;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = cmdcode;
}
void lcdwc3(unsigned char cmdcode,unsigned char cmddata,unsigned char cmddata2)
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = cmddata;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = cmddata2;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = cmdcode;
}
void lcdwd(unsigned char dispdata) //寫數據
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = dispdata;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = 0xc0;
}
unsigned char lcdrdata(void) //讀數據
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = 0xc5;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
return Lcd_Data_Reg;
}
void lcdpos(void) //內部寫數指針定位
{ unsigned int CurrentAddress;
CurrentAddress = Lcd_CurrentY * 30 ;
CurrentAddress += Lcd_CurrentX/8;
lcdwc3(0x24,CurrentAddress & 0xff,CurrentAddress/256);
}
unsigned char lcdrd(void) //讀數據
{ lcdpos();
return lcdrdata();
}
void lcdcursornextbyte(void) //當前坐標移動到下一個點
{ Lcd_CurrentX+=8;
if(Lcd_CurrentX > LCD_RIGHT)
{ Lcd_CurrentX = LCD_LEFT;
Lcd_CurrentY++;
if(Lcd_CurrentY > LCD_BOTTOM) Lcd_CurrentY = LCD_TOP;
}
}
void displaybyte(unsigned char dispdata)
{ lcdpos();
if(Lcd_Mask == 0xff) lcdwd(dispdata);
else
{ unsigned char d=lcdrd();
d&=(~Lcd_Mask);
d|=(dispdata & Lcd_Mask);
lcdwd(d);
}
lcdcursornextbyte();
}
void Fill_Scr(unsigned char FillData) //LCD整屏顯示
{ Lcd_Mask=0xff;
for(Lcd_CurrentX = LCD_LEFT,Lcd_CurrentY = LCD_TOP;1;)
{ displaybyte(FillData);
if((Lcd_CurrentX == LCD_LEFT) && (Lcd_CurrentY == LCD_TOP)) break;
}
}
void lcdreset() //初始化LCD屏
{ lcdwc(0x80);
lcdwc(0x98);
lcdwc3(0x42,0,0);
lcdwc3(0x43,30,0);
}
void displaychinesechardot(unsigned int Index);
void displayenglishchardot(unsigned int Index);
void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);
void putchar(unsigned int uChar) //信息顯示
{ unsigned int i;
if(uChar<128)
for(i=0;i != ENGLISHCHARNUMBER;i++)
{ if(uChar ==EnglishCode[i])
{ displayenglishchardot(i);
break;
}
}
else
for(i=0;i != CHINESECHARNUMBER;i++)
{ if(uChar ==ChineseCode[i])
{ displaychinesechardot(i);
break;
}
}
}
void put_str(unsigned char code *s) //顯示漢字或英文字符
{ unsigned int i;
for (;*s != 0;s++)
{ i=*s;
if(*s > 127)
{ s++;
i=i*256+*s;
}
if(i == '\n')
{ Lcd_CurrentX = LCD_LEFT;
if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1)
Lcd_CurrentY=LCD_TOP;
else
Lcd_CurrentY+=CHINESECHARSIZE;
}
putchar(i);
}
}
void put_str_xy(unsigned char x,unsigned char y,unsigned char code *s)//顯示漢字或英文字符
{ Lcd_CurrentX=x;
Lcd_CurrentY=y;
put_str(s);
}
void displaychinesechardot(unsigned int Index)
{ unsigned char code *s;
s=ChineseCharDot+Index*CHINESECHARDOTSIZE;
if(Lcd_CurrentX > LCD_RIGHT-CHINESECHARSIZE+1)
{ Lcd_CurrentX = LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1) Lcd_CurrentY=LCD_TOP;
}
putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,s);
}
void displayenglishchardot(unsigned int Index)
{ unsigned char code *s;
s=EnglishCharDot+Index*ENGLISHCHARDOTSIZE;
if(Lcd_CurrentX > LCD_RIGHT-ENGLISHCHARSIZE+1)
{ Lcd_CurrentX = LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1)
Lcd_CurrentY=LCD_TOP;
}
putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,s);
}
void point(unsigned char bitdata)
{ if(bitdata==0)
bitdata=0xf0+(0x7-(Lcd_CurrentX & 0x7));
else
bitdata=0xf8+(0x7-(Lcd_CurrentX & 0x7));
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = bitdata;
}
/*----------------------------------------------------------------------------------------*/
//繪制點子程序,最后一位為像素大小
/*----------------------------------------------------------------------------------------*/
void pointxy(unsigned char x,unsigned char y,unsigned char bitdata)
{ Lcd_CurrentX=x;
Lcd_CurrentY=y;
lcdpos();
point(bitdata);
}
/*----------------------------------------------------------------------------------------*/
//畫線子程序:最后一位為線條的像素寬度
/*----------------------------------------------------------------------------------------*/
void linexy(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bitdata)
{ //線
unsigned char i,k;
if(abs(y1-y0)>abs(x1-x0))
{ if(y1>y0)
for(i=y0;i<=y1;i++)
{ if(x1>x0)
{ k=x1-x0;
k*=(i-y0);
k/=y1-y0;
pointxy(x0+k,i,bitdata);
}
else //x1<x0
{ k=x0-x1;
k*=(i-y0);
k/=y1-y0;
pointxy(x0-k,i,bitdata);
}
}
else //y1<y0
for(i=y0;i>=y1;i--)
{ if(x1>x0)
{ k=x1-x0;
k*=(y0-i);
k/=y0-y1;
pointxy(x0+k,i,bitdata);
}
else //x1<x0
{ k=x0-x1;
k*=(y0-i);
k/=y0-y1;
pointxy(x0-k,i,bitdata);
}
}
}
else //abs(y1-y0)<abs(x1-x0)
{ if(x1>x0)
for(i=x0;i<=x1;i++)
{ if(y1==y0)
pointxy(i,y0,bitdata);
else if(y1>y0)
{ k=y1-y0;
k*=(i-x0);
k/=x1-x0;
pointxy(i,y0+k,bitdata);
}
else //y1<y0
{ k=y0-y1;
k*=(i-x0);
k/=x1-x0;
pointxy(i,y0-k,bitdata);
}
}
else
for(i=x0;i>=x1;i--)
{ if(y1==y0)
pointxy(i,y0,bitdata);
else if(y1>y0)
{ k=y1-y0;
k*=(x0-i);
k/=x0-x1;
pointxy(i,y0+k,bitdata);
}
else //y1<y0
{ k=y0-y1;
k*=(x0-i);
k/=x0-x1;
pointxy(i,y0-k,bitdata);
}
}
}
}
void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bitdata)
{ //矩形
linexy(x0,y0,x0,y1,bitdata);
linexy(x0,y0,x1,y0,bitdata);
linexy(x0,y1,x1,y1,bitdata);
linexy(x1,y0,x1,y1,bitdata);
}
void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
{ unsigned char k,lx,ly,a1,a2,x;
Lcddelay(1000);
k=Lcd_CurrentX&0X7;
XSIZE+=k;
x=Lcd_CurrentX;
for(ly=0;ly<YSIZE;ly++,Lcd_CurrentY++)
for(Lcd_CurrentX=x,lx=k,a1=0;lx<XSIZE;s++)
{ unsigned char p;
a2=*s;
for(p=0;p<k;p++)
{ a2>>=1;
if((a1&0x1)==1) a2+=0x80;
a1>>=1;
}
lcdpos();
p=XSIZE&0X7;
if(lx<8)
{ if(XSIZE<8)
{ Lcd_Mask=LeftMask[k] & RightMask[p];
a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2 & Lcd_Mask);
lcdwd(a1);
lx=XSIZE;
Lcd_CurrentX+=XSIZE-k;
}
else //XSIZE>=8
{ Lcd_Mask=LeftMask[k];
a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2 & Lcd_Mask);
lcdwd(a1);
lx+=8-k;
Lcd_CurrentX+=8-k;
}
}
else if(lx>=XSIZE-p) //lx>=8
{ if(k>=p)
{ s--;
a1=*s;
a2=0;
for(p=0;p<k;p++)
{ a2>>=1;
if((a1&0x1)==1) a2+=0x80;
a1>>=1;
}
p=XSIZE&0X7;
}
Lcd_Mask=RightMask[p];
a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2 & Lcd_Mask);
lcdwd(a1);
lx+=p;
Lcd_CurrentX+=p;
}
else //lx>=8 and lx<XSIZE-p
{ lcdwd(a2);
lx+=8;
Lcd_CurrentX+=8;
}
a1=*s;
}
Lcd_CurrentY-=YSIZE;
}
void main()
{
lcdreset();
Fill_Scr(0x55); //顯示豎條
Lcddelay(6000); //系統延時
Fill_Scr(0xff); //顯示黑屏
Lcddelay(6000);
// put_str_xy(0,0,"創新科技檢測技術有限公司,聯系電話0512-86163888");//顯示漢字
put_str("創新科技檢測技術有限公司,聯系電話0512-86163888");
Fill_Scr(0x00);
//
rect(12,12,88,88,6);
Lcddelay(5000);
//Fill_Scr(0xff);
//rect(12,12,88,120,0);
lcdreset();
}
復制代碼
作者:
mengsiu
時間:
2018-5-28 22:03
24小時必答嗎?已經24小時了嗎?已經快24小時了。
作者:
mengsiu
時間:
2018-6-2 09:45
24小時必答嗎?已經24小時了嗎?已經100小時了。
作者:
mengsiu
時間:
2018-6-7 13:28
24小時必答嗎?已經24小時了嗎?已經240小時了。
作者:
mengsiu
時間:
2018-9-7 10:24
24小時必答嗎?已經24小時了嗎?已經2400+小時了。
作者:
sxhwdz
時間:
2018-9-18 19:49
早先的51單片機內部沒有XRAM,而且都是使用總線結構,P0是數據8位數據總線,與低8位地址總線,P2是高8位地址總線。而外部設備的尋址也是通過映射到XRAM段,操作外設與XRAM讀取類似。12、13行定義的應該是液晶屏的命令和數據的選通信號。
作者:
angmall
時間:
2018-9-18 21:31
題主你好,你這樣的提問。我估計沒幾個人會回答你的。
其實就一條解決方案:研讀T6963C手冊!!!
作者:
sxhwdz
時間:
2018-9-19 06:58
unsigned char xdata Lcd_Cmd_Reg _at_ 0xfdff; // C/D-P2.0 CE-P2.1 p2.0=1 p2.1=0
unsigned char xdata Lcd_Data_Reg _at_ 0xfcff; // C/D-P2.0 CE-P2.1 p2.0=0 p2.1=0
液晶屏C/D連接的是P2.0,CE連接的是P2.1,RD連接P3.7,WR連接P3.6。當對地址 0xfdff 的 Lcd_Cmd_Reg 讀/寫時,C/D=1,CE=0,完成對液晶屏指令寄存器的讀寫。對地址 0xfcff 的 Lcd_Data_Reg 讀/寫時,C/D=0,CE=0,完成對液晶屏數據寄存器的讀寫。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1