立即注册 登录
返回首页

uid:103513的个人空间

日志

1602液晶 51单片机和pic单片机通杀

已有 1537 次阅读2016-1-17 00:25

//犯的错:在51里RW(L命令、H数据)是直接焊成接地的
//∴ 少了lcd_enable(); 这一函数{lcdrs = 0; lcdrw = 0; lcden = 0; delay(5); lcden = 1;}
//少了这一函数设置就无法显示了
#define PIC
#ifdef ww
 #include<reg52.h>
 #define uchar unsigned char
 #define uint unsigned int
 uchar code table[]="   hello! jasper";   //写字符串时用“”而不是{ }了
 uchar code table1[]="   xm.dabiao    ";
 sbit lcden=P3^4;
 sbit lcdrs=P3^5; 
 sbit dula=P2^6;     
 sbit wela=P2^7;
#endif
#ifdef PIC
 #include <pic.h>
 __CONFIG(0X3B31);
 #define uchar unsigned char 
 #define uint unsigned int
  //奇怪了,移动下面2行会提示,逗号错误
 const uchar table[]="   hello! jasper";    //写字符串时用“”而不是{ }了
 const uchar table1[]="   xm.dabiao    "; //PIC的数组写法与51的是不同的
 #define lcden RA3
 #define lcdrs RA5
 #define lcdrw RA4
 #define P0 PORTD
#endif
uchar num;
void delay(uint z)     //延时
{
  uint x,y;
  for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void write_com(uchar com) //写指令函数
{
  lcdrs=0;  
  P0=com;
  delay(5);  
  lcden=1;  
  delay(5);
  lcden=0;
}
void write_data(uchar date)   //写数据 函数
{
  lcdrs=1;
  P0=date;
//  delay(5);
  lcdrs=1;
#ifdef PIC
  lcdrw=0; //写成1就什么也显示不了,在51里它是直接接地的
#endif
  lcden=0;
  delay(5);
  lcden=1;
}
void lcd_enable(void)    //LCD显示设置
{
 lcdrs = 0;                     //该字节数据L为命令,H高为数据
#ifdef PIC
 lcdrw = 0;                     //此次操作为写,而不是读
#endif
 lcden = 0;                      //拉低使能信号
 delay(5);                   //保持使能信号为低一段时间
 lcden = 1;                      //拉高使能信号,建立LCD操作所需要的上升沿
}
void init()
{
#ifdef ww
   dula=0;           //初始化,关断数码管
  wela=0;
  lcden=0; 
  write_com(0x38);    //显示模式设定,0X38即阐述了此液晶为16X2显示,是5X7点阵 
  write_com(0x0e);    //开显示不显光标,光标不闪烁 
  write_com(0x06);    //当前为加一模式且整屏不左移
  write_com(0x01);  //之后还要刷新一次
 // write_com(0x80);
  write_com(0x80+0x10); //表示这是从第一行开始写,因为要整屏移动所以要加0x10
#endif
#ifdef PIC
  TRISA=0x00;PORTA=0XF0;
  TRISD=0x00;PORTD=0XFF;
   ADCON1=0X07;  //设置A口为普通IO口
  RA1=1;
  lcd_enable();   //该字节数据为命令,而不是数据.少了这一行就显示不了
  write_com(0x38);    //显示模式设定,0X38即阐述了此液晶为16X2显示,是5X7点阵  
  lcd_enable();   //该字节数据为命令,而不是数据.少了这一行就显示不了
  write_com(0x0e);    //开显示不显光标,光标不闪烁 
  lcd_enable();   //该字节数据为命令,而不是数据.少了这一行就显示不了
  write_com(0x06);    //当前为加一模式且整屏不左移
  lcd_enable();   //该字节数据为命令,而不是数据.少了这一行就显示不了
  write_com(0x01);  //之后还要刷新一次
  lcd_enable();   //该字节数据为命令,而不是数据.少了这一行就显示不了
 // write_com(0x80);
  write_com(0x80+0x10); //表示这是从第一行开始写,因为要整屏移动所以要加0x10
#endif 
}
void doio(void)
{
    for(num=0;num<16;num++) 
  {       
    write_data(table[num]); 
    delay(20); 
  }
 //----------------------------再写第二行
  write_com(0x80+0x51);  
  for(num=0;num<16;num++)
  {
    write_data(table1[num]);
    delay(20);
  }
  for(num=0;num<16;num++)
  {
    write_com(0x18);   //由code控制位 表算得18,整屏左移
    delay(160); 
  }
  while(1);
}
void main()
{
  init();
  doio();
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部