×
单片机 > 单片机程序设计 > 详情

51单片机学习笔记,操作1602液晶

发布时间:2020-06-05 发布时间:
|

TX-1C板

 

操作并行模式的1602液晶
液晶第1,2脚是gnd和vcc
第3脚是对比度调节
第4脚是数据/指令选择端RS
第5脚是读写选择端R/W,我们这次只写不读,故直接接地
第6脚是读写使能EN
第7到14脚是数据口,我们接STC89C52RC的P0口
第15,16脚是背光源

 

最终液晶显示

Tom is playing  the TNT game!

C代码  

  1. #include   

  2. #include "MY51.H"  

  3.   

  4. void write_data(uchar dataValue); //写数据  

  5. void write_cmd(uchar cmdValue);  //写指令  

  6.   

  7. uchar code tableLCD1[]  ={"Tom is playing"};  

  8. uchar code tableLCD2[]  ={"  the TNT game!"};  

  9.   

  10. void lcdInit()      //初始化函数  

  11. {  

  12.     dula=0;          //  

  13.     wela=0;          //防止数码管误显,浪费电流  

  14.     lcdEN=low;       //给高脉冲之前的状态  

  15.     lcdRS=high;      //初始给高电平,其实上电默认也是高电平  

  16.     write_cmd(0x38); //液晶显示模式初始化  

  17.     write_cmd(0x0c); //打开液晶,不显示光标,光标不闪烁  

  18.     write_cmd(0x06); //地址指针加加,且光标加加   

  19.     write_cmd(0x01); //液晶数据指针和显示清零  

  20. }  

  21.   

  22. void write_cmd(uchar cmdValue) //写入指令  

  23. {  

  24.     lcdRS=low;      //刚上电时是高电平,低电平时是指令模式  

  25.     P0=cmdValue;  

  26.     delayms(1);  

  27.     lcdEN=high;    //一个高脉冲把数据读走  

  28.     delayms(1);  

  29.     lcdEN=low;  

  30. }  

  31.   

  32. void write_data(uchar dataValue) //写入数据  

  33. {  

  34.     lcdRS=high;     //高电平是数据模式  

  35.     P0=dataValue;  

  36.     delayms(1);  

  37.     lcdEN=high;      //给一个高脉冲  

  38.     delayms(1);  

  39.     lcdEN=low;  

  40. }  

  41.   

  42. void lcdShow(uchar* pValue) //液晶显示函数  

  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); //重新设置数据显示指针  

  56.     lcdShow(tableLCD2);  //显示第二行  

  57.     while(1);  

  58. }  

 

