1602驱动电路_lcd1602的a和k接哪里

1602驱动电路_lcd1602的a和k接哪里       今天我也开博了,一个前辈的话对我触动很大:不会分享,不懂总结,就不要做技术。这也是我这博客的目的,望各路过高手菜鸟多多指教。          搞了几天的1062a终于调通了。前段时间把8位总线的调通了,这个简单,网上资料也多。以前写程序一般都是网上找资料后自已再改,这次1062a四位驱动的程序网上也有,我下了好多版本结果都不行,就这样我也堵在这几天了。这说明我的底层程序

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

        今天我也开博了,一个前辈的话对我触动很大:不会分享,不懂总结,就不要做技术。这也是我这博客的目的,望各路过高手菜鸟多多指教。

       

   搞了几天的1062a终于调通了。前段时间把8位总线的调通了,这个简单,网上资料也多。以前写程序一般都是网上找资料后自已再改,这次1062a四位驱动的程序网上也有,我下了好多版本结果都不行,就这样我也堵在这几天了。这说明我的底层程序编写功夫不深。以前老师老一再给我说时序的重要性,现在才终于领悟了。以后程序调不成功不能老死死的盯着程序了,换个角度用示波器看看时序,说不定有收获。

      现在说说我的问题: 问题很简单直接,就是背光亮,没东东显示出来。这个的原因多,范围太大,整个程序都有可以有问题,当然我的程序是用8位总线的改的,8位总线的调试成功了的,这说明出错的地方有三个:1,初始化2,写数据 3,写命令。开始觉得初始化简单,把writecom(0x38);改成 writecom(0x2C);就差不多了,后面把主要精力放在了写数据和写命令上,这也是我为什么搞了几天进展不大的原因。问题就在初始化上面,一些网友说writecom(0x28);要写三次,我试了还是不行,仔细看了1602a资料的汇编的初始化驱动,发现如下代码:

INT    MOV      P1#30H ;工作方式设置指令代码

          CLR      RS               RS=0

          CLR      R/W              RW=0     

          MOV      R2#03H         ;循环量=3

 

把原来的:

writecom(0x28);

writecom(0x28);

writecom(0x28);

改成:   writecom(0x28);

         delay_nus(50);

            lcden=1;

         delay(1);

            lcden=0;

烧写程序 有显示了,激动!

 

原来我一直受开始在网上查的一个资料的误导,把那段汇编的始始化成程序理解成了三次写命令,而事实上,在四位总线上一次写命令有二次实际的写操作,1602a在初始化时真正需要的是三次对0X28的写操作。还要提醒一点lcden=1; delay(1); lcden=0;实现了写操作的上升沿的触发,写的命命发出是在第一个“lcden=1”产生的然后再将它归0。这就有个问题,在第一个写命令前 LCDen 默认的是“1”,那么 第一个的写操作就无法产生上升沿,所以在初始化开始前要加个lcden=0;

 

下面是程序 也是网上下来改的 有点乱 多多指教:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^0;
sbit lcdwr=P3^1;
sbit lcden=P3^2;

sbit time_start=P0^0;
sbit time_stop=P0^1;
sbit test=P1^7; //调试用 没意义

sbit led=P1^1;

sbit rf_bit0=P3^4;
sbit rf_bit1=P3^5;
sbit rf_bit2=P3^6;
sbit rf_bit3=P3^7;

#define LCM_Data P2//数据接口

unsigned int msec=0;
unsigned int kingkong=8;

uchar code table[]=”DMB-TH”;
uchar code table1[5];
uint F;

 

 

 

/*****************************************************************************/
uchar LCM_ReadStatus(void);

void delay(uchar k)
{

 uchar i,j;
 for(i=0;i<110;i++)
  for(j=k;j>0;j–);
}

void delay_nus(unsigned int n)       //N us延时函数
  {

   unsigned int i=0;
   for (i=0;i<n;i++)
   i=i+1;
   i=i-1;
  }

void Delay5Ms();

void writedata(uchar date)
{  

   
 uchar temp;
 temp=date;
 delay(5);
   // LCM_ReadStatus();
 
  
  
    lcdrs=1;
 lcdwr=0;
 LCM_Data&=0x0f;
 LCM_Data|=date&0xf0;
 //LCM_Data=date;//>>4;
    //lcden=1;
 //delay(1);
 lcden=1;
    delay(1);
 lcden=0;

// lcdwr=1;
    delay_nus(50);
// Delay5Ms();
// Delay5Ms();
   

/*
 lcdrs=1;
    lcdwr=0;
 LCM_Data=temp<<4;
 lcden=1;
 delay(5);
 lcden=0;
 lcdwr=1;
*/
   // lcdrs=1;
 
// lcdwr=0;
 //LCM_Data=temp<<4;
    temp=temp<<4;
 LCM_Data&=0x0f;
 LCM_Data|=temp&0xf0;
    //lcden=1;
// delay(1);
 lcden=1;
    delay(1);
 lcden=0;
// lcdwr=1;
// delay(1);
}

