找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2253|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)學(xué)習(xí),操作1602液晶

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:161768 發(fā)表于 2017-2-9 22:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
TX-1C板

操作并行模式的1602液晶
液晶第1,2腳是gnd和vcc
第3腳是對(duì)比度調(diào)節(jié)
第4腳是數(shù)據(jù)/指令選擇端RS
第5腳是讀寫(xiě)選擇端R/W,我們這次只寫(xiě)不讀,故直接接地
第6腳是讀寫(xiě)使能EN
第7到14腳是數(shù)據(jù)口,我們接STC89C52RC的P0口
第15,16腳是背光源


最終液晶顯示
Tom is playing  the TNT game!
  1.     #include <reg52.h>  
  2.     #include "MY51.H"  
  3.       
  4.     void write_data(uchar dataValue); //寫(xiě)數(shù)據(jù)  
  5.     void write_cmd(uchar cmdValue);  //寫(xiě)指令  
  6.       
  7.     uchar code tableLCD1[]  ={"Tom is playing"};  
  8.     uchar code tableLCD2[]  ={"  the TNT game!"};  
  9.       
  10.     void lcdInit()      //初始化函數(shù)  
  11.     {  
  12.         dula=0;          //  
  13.         wela=0;          //防止數(shù)碼管誤顯,浪費(fèi)電流  
  14.         lcdEN=low;       //給高脈沖之前的狀態(tài)  
  15.         lcdRS=high;      //初始給高電平,其實(shí)上電默認(rèn)也是高電平  
  16.         write_cmd(0x38); //液晶顯示模式初始化  
  17.         write_cmd(0x0c); //打開(kāi)液晶,不顯示光標(biāo),光標(biāo)不閃爍  
  18.         write_cmd(0x06); //地址指針加加,且光標(biāo)加加   
  19.         write_cmd(0x01); //液晶數(shù)據(jù)指針和顯示清零  
  20.     }  
  21.       
  22.     void write_cmd(uchar cmdValue) //寫(xiě)入指令  
  23.     {  
  24.         lcdRS=low;      //剛上電時(shí)是高電平,低電平時(shí)是指令模式  
  25.         P0=cmdValue;  
  26.         delayms(1);  
  27.         lcdEN=high;    //一個(gè)高脈沖把數(shù)據(jù)讀走  
  28.         delayms(1);  
  29.         lcdEN=low;  
  30.     }  
  31.       
  32.     void write_data(uchar dataValue) //寫(xiě)入數(shù)據(jù)  
  33.     {  
  34.         lcdRS=high;     //高電平是數(shù)據(jù)模式  
  35.         P0=dataValue;  
  36.         delayms(1);  
  37.         lcdEN=high;      //給一個(gè)高脈沖  
  38.         delayms(1);  
  39.         lcdEN=low;  
  40.     }  
  41.       
  42.     void lcdShow(uchar* pValue) //液晶顯示函數(shù)  
  43.     {  
  44.         while(*pValue!='\0')  
  45.         {  
  46.             write_data(*pValue);  
  47.             pValue++;  
  48.         }  
  49.     }  
  50.       
  51.     void main()  
  52.     {  
  53.         lcdInit();               //初始化  
  54.         lcdShow(tableLCD1);  //顯示第一行  
  55.         write_cmd(0x80+0x40); //重新設(shè)置數(shù)據(jù)顯示指針  
  56.         lcdShow(tableLCD2);  //顯示第二行  
  57.         while(1);  
  58.     }  