C代码  

  1. #ifndef _MY51_H_  

  2. #define _MY51_H_  

  3. #include   

  4. #include   

  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++的内置类型  

  32.   

  33. #define TRUE     1  

  34. #define true     1  

  35. #define FALSE    0  

  36. #define false    0  

  37.   

  38. #define open     1    //open和close用于 标志打开和关闭状态  

  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个led灯,阴极送低电平点亮  

  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个独立按键  

  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,低电平是指令模式,高电平是数据模式  

  77. //sbit lcdR/W    //液晶第5脚,低电平是写入模式,因为我们只写不读,所以接地  

  78.   

  79. sbit csda=P3^2;  //DAC0832模数转换cs口  

  80. sbit adwr=P3^6; //ADC0804这个同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)  //软延时函数  

  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号元素,为0是低电平,数码管不亮  

  99. #define dotDark 0xff //小数点全暗时  

  100. uint8 code table[]= {           //0~F外加小数点和空输出的数码管编码  

  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           // . 空  负号    空时是第0x11号也就是第17号元素  

  106.  };  

  107.   

  108. uint8 dotTable[]={         //小数点位置  

  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;     //中断计数  

  117. uint16  T0IntCountAll=0; //(N-1)/65536+1;  //总中断次数  

  118. bool    bT0Delay=false;  //使用延时函数标志,初始未用  

  119. bool    bT0Over=false;   //中断处理函数执行结果之一  

  120.   

  121. void startT0(uint32 ms)  //开启定时器  

  122. {     

  123.     float32     t=ms/1000.0;                 //定时时间  

  124.     double64    fox =11.0592*(pow(10,6));   //晶振频率  

  125.     uint32      N=(t*fox)/12 ;               //定时器总计数值  

  126.   

  127.     TH0Cout =(65536-N%65536)/256;        //装入计时值零头计数初值  

  128.     TL0Cout =(65536-N%65536)%256;  

  129.     T0IntCountAll=(N-1)/65536+1;             //总中断次数  

  130.     TMOD=TMOD | 0x01;                        //设置定时器0的工作方式为1  

  131.       

  132.     EA =open;   //打开总中断  

  133.     ET0=open;   //打开定时器中断  

  134.   

  135.     TH0=TH0Cout;  //定时器装入初值  

  136.     TL0=TL0Cout;  

  137.     TR0=start;   //启动定时器  

  138. }  

  139.   

  140. void delayT0(uint32 ms)     //硬延时函数,自己乱写的不好用,求指点  

  141. {  

  142.     startT0(ms);                //启动定时器  

  143.     bT0Delay=true;          //告诉T0定时器,起用延时模式  

  144.     while(bT0Over==false);  //时间没到的话继续检测  

  145.     bT0Over=false;              //时间到了,让标志复位  

  146. }  

  147.   

  148. void T0_times() interrupt 1 //T0定时器中断函数  

  149. {  

  150.     T0IntCout++;  

  151.     if(T0IntCout==T0IntCountAll)  //达到总中断次数值  

  152.     {     

  153.         T0IntCout=0;         //中断次数清零,重新计时  

  154.         bT0Over=true;     //时间真的到了  

  155.         if(bT0Delay)        //本次中断是用来延时的吗  

  156.         {  

  157.             TR0=stop;        //如果是由延时函数开启T0的话,关闭T0  

  158.             return;  

  159.         }  

  160.   

  161.         TH0=TH0Cout;        //循环定时的话要重装初值,每次定时1秒,重装一次  

  162.         TL0=TL0Cout;  

  163.         T0_Work();          //工作函数  

  164.     }  

  165. }  

  166.   

  167. ////////////////////////////////////////////////////////////////////////////////  

  168. void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  

  169. {     

  170.     //控制6位数码管显示函数,不显示的位用参数dark,保留ADC0804的片选信号  

  171.     uint8 csadState=0x80&P0;                //提取最高位,即ADC0804的片选信号  

  172.     uint8 tempP0=((csadState==0)?0x7f:0xff); //数码管位选初始信号,阴极全置高电平  

  173.     P0=tempP0;      //0x7f表示数码管不亮,同时ADC0804片选有效  

  174.     wela=1;         //注:wela和dula上电默认为1  

  175.     P0=tempP0;  

  176.     wela=0;  

  177.   

  178.     P0=0;               //由于数码管是共阴极的,阳极送低电平,灯不亮,防止灯误亮  

  179.     dula=1;  

  180.     P0=0;  

  181.     dula=0;             //段选数据清空并锁定  

  182. //////////////////////////oneWela  

  183.     {  //消除叠影,数码管阴极置高电平,并锁存  

  184.         P0=tempP0;  

  185.         wela=1;           

  186.         P0=tempP0;  

  187.         wela=0;  

  188.     }  

  189.     P0=0;           //低电平送到数码管阳极,避免数码管误亮  

  190.     dula=1;  

  191.     P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段数据,叠加小数点的显示  

  192.     dula=0;  

  193.       

  194.   

  195.     P0=tempP0;          //送位数据前关闭所有显示,并保持csad信号  

  196.     wela=1;  

  197.     P0=tempP0 & 0xfe;   //0111 1110最高位是AD片选,低6位是数码管位选,低电平有效  

  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  

 





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
msp430的中断优先级和中断嵌套(及容易理解错误的说明)