久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3982|回復: 8
打印 上一主題 下一主題
收起左側

單片機xdata可以直接映射到IO口嗎?全局變量搞不懂

[復制鏈接]
跳轉到指定樓層
樓主
ID:16255 發表于 2018-5-27 23:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近淘到一片顯示屏,用的是6963的芯片。在網上找了段驅動代碼,但是自己讀不懂...代碼可以正常通過編譯,說明代碼是正確的。

而我不懂的是:
  • 程序中沒有明顯地定義液晶屏引腳與單片機的連接,而在第12 13行定義了兩個xdata,后面的程序直接操作這兩個變量,難道這樣可以直接映射到IO口嗎?
  • 要是我實際線路連接不一樣,我要怎么重新定義這些變量?


附單片機代碼:
  1. /*----------------------------------------------------------------------------------------*/   
  2. //240*128液晶顯示驅動程序   
  3. //控制器件為:AT89S52   
  4. //T6963C接口:直接訪問形式   
  5. //程序設計:盧印舉   
  6. /*----------------------------------------------------------------------------------------*/   
  7. #include <reg51.h>   
  8. #include <math.h>   
  9. #include <hzk.c>   
  10.    
  11. //信號管腳定義(全局變量)(注意:因為液晶數據口接P0,直接訪問方式)   
  12. unsigned char xdata Lcd_Cmd_Reg _at_ 0xfdff;    // C/D-P2.0   CE-P2.1  p2.0=1 p2.1=0   
  13. unsigned char xdata Lcd_Data_Reg _at_ 0xfcff;   // C/D-P2.0   CE-P2.1  p2.0=0 p2.1=0   
  14.    
  15. //以8*8字符計算,顯示屏橫向、縱向可以顯示的點陣坐標;左、上、右、下以及當前的位置坐標   
  16. #define LCD_LEFT 0   
  17. #define LCD_TOP  0   
  18. #define LCD_RIGHT 239   
  19. #define LCD_BOTTOM 127   
  20. unsigned char data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask;   
  21.    
  22. unsigned char data LeftMask[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};   
  23. unsigned char data RightMask[]={0xff,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe};   
  24.    
  25. /*----------------------------------------------------------------------------------------*/   
  26. //延時子程序   
  27. /*----------------------------------------------------------------------------------------*/   
  28. void Lcddelay(unsigned int t)     
  29. {  unsigned int i,j;   
  30.    for(i=0;i<t;i++)   
  31.       for(j=0;j<10;j++)   
  32.          ;   
  33. }   
  34.    
  35. void lcdwc(unsigned char cmdcode)   
  36. {  while((Lcd_Cmd_Reg & 0x3) != 0x3) ;  //當Lcd_Cmd_Reg低兩位不同時為1   
  37.       Lcd_Cmd_Reg = cmdcode;   
  38. }   
  39.    
  40. void lcdwc2(unsigned char cmdcode,unsigned char cmddata)   
  41. {  while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  42.       Lcd_Data_Reg = cmddata;   
  43.    while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  44.       Lcd_Cmd_Reg = cmdcode;   
  45. }   
  46.    
  47. void lcdwc3(unsigned char cmdcode,unsigned char cmddata,unsigned char cmddata2)   
  48. {  while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  49.       Lcd_Data_Reg = cmddata;   
  50.    while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  51.       Lcd_Data_Reg = cmddata2;   
  52.    while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  53.       Lcd_Cmd_Reg = cmdcode;   
  54. }   
  55.    
  56. void lcdwd(unsigned char dispdata)           //寫數據   
  57. {  while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  58.       Lcd_Data_Reg = dispdata;   
  59.    while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  60.       Lcd_Cmd_Reg = 0xc0;   
  61. }   
  62.    
  63. unsigned char lcdrdata(void)                 //讀數據   
  64. {  while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  65.       Lcd_Cmd_Reg = 0xc5;   
  66.    while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  67.       return Lcd_Data_Reg;   
  68. }   
  69.    
  70. void lcdpos(void)                            //內部寫數指針定位   
  71. {  unsigned int CurrentAddress;   
  72.    CurrentAddress = Lcd_CurrentY * 30 ;   
  73.    CurrentAddress += Lcd_CurrentX/8;   
  74.    lcdwc3(0x24,CurrentAddress & 0xff,CurrentAddress/256);   
  75. }   
  76.    
  77. unsigned char lcdrd(void)                    //讀數據   
  78. {  lcdpos();   
  79.    return lcdrdata();   
  80. }   
  81.    
  82. void lcdcursornextbyte(void)  //當前坐標移動到下一個點   
  83. {  Lcd_CurrentX+=8;   
  84.    if(Lcd_CurrentX > LCD_RIGHT)   
  85.    {  Lcd_CurrentX = LCD_LEFT;   
  86.       Lcd_CurrentY++;   
  87.       if(Lcd_CurrentY > LCD_BOTTOM) Lcd_CurrentY = LCD_TOP;   
  88.    }   
  89. }   
  90.    
  91. void displaybyte(unsigned char dispdata)   
  92. {  lcdpos();   
  93.    if(Lcd_Mask == 0xff) lcdwd(dispdata);   
  94.    else   
  95.    {  unsigned char d=lcdrd();   
  96.       d&=(~Lcd_Mask);   
  97.       d|=(dispdata & Lcd_Mask);   
  98.       lcdwd(d);   
  99.    }   
  100.    lcdcursornextbyte();   
  101. }   
  102.    
  103. void Fill_Scr(unsigned char FillData)    //LCD整屏顯示   
  104. {  Lcd_Mask=0xff;   
  105.    for(Lcd_CurrentX = LCD_LEFT,Lcd_CurrentY = LCD_TOP;1;)   
  106.    {  displaybyte(FillData);   
  107.       if((Lcd_CurrentX == LCD_LEFT) && (Lcd_CurrentY == LCD_TOP)) break;   
  108.    }   
  109. }   
  110.    
  111. void lcdreset()             //初始化LCD屏   
  112. {  lcdwc(0x80);   
  113.    lcdwc(0x98);   
  114.    lcdwc3(0x42,0,0);   
  115.    lcdwc3(0x43,30,0);   
  116. }   
  117.    
  118. void displaychinesechardot(unsigned int Index);   
  119. void displayenglishchardot(unsigned int Index);   
  120. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);   
  121.    
  122. void putchar(unsigned int uChar)  //信息顯示   
  123. {  unsigned int i;   
  124.    if(uChar<128)   
  125.       for(i=0;i != ENGLISHCHARNUMBER;i++)   
  126.       {  if(uChar ==EnglishCode[i])   
  127.          {  displayenglishchardot(i);   
  128.             break;   
  129.          }   
  130.       }   
  131.    else   
  132.       for(i=0;i != CHINESECHARNUMBER;i++)   
  133.       {  if(uChar ==ChineseCode[i])   
  134.          {  displaychinesechardot(i);   
  135.             break;   
  136.          }   
  137.       }   
  138. }   
  139.    
  140. void put_str(unsigned char code *s) //顯示漢字或英文字符   
  141. {  unsigned int i;   
  142.    for (;*s != 0;s++)   
  143.    {  i=*s;   
  144.       if(*s > 127)   
  145.       {  s++;   
  146.          i=i*256+*s;   
  147.       }   
  148.       if(i == '\n')   
  149.       {  Lcd_CurrentX = LCD_LEFT;   
  150.          if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1)   
  151.             Lcd_CurrentY=LCD_TOP;   
  152.          else   
  153.             Lcd_CurrentY+=CHINESECHARSIZE;   
  154.       }   
  155.       putchar(i);   
  156.    }   
  157. }   
  158.    
  159. void put_str_xy(unsigned char x,unsigned char y,unsigned char code *s)//顯示漢字或英文字符   
  160. {  Lcd_CurrentX=x;   
  161.    Lcd_CurrentY=y;   
  162.    put_str(s);   
  163. }   
  164.    
  165. void displaychinesechardot(unsigned int Index)   
  166. {  unsigned char code *s;   
  167.    s=ChineseCharDot+Index*CHINESECHARDOTSIZE;   
  168.    if(Lcd_CurrentX > LCD_RIGHT-CHINESECHARSIZE+1)   
  169.    {   Lcd_CurrentX = LCD_LEFT;   
  170.        Lcd_CurrentY+=CHINESECHARSIZE;   
  171.        if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1) Lcd_CurrentY=LCD_TOP;   
  172.    }   
  173.    putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,s);   
  174. }   
  175.    
  176. void displayenglishchardot(unsigned int Index)   
  177. {  unsigned char code *s;   
  178.    s=EnglishCharDot+Index*ENGLISHCHARDOTSIZE;   
  179.    if(Lcd_CurrentX > LCD_RIGHT-ENGLISHCHARSIZE+1)   
  180.    {  Lcd_CurrentX = LCD_LEFT;   
  181.       Lcd_CurrentY+=CHINESECHARSIZE;   
  182.       if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1)   
  183.          Lcd_CurrentY=LCD_TOP;   
  184.    }   
  185.    putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,s);   
  186. }   
  187.    
  188. void point(unsigned char bitdata)   
  189. {  if(bitdata==0)   
  190.       bitdata=0xf0+(0x7-(Lcd_CurrentX & 0x7));   
  191.    else   
  192.       bitdata=0xf8+(0x7-(Lcd_CurrentX & 0x7));   
  193.    while((Lcd_Cmd_Reg & 0x3) != 0x3) ;   
  194.       Lcd_Cmd_Reg = bitdata;   
  195. }   
  196.    
  197. /*----------------------------------------------------------------------------------------*/   
  198. //繪制點子程序,最后一位為像素大小   
  199. /*----------------------------------------------------------------------------------------*/   
  200. void pointxy(unsigned char x,unsigned char y,unsigned char bitdata)         
  201. {  Lcd_CurrentX=x;   
  202.    Lcd_CurrentY=y;   
  203.    lcdpos();   
  204.    point(bitdata);   
  205. }   
  206.    
  207. /*----------------------------------------------------------------------------------------*/   
  208. //畫線子程序:最后一位為線條的像素寬度   
  209. /*----------------------------------------------------------------------------------------*/   
  210. void linexy(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bitdata)   
  211. {                                                       //線   
  212.    unsigned char i,k;   
  213.    if(abs(y1-y0)>abs(x1-x0))   
  214.    {  if(y1>y0)   
  215.          for(i=y0;i<=y1;i++)   
  216.          {  if(x1>x0)   
  217.             {  k=x1-x0;   
  218.                k*=(i-y0);   
  219.                k/=y1-y0;   
  220.                pointxy(x0+k,i,bitdata);   
  221.             }   
  222.             else  //x1<x0   
  223.             {  k=x0-x1;   
  224.                k*=(i-y0);   
  225.                k/=y1-y0;   
  226.                pointxy(x0-k,i,bitdata);   
  227.             }   
  228.          }   
  229.       else        //y1<y0   
  230.          for(i=y0;i>=y1;i--)   
  231.          {  if(x1>x0)   
  232.             {  k=x1-x0;   
  233.                k*=(y0-i);   
  234.                k/=y0-y1;   
  235.                pointxy(x0+k,i,bitdata);   
  236.             }   
  237.             else   //x1<x0   
  238.             {  k=x0-x1;   
  239.                k*=(y0-i);   
  240.                k/=y0-y1;   
  241.                pointxy(x0-k,i,bitdata);   
  242.             }   
  243.          }   
  244.    }   
  245.    else            //abs(y1-y0)<abs(x1-x0)   
  246.    {  if(x1>x0)   
  247.          for(i=x0;i<=x1;i++)   
  248.          {  if(y1==y0)   
  249.                pointxy(i,y0,bitdata);   
  250.             else if(y1>y0)   
  251.             {  k=y1-y0;   
  252.                k*=(i-x0);   
  253.                k/=x1-x0;   
  254.                pointxy(i,y0+k,bitdata);   
  255.             }   
  256.             else     //y1<y0   
  257.             {  k=y0-y1;   
  258.                k*=(i-x0);   
  259.                k/=x1-x0;   
  260.                pointxy(i,y0-k,bitdata);   
  261.             }   
  262.          }   
  263.       else   
  264.          for(i=x0;i>=x1;i--)   
  265.          {  if(y1==y0)   
  266.                pointxy(i,y0,bitdata);   
  267.             else if(y1>y0)   
  268.             {  k=y1-y0;   
  269.                k*=(x0-i);   
  270.                k/=x0-x1;   
  271.                pointxy(i,y0+k,bitdata);   
  272.             }   
  273.             else     //y1<y0   
  274.             {  k=y0-y1;   
  275.                k*=(x0-i);   
  276.                k/=x0-x1;   
  277.                pointxy(i,y0-k,bitdata);   
  278.             }   
  279.        }   
  280.   }   
  281. }   
  282.    
  283. void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bitdata)   
  284. {                                                      //矩形   
  285.    linexy(x0,y0,x0,y1,bitdata);   
  286.    linexy(x0,y0,x1,y0,bitdata);   
  287.    linexy(x0,y1,x1,y1,bitdata);   
  288.    linexy(x1,y0,x1,y1,bitdata);   
  289. }   
  290.    
  291. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)   
  292. {  unsigned char k,lx,ly,a1,a2,x;   
  293.    Lcddelay(1000);   
  294.    k=Lcd_CurrentX&0X7;   
  295.    XSIZE+=k;   
  296.    x=Lcd_CurrentX;   
  297.    for(ly=0;ly<YSIZE;ly++,Lcd_CurrentY++)   
  298.       for(Lcd_CurrentX=x,lx=k,a1=0;lx<XSIZE;s++)   
  299.       {  unsigned char p;   
  300.          a2=*s;   
  301.          for(p=0;p<k;p++)   
  302.          {  a2>>=1;   
  303.             if((a1&0x1)==1) a2+=0x80;   
  304.             a1>>=1;   
  305.          }   
  306.          lcdpos();   
  307.          p=XSIZE&0X7;   
  308.          if(lx<8)   
  309.          {  if(XSIZE<8)   
  310.             {  Lcd_Mask=LeftMask[k] & RightMask[p];   
  311.                a1=lcdrd();   
  312.                a1&=(~Lcd_Mask);   
  313.                a1|=(a2 & Lcd_Mask);   
  314.                lcdwd(a1);   
  315.                lx=XSIZE;   
  316.                 Lcd_CurrentX+=XSIZE-k;   
  317.             }   
  318.             else   //XSIZE>=8   
  319.             {  Lcd_Mask=LeftMask[k];   
  320.                a1=lcdrd();   
  321.                a1&=(~Lcd_Mask);   
  322.                a1|=(a2 & Lcd_Mask);   
  323.                lcdwd(a1);   
  324.                lx+=8-k;   
  325.                Lcd_CurrentX+=8-k;   
  326.             }   
  327.          }   
  328.          else if(lx>=XSIZE-p)  //lx>=8   
  329.          {  if(k>=p)   
  330.             {  s--;   
  331.                a1=*s;   
  332.                a2=0;   
  333.                for(p=0;p<k;p++)   
  334.                {  a2>>=1;   
  335.                   if((a1&0x1)==1) a2+=0x80;   
  336.                      a1>>=1;   
  337.                }   
  338.                p=XSIZE&0X7;   
  339.             }   
  340.             Lcd_Mask=RightMask[p];   
  341.             a1=lcdrd();   
  342.             a1&=(~Lcd_Mask);   
  343.             a1|=(a2 & Lcd_Mask);   
  344.             lcdwd(a1);   
  345.             lx+=p;   
  346.             Lcd_CurrentX+=p;   
  347.          }   
  348.          else    //lx>=8 and lx<XSIZE-p   
  349.          {  lcdwd(a2);   
  350.             lx+=8;   
  351.             Lcd_CurrentX+=8;   
  352.          }   
  353.          a1=*s;   
  354.       }   
  355.   Lcd_CurrentY-=YSIZE;   
  356. }   
  357.    
  358. void main()   
  359. {   
  360.    lcdreset();   
  361.    Fill_Scr(0x55);            //顯示豎條   
  362.    Lcddelay(6000);            //系統延時   
  363.    Fill_Scr(0xff);            //顯示黑屏   
  364.    Lcddelay(6000);   
  365. //   put_str_xy(0,0,"創新科技檢測技術有限公司,聯系電話0512-86163888");//顯示漢字   
  366.    put_str("創新科技檢測技術有限公司,聯系電話0512-86163888");   
  367.    Fill_Scr(0x00);   
  368. //        
  369.    rect(12,12,88,88,6);   
  370.    Lcddelay(5000);   
  371.    //Fill_Scr(0xff);   
  372.    //rect(12,12,88,120,0);   
  373.    lcdreset();   
  374. }   
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:16255 發表于 2018-5-28 22:03 來自觸屏版 | 只看該作者
24小時必答嗎?已經24小時了嗎?已經快24小時了。
回復