void writecom(uchar com)
{  
  // LCM_ReadStatus();
   
    uchar temp;
 delay(5);
 temp=com;
    test=1;
 lcdrs=0;
    //lcden=1;
 lcdwr=0;
    LCM_Data&=0x0f;
 LCM_Data|=com&0xf0;
 //lcden=1;
 //delay(1);
 lcden=1;
    delay(1);
 lcden=0;
// lcdwr=1;
 delay_nus(50);
// Delay5Ms();
 //Delay5Ms();
  /*
 //temp<<4;
 lcden=0;
 lcden=0;
 lcdrs=0;
    lcdwr=0;
 LCM_Data=temp<<4;
 lcden=1;
 delay(5);
 lcden=0;
 lcdwr=1;
*/ 

     test=0;
// lcdrs=0;
    //lcden=1;
// lcdwr=0;
    temp=temp<<4;
    LCM_Data&=0x0f;
 LCM_Data|=temp&0xf0;
 //lcden=1;
// delay(1);
 lcden=1;
    delay(1);
 lcden=0;
// lcdwr=1;
// delay(1);
 test=1;
 test=0;
}

/****************************1602A读状态函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:
/**********************************************************************
 
uchar LCM_ReadStatus(void)
{

while (((LCM_Data & 0x80)-0x00)>0)
        {

          LCM_Data = 0xFF;
          lcdrs = 0;
          lcdwr = 1;
          lcden = 0;
          lcden = 0;
          lcden = 1;
          lcden = 0;

        };//检测忙信号
return(LCM_Data);
}
/************************************************************************/
 

 

/******************1602A按指定位置显示一个字符函数**********************/
/*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示的字符
/*输出参数:无
/*调用模块:
/**********************************************************************/
 
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{

Y &= 0x1;
X &= 0xF;//限制X不能大于15,Y不能大于1
if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;
X |= 0x80;// 算出指令码
writecom(X);//这里不检测忙信号,发送地址码
writedata(DData);
}
/*******************1602A按指定位置显示一串字符函数*********************/
/*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示字符串的首地址
/*输出参数:无
/*调用模块:
/**********************************************************************/
 
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{

uchar ListLength;
//writecom(0x01);
ListLength = 0;
Y &= 0x1;
X &= 0xF;//限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20)//若到达字串尾则退出
{

if (X <= 0xF)//X坐标应小于0xF
{

DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符
ListLength++;
X++;
}
}
}
/**************************************************************/
/*  LCD显示十进制数字:position,line,value,lenth;
/*  positon:表示字符显示位置;
/*  line:显示字符的行数;value:要显示的变量值;
/*  lenth:显示十进制数的长度,最大为5位;
/**************************************************************/
void LCD_show_dec(unsigned int value,unsigned char lenth,unsigned char howline,unsigned char position)
{ unsigned int temp=1;
 unsigned char i;
 switch(howline)
        {

         case 0:writecom(0x80+position); //The First Line Addr,Range 00h-2fh
                       break;
         case 1:writecom(0xc0+position); //The Second Line Addr,Range 40h-67h
                       break;
         default:break;
        }
 for(i=1;i<lenth;i++)
  temp*=10;
 writecom(0x06);
 for(i=0;i<lenth;i++)
 {

  writedata(value/temp+0x30);
  value=value%temp;
  temp/=10;
 }
}
/********************5ms延时函数************************/
/*函数原型:void Delay5Ms(void)
/*函数功能:5ms延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/**********************************************************************/
 
void Delay5Ms(void)
{

unsigned int TempCyc = 5552;
while(TempCyc–);
}
 
/********************400ms延时延时函数************************/
/*函数原型:void Delay400Ms(void)
/*函数功能:400ms延时延时
/*输入参数:无
/*输出参数:无
/*调用模块:
/**********************************************************************/
 
void Delay400Ms(void)
{

uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA–)
{

TempCycB=7269;
while(TempCycB–);
};
}

/***********************************************************************/

