蜜臀av一区二区三区人妻在线_国产91精品拍在线观看_日韩亚洲欧美精品综合_国产三区在线成人av_亚洲成色在线冲田杏梨_91麻豆视频国产_国产精品一区二区无码免费看片_古代级毛片免费观看_亚洲精品色在线网站_99久久精品免费看一

/ EN
13922884048

資訊中心

information centre
/
/

MCU最強科普總結【建議收藏】(三)

發布時間:2022-03-17作者來源:薩科微瀏覽:1450

12、漢字概覽:  
為了將漢字在顯示器或打印機上輸出,把漢字按圖形符號設計成點陣圖,就得到了相應的點陣代碼(字形碼)。  
  為在計算機內表示漢字而統一的編碼方式形成漢字編碼叫內碼(如國標碼),內碼是惟一的(相當于該字的身份證號)。為方便漢字輸入而形成的漢字編碼為輸入碼,屬于漢字的外碼,輸入碼因編碼方式不同而不同,是多種多樣的。為顯示和打印輸出漢字而形成的漢字編碼為字形碼,計算機通過漢字內碼在字模庫中找出漢字的字形碼,實現其轉換。  
  機內碼  
  根據國標碼的規定,每一個漢字都有了確定的二進制代碼,但是這個代碼在計算機內部處理時會與ASCII碼發生沖突,為解決這個問題,把國標碼的每一個字節的首位上加1。由于ASCII碼只用7位,所以,這個首位上的“1”就可以作為識別漢字代碼的標志,計算機在處理到首位是“1”的代碼時把它理解為是漢字的信息,在處理到首位是“0”的代碼時把它理解為是ASCII碼。經過這樣處理后的國標碼(內碼)就是機內碼。  
  如果我們把這個“口”字圖形的“.”處用“0”代替,就可以很形象地得到“口”的字形碼:0000H 0004H 3FFAH 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H2004H 3FFAH 2004H 0000H 0000H。計算機要輸出“口”時,先找到顯示字庫的首址,根據“口”的機內碼經過計算,再去找到“口”的字形碼,然后根據字形碼(要用二進制)通過字符發生器的控制在屏幕上進行依次掃描,其中二進制代碼中是“0”的地方空掃,是“1”的地方掃出亮點,于是就可以得到“口”的字符圖形。  
  漢字字模按國標碼的順序排列,以二進制文件形式存放在存儲器中,構成漢字字模字庫,亦稱為漢字字形庫,稱漢字庫  
  兩種編碼方法,見頭文件
    GB1616.h//------------------ 漢字字模的數據結構定義 ------------------------//struct typFNT_GB16 //漢字字模數據結構{ unsignedchar  Index[3]; //漢字內碼索引  unsignedchar   Msk[32]; //點陣碼數據 }; /////////////////////////////////////////////////////////////////////////// 漢字字模表                                                        //// 漢字庫: 宋體16.dot,橫向取模左高位,數據排列:從左到右從上到下        ///////////////////////////////////////////////////////////////////////////conststruct  typFNT_GB16 codeGB_16[]= //數據表{/*------------------------------------------------------------------------------;  源文件 /文字 :徐;  寬×高(像素):16×16------------------------------------------------------------------------------*/ "徐",0x10,0x80,0x10,0x80,0x21,0x40,0x42,0x20,0x94,0x10,0x1B,0xEC,0x20,0x80,0x60,0x80,0xAF,0xF8,0x20,0x80,0x22,0xA0,0x24,0x90,0x2A,0x88,0x21,0x00,0x00,0x00,0x00,0x00,
     

    這個結構,很簡單的:一個是內碼,一個點陣序列,以前的點陣庫是按內碼順序放的,不需要內碼索引的,如果只放部分漢字,就需要內碼索引了。(前面的漢字“徐”是為了要輸出“徐”的時候找到該字的點陣序列,這個點陣序列是自己寫的,當用1602顯示時,因為該芯片內存在英文的點陣序列,所以就不用寫了)一般內碼兩個字節就行了,多用1個字節是加了個尾0而已,這樣,漢字內碼處直接放漢字字符串就可;


    codeGB_16[k].Index[0]   codeGB_16[k]說明有一個結構體typFNT_GB16的數組叫做codeGB_16   codeGB_16[k]是數組中第k+1個成員   index是結構體typFNT_GB16的成員,所以可以用codeGB_16[k].Index來進行引用   同時index又是個數組,所以可以index[0]       if((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1]))   &&是 邏輯與運算符   意思是 &&符號的兩邊的值都為真 &&的值才為真,也就是 true && true =true   這句的意思是   codeGB_16[k].Index[0]==c[0]  和 codeGB_16[k].Index[1]==c[1] 同時成立   if下面的語句才執行   codeGB_16[]是個結構體數組,codeGB_16[k].Index[0]是說結構體數組的第K個結構體的index成員的第0個元素值。    

    13、12864液晶:

    每個顯示點對應一位二進制數,1 表示亮,0 表示滅。存儲這些點陣信息的RAM稱為顯示數據存儲器。要顯示某個圖形或漢字就是將相應的點陣信息寫入到相應的存儲單元中。


    繪圖RAM的地址計數器(AC)只會對水平地址(X  軸)自動加一, 當水平地址=0FH  時會重新設為00H  但并不會對垂直地址做進位自動加一,故當連續寫入多筆資料時,程序需自行判斷垂直地址是否需重新設定


      14、繪圖RAM(GDRAM)

      繪圖顯示RAM提供128×8 個字節的記憶空間,在更改繪圖RAM時,先連續寫入水平與垂直的坐標值,再寫入兩個字節的數據到繪圖RAM,而地址計數器(AC)會對水平地址(X 地址)自動加一,當水平地址為0XFH 時會重新設為00H ;不會對垂直地址做進位自動加 1. 。在寫入繪圖 RAM的期間,繪圖顯示必須關閉。

     
      [cpp] view plain copy// 顯示漢字 voiddispString (uchar X, Y,uchar *msg) //X為哪一行,Y 為哪一列。msg 為漢字 {  if(X==0)       X = 0x80; // [敏感詞]行,漢字顯示坐標  else if(X==1) X = 0x90; // 第二行  else if(X==2) X = 0x88; // 第三行  else X = 0x98; //第四行  Y = X + Y; //Y 為1 往右移一位  write_com(Y); // 寫入坐標  while (*msg)  {  write_data(*msg++); //顯示漢字 } } //////////////////////////////// //////////////// /////////////// // 顯示圖象 voiddisppicture(uchar code *adder) {  uint i,j; //*******顯示上半屏內容設置  for(i=0;i<32;i++) // 上半屏32個列地址  {  write_com(0x80 + i); //SET  垂直地址 VERTICALADD  write_com(0x80); //SET   水平地址 HORIZONTAL ADD  for(j=0;j<16;j++)  {  write_data(*adder);  adder++;  }  } //*******顯示下半屏內容設置  for(i=0;i<32;i++) //  {  write_com(0x80 + i); //SET 垂直地址 VERTICALADD  write_com(0x88); //SET  水平地址 HORIZONTAL ADD  for(j=0;j<16;j++)  {  write_data(*adder);  adder++;  }  } }
       
         

      對于C語言,定義的變量,自動為其分配空間,其地址為該變量的名稱。通過該名稱,可以在內存中招到該數據,經過運算得到新數據,而匯編中需要編程者自己定義存儲空間及把數據送到累加器等進行運算,每一步都需要編程者操作。而C語言這些過程由編譯器去完成。


        15、一些有用的答疑解惑

        ①、單片機C語言,其變量的內存開辟是如何進行的?難道是編譯器,在編譯過程中智能地加入分配與回收的代碼?關鍵之處在于我所做的程序,如何保證其沒有內存溢出錯誤?如果我進行的是遞歸運算,這樣的話,內存需求是很難自己計算的。  
        ②、單片機C語言在變量定義上是否會受到約束?比如浮點型數據的乘除運算,通過匯編還寫,代碼相當復雜,如果直接C語言來寫,豈不過份簡單?  
        ③、單片機C語言生成的hex文件中,指令及數據的ROM的地址分布是否編譯器自動分配?可否用戶進行分配?  
        回答1:c語言寫的單片機程序,先由1個程序(好像是c51.exe)編譯,編譯完成后,變量的存儲空間大小已經安排好,只是還沒分配具體地址(地址浮動),接下來有另一個程序(好像是a51.exe)進行連接,連接以后,具體地址確定。  
        如果變量過多,編譯會提示數據段too large,要保證其沒有內存溢出錯誤,主要考慮堆棧是否溢出,要靠經驗  
        單片機c語言一般禁止遞歸,一般都避免用遞歸運算,單片機畢竟不是PC,會影響速度的,要遞歸的話,用DSP芯片更合適,總之,要會挑合適的芯片  
        回答2:變量的大?。ㄎ粩担┮话愫托酒奂悠鞯奈粩狄粯樱热?1常用8位的,因為它是8位單片機

      單片機可以定義位變量,但是不可以定義位數組。用c語言寫只是看著簡單,實際生成的代碼量是最多的,用于控制的單片機幾乎不用浮點數運算,不僅慢還麻煩還占地方,如果是DSP芯片,本身有適合的硬件結構,會好很多。  
       

      回答3:一般是自動分配的,可以c語言和匯編語言混合編程,也可以用Keil C在線匯編,芯片與外部的數據交換都是通過端口進行的。


      免責聲明:本文轉載自“國際電子商情”,本文僅代表作者個人觀點,不代表薩科微及行業觀點,只為轉載與分享,支持保護知識產權,轉載請注明原出處及作者,如有侵權請聯系我們刪除。

      公司電話:+86-0755-83044319
      傳真/FAX:+86-0755-83975897
      郵箱:1615456225@qq.com
      QQ:3518641314 李經理  

      QQ:332496225   丘經理

      地址:深圳市龍華新區民治大道1079號展滔科技大廈C座809室

      服務熱線

      0755-83044319

      霍爾元件咨詢

      肖特基二極管咨詢

      TVS/ESD咨詢

      獲取產品資料

      客服微信

      微信服務號