使用道具 舉報

板凳
ID:16255 發表于 2018-6-2 09:45 | 只看該作者
24小時必答嗎?已經24小時了嗎?已經100小時了。
回復

使用道具 舉報

地板
ID:16255 發表于 2018-6-7 13:28 | 只看該作者
24小時必答嗎?已經24小時了嗎?已經240小時了。
回復

使用道具 舉報

5#
ID:16255 發表于 2018-9-7 10:24 | 只看該作者
24小時必答嗎?已經24小時了嗎?已經2400+小時了。
回復

使用道具 舉報

6#
ID:387733 發表于 2018-9-18 19:49 | 只看該作者
早先的51單片機內部沒有XRAM,而且都是使用總線結構,P0是數據8位數據總線,與低8位地址總線,P2是高8位地址總線。而外部設備的尋址也是通過映射到XRAM段,操作外設與XRAM讀取類似。12、13行定義的應該是液晶屏的命令和數據的選通信號。

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:155507 發表于 2018-9-18 21:31 | 只看該作者
題主你好,你這樣的提問。我估計沒幾個人會回答你的。

其實就一條解決方案:研讀T6963C手冊!!!

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:387733 發表于 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,完成對液晶屏數據寄存器的讀寫。

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线播放中文字幕 | 久久一级| 狠狠伊人| 中文在线a在线 | 国产成人免费视频 | 午夜爽爽爽男女免费观看 | 国产精品夜夜夜一区二区三区尤 | 三级在线免费 | 91中文字幕在线 | 久久机热 | 久久久.com | 日韩欧美一区二区在线播放 | 欧美精品一区二区三区在线 | 精品国产一区二区三区免费 | 国产一区影院 | 国产精品自拍av | 国产人久久人人人人爽 | 色小姐综合网 | 日本三级网址 | 欧美日韩国产中文 | 欧美精品一二区 | 亚洲国产成人精品女人 | 国产精品久久久久久久久久久久久 | 伊人精品国产 | 伊人网伊人 | 日韩精品一区二区三区中文字幕 | 精品国产一区二区三区观看不卡 | 91动漫在线观看 | 久久在线 | 日韩免费在线观看视频 | 国产精品久久欧美久久一区 | 黄色大片免费观看 | 啪啪免费网站 | 欧洲视频一区二区 | 久久成人免费 | 精品毛片视频 | 亚洲欧美精品国产一级在线 | 色偷偷人人澡人人爽人人模 | 色综合久久天天综合网 | 免费久久99精品国产婷婷六月 | 亚洲精品乱码久久久久久按摩观 |