/********************初始化延时函数************************/
/*函数原型:void init()
/*函数功能:跏蓟?
/*输入参数:无
/*输出参数:无
/*调用模块:
/**********************************************************************/
void init()
{   
    LCM_Data = 0;
 lcden=0;

    writecom(0x28);
 
    delay_nus(50);
 lcden=1;
    delay(1);
 lcden=0;
//  Delay5Ms();

// writecom(0x28);
//  Delay5Ms();
// writecom(0x28);
 //    Delay5Ms();

 writecom(0x01);  //clear the display
 
    // Delay5Ms();
 writecom(0x0f);  // 光标 B2 显示开关 B1 光标开关 B0 光标闪铄
 // Delay5Ms();
 writecom(0x06);  //输入方式
   //  Delay5Ms();
    writecom(0x2C); //方式设置 2C 4bit bus ,38 8 BIt
//  Delay5Ms();
 writecom(0x80+0x13);
 //writecom(0x30);

/* LCM_Data = 0;
 writecom(0x38);
     Delay5Ms();
 writecom(0x38);
  Delay5Ms();
 writecom(0x38);
     Delay5Ms();
 writecom(0x38);
     Delay5Ms();
 writecom(0x01);
  Delay5Ms();
 writecom(0x06);
  Delay5Ms();
 writecom(0x80+0x13);
 //writecom(0x30);*/
}

/****************************频率端口操作函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:
/**********************************************************************/
void RF_opration(uint a)
{

  switch(a)
   {  case(1):rf_bit0=1;rf_bit1=1;rf_bit2=0;rf_bit3=1;DisplayListChar(0, 1, “frequencey:706M”);break;
      case(2):rf_bit0=0;rf_bit1=1;rf_bit2=0;rf_bit3=1;DisplayListChar(0, 1, “frequencey:714M”);break;
   case(3):rf_bit0=1;rf_bit1=1;rf_bit2=0;rf_bit3=0;DisplayListChar(0, 1, “frequencey:722M”);break;
   case(4):rf_bit0=0;rf_bit1=1;rf_bit2=0;rf_bit3=0;DisplayListChar(0, 1, “frequencey:730M”);break;
   case(5):rf_bit0=1;rf_bit1=0;rf_bit2=1;rf_bit3=1;DisplayListChar(0, 1, “frequencey:738M”);break;
   case(6):rf_bit0=0;rf_bit1=0;rf_bit2=1;rf_bit3=1;DisplayListChar(0, 1, “frequencey:746M”);break;
   case(7):rf_bit0=1;rf_bit1=0;rf_bit2=1;rf_bit3=0;DisplayListChar(0, 1, “frequencey:754M”);break;
   case(8):rf_bit0=0;rf_bit1=0;rf_bit2=1;rf_bit3=0;DisplayListChar(0, 1, “frequencey:762M”);break;
   }

}
/************************************************************************/

/*******************************键盘扫苗*************************************/
void keyscan()
{

uchar n;
uchar i;

P1=0xfe;
n=P1;
n&=0xfc;
if(n!=0xfc)
{

  Delay5Ms();
  P1=0xfe;
  n=P1;
  n&=0xfc;
  if(n!=0xfc)
{

   switch(n)
{

   // case(0xe0):DisplayListChar(0, 1, “frequencey:1”);break;
   // case(0xd0):DisplayListChar(0, 1, “frequencey:2”);break;
    case(0xf8):RF_opration(++F);break;//  p1.0 and p1.6 jont
    case(0xf4):RF_opration(–F);break;//  p1.0 and p1.7
    }
   }
}

if(F>8)F=8;
if(F<1)F=1;
/*
P1=0xfd;
n=P1;
n&=0xf0;
if(n!=0xf0)
{

  delay();
  P1=0xfd;
  n=P1;
  n&=0xf0;
  if(n!=0xf0)
{

   switch(n)
{

    case(0xe0):DisplayListChar(0, 1, “frequencey:5”);break;
    case(0xd0):DisplayListChar(0, 1, “frequencey:6”);break;
    case(0xb0):DisplayListChar(0, 1, “frequencey:7”);break;
    case(0x70):DisplayListChar(0, 1, “frequencey:8”);break;
    }
   }
}
*/
P1=0xfd;
n=P1;
n&=0xfc;
if(n!=0xfc)
{

  Delay5Ms();
  P1=0xfd;
  n=P1;
  n&=0xfc;
  if(n!=0xfc)
{

   switch(n)
{

    //case(0xe0):DisplayListChar(0, 1, “frequencey:9”);break;
    //case(0xd0):DisplayListChar(0, 1, “frequencey:10”);break;
    case(0xf8):
            /*TR0=1;time_stop=0;
            while(1){

               if(time_stop){TR0=0;
                    DisplayListChar(0, 0, “battery:”);
                    LCD_show_dec(msec,5,0,8);
           msec=0;
           goto out;
                   }
      }*/
             out:  writecom(0x01);
          DisplayListChar(6, 0, “DMB-TH”);
          DisplayListChar(2, 1, “bandwith:8M”);break;// p1.2 and p1.7
    //case(0x70):DisplayListChar(0, 1, “frequencey:12”);break;// p1.2 and p1.6
    }
   }
}
/*
P1=0xf7;
n=P1;
n&=0xf0;
if(n!=0xf0)
{

  delay();
  P1=0xf7;
  n=P1;
  n&=0xf0;
  if(n!=0xf0)
{

   switch(n)
{

    case(0xe0):DisplayListChar(0, 1, “frequencey:13”);break;
    case(0xd0):DisplayListChar(0, 1, “frequencey:14”);break;
    case(0xb0):DisplayListChar(0, 1, “frequencey:15”);break;
    case(0x70):DisplayListChar(0, 1, “frequencey:16”);break;
    }
   }
}
*/
/*P0=0x00;
while(time_start){

                   Delay5Ms();
       TR0=1;
                   while(time_stop)TR0=0;DisplayListChar(0, 1, msec);
                  };
*/
}

