zoukankan      html  css  js  c++  java
  • LCD1602小程序

    仿真如图所示:

    本程序包含三个文件:LCD.c   PORT.h    lcd1602.h

    LCD.c文件的代码如下:

     1 #include <reg51.h>
     2 #include<intrins.h>
     3 #include<PORT.h>
     4 #include "lcd1602.h"
     5 
     6 //初始化LCD1602
     7 void init()
     8 {
     9     setFunc(1,1,0);//总线8,双行显示,显示5X7的点阵字符
    10     delayMS(2);//延时2毫秒
    11     
    12     clearScreen();//清屏
    13     delayMS(2);//延时2毫秒
    14 
    15     setInputMode(1,0);//光标右移,字符不动           06
    16     delayMS(2);//延时2毫秒
    17 
    18     setKaiGuan(1,0,0);//打开显屏,没有光标,不闪烁  0c
    19     delayMS(2);//延时2毫秒
    20 }
    21 
    22 //第y+1行x+1列显示数据str
    23 void disp(uchar x,uchar y,uchar *str)
    24 {
    25     setDataRegAddr(y*0x40|x);
    26     while(*str)
    27         write(DATA,*str++);        
    28 }
    29 
    30 //光标左移
    31 void curLeftMove()
    32 {
    33     setDataRegAddr(readCurAddr()-1);
    34 }
    35 
    36 //光标右移
    37 void curRightMove()
    38 {
    39     setDataRegAddr(readCurAddr()+1);
    40 }
    41 
    42 //扫描按键
    43 uchar scanKey()
    44 {
    45     uchar key = P3;//扫描P3口
    46     if(key!=0xff)//表示有按键按下
    47     {
    48         delayMS(10);//去抖动
    49         key=P3;//在扫描一次P3
    50         while(P3!=0xff);//表示确实是有按键按下,防止连续按下产生的事件    
    51     }
    52     return key;
    53 }
    54 //主方法
    55 void main()
    56 {
    57     uchar i=0;
    58     uchar key;
    59     init();
    60     disp(3,0,"hello,world");//在LCD1602上显示hello,world
    61     setKaiGuan(1,1,0);
    62         
    63     //write(DATA,readCurAddr());
    64     while(1)
    65     {
    66         key=scanKey();
    67         switch(key)
    68         {
    69         case 0xfe:
    70             curRightMove();
    71             break;//右移
    72 
    73         case 0xfd:
    74             curLeftMove();
    75             break;//左移
    76         }
    77         delayMS(10);
    78     }
    79 }

    PORT.h的内容如下:

    1 //定义端口,lcd1602的D0~D7连接P0口
    2 #define LCD_DATA P0
    3 sbit RS=P2^0 ; 
    4 sbit RW=P2^1 ; 
    5 sbit EN=P2^2 ;

    lcd1602.h文件的内容如下:

      1 #define uchar unsigned char
      2 #define uint unsigned int
      3 #define CMD 0
      4 #define DATA 1
      5 
      6 //延时毫秒
      7 void delayMS(uint z) 
      8 {  
      9     uint  i;
     10     uchar j;  
     11     for(i=0;i<z;i++) 
     12            for(j=0;j<142;j++); 
     13 }
     14 
     15 //读取忙标志
     16 uchar readBF()
     17 {
     18     uchar bf=0;
     19     EN=1;
     20     LCD_DATA=0xff;
     21     RS=0;//指令
     22     RW=1;//
     23     bf=LCD_DATA;//读取LCD_DATA口数据
     24     EN=0;
     25     return bf; 
     26 }
     27 
     28 //等待忙
     29 void waitBusy()
     30 {
     31     while(readBF()&0x80);
     32 }
     33 
     34 //写数据/指令
     35 void write(bit type,uchar di)
     36 {
     37     waitBusy();    
     38     RS=type;//0表示指令,1表示数据
     39     RW=0;//
     40     _nop_();
     41     LCD_DATA=di;
     42     EN=1;
     43     _nop_();
     44     EN=0;
     45 }
     46 
     47 //读取数据
     48 uchar read_data()
     49 {
     50     uchar _data=0;
     51     //waitBusy();
     52     EN=1;
     53     RS=1;//表示数据
     54     RW=1;//
     55     _data=LCD_DATA;
     56     EN=0;
     57     return _data;
     58 }
     59 //清屏
     60 void clearScreen()
     61 {
     62     write(CMD,0x01);
     63 }
     64 
     65 //光标复位
     66 void setCurFuwei()
     67 {
     68     write(CMD,0x02);
     69 }
     70 
     71 //置输入模式:光标和显示位置设置
     72 //I/D:光标移动方向,高电平右移,低电平左移
     73 //S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效
     74 void setInputMode(bit ID,bit S)
     75 {
     76     write(CMD,0x04|ID*2|S);
     77 }
     78 
     79 //显示开/关控制
     80 //D:控制整体的显示开与关,高电平表示开显示,低电平表示关显示。
     81 //C:控制光标的开与关,高电平表示有光标,低电平表示无光标
     82 //B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
     83 void setKaiGuan(bit D,bit C,bit B)
     84 {
     85     write(CMD,0x08|(D*4)|(C*2)|B);
     86 }
     87 
     88 //光标或字符移位
     89 //SC:高电平时显示移动的文字,低电平时移动光标
     90 //RL:1表示右移,0表示左移
     91 void setCurOrCharMove(bit SC,bit RL)
     92 {
     93     write(CMD,0x10|SC*8|RL*4);
     94 }
     95 
     96 //功能设置
     97 //DL:高电平时为8位总线,低电平时为4位总线
     98 //N:低电平时为单行显示,高电平时为双行显示
     99 //F:低电平时显示5X7的点阵字符,高电平时显示5X10的显示字符。
    100 void setFunc(bit DL,bit N,bit F)
    101 {
    102     write(CMD,0x20|(DL*16)|(N*8)|(F*4));
    103 }
    104 
    105 //置字符发生存贮器地址
    106 //addr:字符发生存贮器地址
    107 void setCharOcCurRegAddr(uchar addr)
    108 {
    109     write(CMD,0x40|addr);
    110 }
    111 
    112 //置显示数据存贮器地址
    113 void setDataRegAddr(uchar addr)
    114 {
    115     write(CMD,0x80|addr);
    116 }
    117 
    118 //读取光标地址
    119 uchar readCurAddr()
    120 {
    121     uchar curAddr;
    122     //LCD_DATA=0xff;
    123     EN=1;
    124     RS=0;//指令
    125     RW=1;//
    126     curAddr=LCD_DATA&0x7f;
    127     EN=0;
    128     return curAddr;
    129 }
  • 相关阅读:
    Lua 的元表怎么理解
    Lua中的元表与元方法
    Lua 的元表怎么理解
    VMware Workstation 系统备份-虚拟机克隆方法
    Lua中的元表与元方法
    bzoj2809
    bzoj2733
    bzoj1334
    bzoj1211
    bzoj3083 3306
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3180127.html
Copyright © 2011-2022 走看看