復(fù)制代碼


  1.     #ifndef _MY51_H_  
  2.     #define _MY51_H_  
  3.     #include <math.h>  
  4.     #include <intrins.h>  
  5.       
  6.     typedef int                 int16  ;  
  7.     typedef int                 INT16  ;  
  8.     typedef unsigned int    uint16 ;  
  9.     typedef unsigned int    UINT16 ;  
  10.     typedef unsigned short  uint ;  
  11.     typedef unsigned short  UINT ;  
  12.     typedef unsigned short  word ;  
  13.     typedef unsigned short  WORD ;  
  14.     typedef unsigned long   uint32 ;  
  15.     typedef unsigned long   UINT32 ;  
  16.     typedef unsigned long   DWORD ;  
  17.     typedef unsigned long   dword ;  
  18.     typedef signed long    int32     ;  
  19.     typedef signed long    INT32  ;  
  20.     typedef float                   float32  ;  
  21.     typedef double              double64  ;  
  22.     typedef signed char     int8 ;  
  23.     typedef signed char         INT8 ;  
  24.     typedef unsigned char   byte ;  
  25.     typedef unsigned char    BYTE    ;      //WINDOWS的windef.h里面是這么定義的  
  26.     typedef unsigned char   uchar ;  
  27.     typedef unsigned char   UCHAR ;  
  28.     typedef unsigned char   UINT8 ;  
  29.     typedef unsigned char   uint8 ;  
  30.     typedef unsigned char   BOOL     ;      //windows中定義BOOL為int  
  31.     typedef unsigned char   bool     ;          //bool是c++的內(nèi)置類(lèi)型  
  32.       
  33.     #define TRUE     1  
  34.     #define true     1  
  35.     #define FALSE    0  
  36.     #define false    0  
  37.       
  38.     #define open     1    //open和close用于 標(biāo)志打開(kāi)和關(guān)閉狀態(tài)  
  39.     #define OPEN     1  
  40.     #define close    0  
  41.     #define CLOSE    0  
  42.     #define lock     0  
  43.     #define start    1  
  44.     #define START    1  
  45.     #define stop     0  
  46.     #define STOP     0  
  47.     #define keyDown  0  
  48.     #define keyUp    1  
  49.     #define gnd       0  //接地  
  50.     #define GND       0  //接地  
  51.     #define high    1  //高電平  
  52.     #define low     0   //低電平  
  53.     #define yes     1  
  54.     #define YES     1  
  55.     #define no      0  
  56.     #define NO      0  
  57.       
  58.     sbit dula =P2^6;  //段選鎖存器控制  控制筆段  
  59.     sbit wela =P2^7;  //位選鎖存器控制  控制位置  
  60.       
  61.     #define led P1    //燈總線控制  
  62.     sbit led0=P1^0;   //8個(gè)led燈,陰極送低電平點(diǎn)亮  
  63.     sbit led1=P1^1;  
  64.     sbit led2=P1^2;  
  65.     sbit led3=P1^3;  
  66.     sbit led4=P1^4;  
  67.     sbit led5=P1^5;  
  68.     sbit led6=P1^6;  
  69.     sbit led7=P1^7;  
  70.       
  71.     sbit keyS2=P3^4;    //4個(gè)獨(dú)立按鍵  
  72.     sbit keyS3=P3^5;  
  73.     sbit keyS4=P3^6;  
  74.     sbit keyS5=P3^7;  
  75.     sbit lcdEN=P3^4; //液晶通訊使能端en,高脈沖有效  
  76.     sbit lcdRS=P3^5; //液晶第4腳,RS,低電平是指令模式,高電平是數(shù)據(jù)模式  
  77.     //sbit lcdR/W    //液晶第5腳,低電平是寫(xiě)入模式,因?yàn)槲覀冎粚?xiě)不讀,所以接地  
  78.       
  79.     sbit csda=P3^2;  //DAC0832模數(shù)轉(zhuǎn)換cs口  
  80.     sbit adwr=P3^6; //ADC0804這個(gè)同DAC0832  
  81.     sbit dawr=P3^6;  
  82.     sbit adrd=P3^7;  //ADC0804  
  83.     sbit beep=P2^3;  //蜂鳴器  
  84.     void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);   
  85.     void delayms(uint16 ms);  
  86.     void T0_Work();  
  87.       
  88.     void delayms(uint16 ms)  //軟延時(shí)函數(shù)  
  89.     {  
  90.         uint16 i,j;  
  91.         for(i=ms;i>0;i--)  
  92.         {  
  93.             for(j=113;j>0;j--)  
  94.             {}  
  95.         }  
  96.     }  
  97.     ///////////////////////////////////////////////////////////////////////////  
  98.     #define dark    0x11  //在段中,0x11是第17號(hào)元素,為0是低電平,數(shù)碼管不亮  
  99.     #define dotDark 0xff //小數(shù)點(diǎn)全暗時(shí)  
  100.     uint8 code table[]= {           //0~F外加小數(shù)點(diǎn)和空輸出的數(shù)碼管編碼  
  101.         0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3  
  102.         0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7  
  103.         0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B  
  104.         0x39 , 0x5e , 0x79 , 0x71 , // C D E F  
  105.         0x80 , 0x00 ,0x40           // . 空  負(fù)號(hào)    空時(shí)是第0x11號(hào)也就是第17號(hào)元素  
  106.      };  
  107.       
  108.     uint8 dotTable[]={         //小數(shù)點(diǎn)位置  
  109.         0xff ,                 //全暗  
  110.         0xfe , 0xfd , 0xfb ,   //1 2 3  
  111.         0xf7 , 0xef , 0xdf     //4 5 6                     
  112.     };  
  113.     /////////////////////////////////////////////////////////////////////////////  
  114.     uint8   TH0Cout=0 ;     //初值      
  115.     uint8   TL0Cout=0 ;      
  116.     uint16  T0IntCout=0;     //中斷計(jì)數(shù)  
  117.     uint16  T0IntCountAll=0; //(N-1)/65536+1;  //總中斷次數(shù)  
  118.     bool    bT0Delay=false;  //使用延時(shí)函數(shù)標(biāo)志,初始未用  
  119.     bool    bT0Over=false;   //中斷處理函數(shù)執(zhí)行結(jié)果之一  
  120.       
  121.     void startT0(uint32 ms)  //開(kāi)啟定時(shí)器  
  122.     {     
  123.         float32     t=ms/1000.0;                 //定時(shí)時(shí)間  
  124.         double64    fox =11.0592*(pow(10,6));   //晶振頻率  
  125.         uint32      N=(t*fox)/12 ;               //定時(shí)器總計(jì)數(shù)值  
  126.       
  127.         TH0Cout =(65536-N%65536)/256;        //裝入計(jì)時(shí)值零頭計(jì)數(shù)初值  
  128.         TL0Cout =(65536-N%65536)%256;  
  129.         T0IntCountAll=(N-1)/65536+1;             //總中斷次數(shù)  
  130.         TMOD=TMOD | 0x01;                        //設(shè)置定時(shí)器0的工作方式為1  
  131.          
  132.         EA =open;   //打開(kāi)總中斷  
  133.         ET0=open;   //打開(kāi)定時(shí)器中斷  
  134.       
  135.         TH0=TH0Cout;  //定時(shí)器裝入初值  
  136.         TL0=TL0Cout;  
  137.         TR0=start;   //啟動(dòng)定時(shí)器  
  138.     }  
  139.       
  140.     void delayT0(uint32 ms)     //硬延時(shí)函數(shù),自己亂寫(xiě)的不好用,求指點(diǎn)  
  141.     {  
  142.         startT0(ms);                //啟動(dòng)定時(shí)器  
  143.         bT0Delay=true;          //告訴T0定時(shí)器,起用延時(shí)模式  
  144.         while(bT0Over==false);  //時(shí)間沒(méi)到的話繼續(xù)檢測(cè)  
  145.         bT0Over=false;              //時(shí)間到了,讓標(biāo)志復(fù)位  
  146.     }  
  147.       
  148.     void T0_times() interrupt 1 //T0定時(shí)器中斷函數(shù)  
  149.     {  
  150.         T0IntCout++;  
  151.         if(T0IntCout==T0IntCountAll)  //達(dá)到總中斷次數(shù)值  
  152.         {     
  153.             T0IntCout=0;         //中斷次數(shù)清零,重新計(jì)時(shí)  
  154.             bT0Over=true;     //時(shí)間真的到了  
  155.             if(bT0Delay)        //本次中斷是用來(lái)延時(shí)的嗎  
  156.             {  
  157.                 TR0=stop;        //如果是由延時(shí)函數(shù)開(kāi)啟T0的話,關(guān)閉T0  
  158.                 return;  
  159.             }  
  160.       
  161.             TH0=TH0Cout;        //循環(huán)定時(shí)的話要重裝初值,每次定時(shí)1秒,重裝一次  
  162.             TL0=TL0Cout;  
  163.             T0_Work();          //工作函數(shù)  
  164.         }  
  165.     }  
  166.       
  167.     ////////////////////////////////////////////////////////////////////////////////  
  168.     void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  169.     {     
  170.         //控制6位數(shù)碼管顯示函數(shù),不顯示的位用參數(shù)dark,保留ADC0804的片選信號(hào)  
  171.         uint8 csadState=0x80&P0;                //提取最高位,即ADC0804的片選信號(hào)  
  172.         uint8 tempP0=((csadState==0)?0x7f:0xff); //數(shù)碼管位選初始信號(hào),陰極全置高電平  
  173.         P0=tempP0;      //0x7f表示數(shù)碼管不亮,同時(shí)ADC0804片選有效  
  174.         wela=1;         //注:wela和dula上電默認(rèn)為1  
  175.         P0=tempP0;  
  176.         wela=0;  
  177.       
  178.         P0=0;               //由于數(shù)碼管是共陰極的,陽(yáng)極送低電平,燈不亮,防止燈誤亮  
  179.         dula=1;  
  180.         P0=0;  
  181.         dula=0;             //段選數(shù)據(jù)清空并鎖定  
  182.     //////////////////////////oneWela  
  183.         {  //消除疊影,數(shù)碼管陰極置高電平,并鎖存  
  184.             P0=tempP0;  
  185.             wela=1;           
  186.             P0=tempP0;  
  187.             wela=0;  
  188.         }  
  189.         P0=0;           //低電平送到數(shù)碼管陽(yáng)極,避免數(shù)碼管誤亮  
  190.         dula=1;  
  191.         P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段數(shù)據(jù),疊加小數(shù)點(diǎn)的顯示  
  192.         dula=0;  
  193.          
  194.       
  195.         P0=tempP0;          //送位數(shù)據(jù)前關(guān)閉所有顯示,并保持csad信號(hào)  
  196.         wela=1;  
  197.         P0=tempP0 & 0xfe;   //0111 1110最高位是AD片選,低6位是數(shù)碼管位選,低電平有效  
  198.         wela=0;  
  199.         delayms(2);  
  200.       
  201.     /////////////////////////twoWela  
  202.         {  //消除疊影  
  203.             P0=tempP0;  
  204.             wela=1;           
  205.             P0=tempP0;  
  206.             wela=0;  
  207.         }  
  208.         P0=0;  
  209.         dula=1;  
  210.         P0=table[twoWela]|((0x02&dot)?0x00:0x80);  
  211.         dula=0;  
  212.          
  213.         P0=tempP0;  
  214.         wela=1;  
  215.         P0=tempP0 & 0xfd;    //0111 1101  
  216.         wela=0;  
  217.         delayms(2);  
  218.       
  219.     /////////////////////////threeWela  
  220.         {  //消除疊影  
  221.             P0=tempP0;  
  222.             wela=1;           
  223.             P0=tempP0;  
  224.             wela=0;  
  225.         }  
  226.         P0=0;  
  227.         dula=1;  
  228.         P0=table[threeWela]|((0x04&dot)?0x00:0x80);  
  229.         dula=0;  
  230.       
  231.         P0=tempP0;  
  232.         wela=1;  
  233.         P0=tempP0 & 0xfb;    //0111 1011  
  234.         wela=0;  
  235.         delayms(2);  
  236.       
  237.     /////////////////////////fourWela  
  238.         {  //消除疊影  
  239.             P0=tempP0;  
  240.             wela=1;           
  241.             P0=tempP0;  
  242.             wela=0;  
  243.         }  
  244.         P0=0;  
  245.         dula=1;  
  246.         P0=table[fourWela]|((0x08&dot)?0x00:0x80);  
  247.         dula=0;  
  248.       
  249.         P0=tempP0;  
  250.         wela=1;  
  251.         P0=tempP0 & 0xf7;   //0111 0111  
  252.         wela=0;  
  253.         delayms(2);  
  254.       
  255.     /////////////////////////fiveWela  
  256.         {  //消除疊影  
  257.             P0=tempP0;  
  258.             wela=1;           
  259.             P0=tempP0;  
  260.             wela=0;  
  261.         }  
  262.         P0=0;  
  263.         dula=1;  
  264.         P0=table[fiveWela]|((0x10&dot)?0x00:0x80);  
  265.         dula=0;  
  266.       
  267.         P0=tempP0;  
  268.         wela=1;  
  269.         P0=tempP0 & 0xef;       //0110 1111  
  270.         wela=0;  
  271.         delayms(2);  
  272.       
  273.     /////////////////////////sixWela  
  274.         {  //消除疊影  
  275.             P0=tempP0;  
  276.             wela=1;           
  277.             P0=tempP0;  
  278.             wela=0;  
  279.         }  
  280.         P0=0;  
  281.         dula=1;  
  282.         P0=table[sixWela]|((0x20&dot)?0x00:0x80);  
  283.         dula=0;  
  284.       
  285.         P0=tempP0;  
  286.         wela=1;  
  287.         P0=tempP0 & 0xdf;   //0101 1111  
  288.         wela=0;  
  289.         delayms(2);  
  290.     }  
  291.       
  292.     #endif  
復(fù)制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:164045 發(fā)表于 2017-2-10 12:23 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表