/*******************************************************************************/

void Timer_Init(void)
{

  PT0    =  1;
  EA     =  1;
  TR0    =  0;            //stop timer
  ET0    =  1;            //timer interrupt set
  TMOD   =  0x01;
  TH0    =  0x3C;
  TL0    =  0xB0;
}
void Time_ISR(void) interrupt 1    //time 0 interrupt
{

  TH0 = 0x3C;
  TL0 = 0xB0;
  msec++;
}  

 

/****************************主函数*****************************************/

void main()

/* uchar num,k,g;
 init();
 //writedata(0x31);
 

 for(num=0;num<9;num++)
  {

   writedata(table[num]);
   
  }
   
 writecom(0x80+0x54);//换行
 for(k=0;k<7;k++)
  {

   writedata(table1[k]);
  }

 for(g=0;g<29;g++)
  {

   writecom(0x1c); 
   delay(500);
  }

*/

 

init();
Timer_Init();

DisplayListChar(6, 0, “DMB-TH”);
RF_opration(3);
F=3;

while(1){keyscan();
         //led=~led;
   //Delay400Ms()  ;
  
  
        }  

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190775.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html5开发环境有哪些(ios开发环境搭建)

    跨平台移动开发实际上就是基于HTML5开发软件界面和主要的业务逻辑,因此一套完善的基于移动平台的HTML5开发环境是非常有必要的。这里我主要的关注点是以下四点:Javascript和Jquerymobile的编辑器HTML5的各个元素的InspectorJavascript远程断点debug移动平台Javascript开发模式1)Javascript和Jquerymobile的

    2022年4月14日
    193
  • jlink 与 swd 接口定义「建议收藏」

    jlink 与 swd 接口定义「建议收藏」1.JLink介绍J-Link是SEGGER公司为支持仿真ARM内核推出的JTAG仿真器。J-Link支持所有基于ARM架构的处理器或微控制器配合IAREWAR,ADS,KEIL等集成开发环境进行开发过程中进行单步控制执行调试。J-Link除了可以配合集成开发环境进行调试程序,进行程序下载之外,J-Link还可以单独使用。比如在产品的生产环节中,就可以单独使用J-Link进行固件的下载。JLink,SWD接口定义缺口向左,左边为JLink接口定义,右边为SWD接口定义JTAG

    2022年4月25日
    221
  • warning用法_docker个人应用

    warning用法_docker个人应用docker本地化异常:/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

    2022年4月22日
    52
  • VS2010的详细安装[通俗易懂]

    VS2010的详细安装[通俗易懂]MicrosoftVisualStudio2010旗舰版的详细安装。安装包:链接:https://pan.baidu.com/s/1-JNyGhwIvasAYQL0GsmzQw密码:fddsstep1、拷贝或下载的安装包(MicrosoftVisualStudio2010.rar)放在E盘(最好不要放在C盘)——&gt;softs——&gt;vs2010——&gt;右击安装…

    2022年4月18日
    47
  • win10共享打印错误0x0000006_win7打印机共享出现0x000006d9错误的解决方法

    win10共享打印错误0x0000006_win7打印机共享出现0x000006d9错误的解决方法这两天在WIN7上安装了一个HP1320打印机,装驱动,后来共享,在共享的时候出错了,发现问题,竟然无法共享打印机。发现出现“0x000006d9错误”,在开始的时候测试打印没问题,就是不能共享,只能说系统本身的问题了。后来经过查询资料,发现很有人说把windowsfirewall服务打开,就可以共享。我装系统的时候装了卡巴,它自动把防火墙关掉,我打开services.msc后发现这个wind…

    2022年5月14日
    142
  • c语言odbc连接数据库_odbc配置access数据库

    c语言odbc连接数据库_odbc配置access数据库一.ODBC连ORACLE: str.Format(“Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd;”)二.ADO连接ORACLE:

    2022年8月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号