这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » blueapple2的DIY进程贴-按键扫描显示实验(视频)

共21条 3/3 1 2 3 跳转至
助工
2011-12-25 10:41:44     打赏
21楼

LCD.h
/******************************************************
*MCU at89s52
*晶振 12MHz
*LCD1602 4位数据线程序
*   端口名称              端口符号     MCU端口    LCD引脚
*   RS数据/指令选择线        RS          P0^0       4    P2^4
*   R/W读写选择线            R/W         GND        5    P2^5
*   EN写使能线               EN          PD0^1      6    P2^6
*   数据总线                 D0-D3       NC        7-10
*                            D4          P1^4      11    P0^4
*                            D5          P1^5      12    P0^5
*                            D6          P1^6      13            P0^6
*                            D7          P1^7      14    P0^7
*   其他端口连接:
*                        电源负     VSS             1
*                        电源正+4.5--+5.5V   VDD    2
*                        对比度调节    VL  用1(10k左右电阻连接至地)  3
*                        背光负        BLK   VDD   15   
*                        背光正        BLA   GND   16
*********************************************************************************/

#define uint unsigned int
#define uchar unsigned char
//#define disdata P0
//sbit RS=P2^4;
//sbit RW=P2^5;
//sbit LCD_EN=P2^6;

void delay_nms(uint z)//毫秒级延时函数
 {
   uint i,j;
   for(i=0;i<z;i++)
   for(j=0;j<120;j++);
 }

void write_num(uchar num)     //写数据线命令(四线模式数据要分两次写)
   {
     disdata &= 0x0F;         //清高四位端口
     disdata |= (num&0xF0);   //写高四位数据
     delay_nms(2);     //小于 2ms出现少首字符现象
     LCD_EN = 1;              //EN=1
     LCD_EN = 0;             //EN=0
     disdata &= 0x0F;              //清高四位端口
     disdata |= ((num&0x0F)<<4);   //写低四位数据
     delay_nms(2);
     LCD_EN = 1;              //EN=1
     LCD_EN = 0;             //EN=0
 
   }

void write_com(uchar com)  //写指令
   {
    LCD_RS = 0;
  LCD_RW = 0;
    write_num(com);
   }
 
void write_dat(uchar dat)  //写函数
   {
    LCD_RS = 1;
 LCD_RW = 0;
    write_num(dat);
   }

void LCD_init(void)       //LCD初始化
   {
    delay_nms(15);         //原来1602初始化成4位数据线之前必需先初始化成8位
    write_com(0x33);       //(此时命令发送方式是8位格式,但数据线只需接4位),
    delay_nms(5);          //然后再改到4位线宽,这样初始化才稳定
    write_com(0x32);
    delay_nms(5);
    write_com(0x28);   //四线模式设置
    write_com(0x0f);   //显示开--对应开关显示控制指令
    write_com(0x01);   //清屏--对应清屏指令
    delay_nms(5);
   }

void LCD_pos(uchar x,uchar y)//写地址函数
   {
     if(x)
         write_com(0xc0+y); //第二行显示
     else
         write_com(0x80+y); //第一行显示
   }
 
void LCD_write_char(uchar x,uchar y,uchar zifu) //写字符函数
   {
      LCD_pos(x,y);
      write_dat(zifu);
   }
 
void LCD_write_str(uchar x,uchar y,uchar *s)//写字符串函数
   {
      LCD_pos(x,y);
      while(*s)
     {
         write_dat(*s);
         s++;
 
      }
    }

 


共21条 3/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]