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()  ;
  
  
        }  

 

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Bilateral Filters(双边滤波算法)原理及实现

    Bilateral Filters(双边滤波算法)原理及实现双边滤波算法原理:双边滤波算法实现:双边滤波算法实例:参考:http://people.csail.mit.edu/sparis/bf/http://blog.csdn.net/fightingforcv/article/details/52723376http://blog.csdn.net/mumu

  • nginx实现负载均衡配置_nginx负载性能

    nginx实现负载均衡配置_nginx负载性能nginxnginx的安装下载nginx安装包并解压tarzxfnginx-1.14.0.tar.gz对nginx源码文件进行修改,隐藏版本号cd/root/nginx-1.14.0/src/core/vimnginx.h14#defineNGINX_VER&quot;nginx/&quot;#不显示版本号cd/root/nginx-1….

  • 最新、最全、最准确的手机号正则表达式

    最新、最全、最准确的手机号正则表达式更新到2018年1月,支持最新的166号段/***手机号码正则表达式*/privatestaticfinalStringPHONE_NUMBER_REG="^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";

  • Java创建二维数组

    Java创建二维数组1、Java创建二维数组:int[][]array=newint[6][6];2、直接创建二维数组并赋值:int[][]array={{1,2,3},{1,2,3},{1,2,3}};3、二维数组的声明:先声明再分配内存数组声明:数据类型数组名[][];…

  • 一个线程崩溃会引起整个进程崩溃_大量线程状态waiting

    一个线程崩溃会引起整个进程崩溃_大量线程状态waiting建议74:警惕线程的IsBackground在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性。两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就会一直存在,必须所有的前台线程全部退出,应用程序才算退出。而后台进程则没有这方面的限制,如果应用程序退出,后台线程也会一并退出。查看以下代码:staticvoidMain

    2022年10月17日
  • 资源网站链接[通俗易懂]

    资源网站链接[通俗易懂]JavaScript代码在线压缩   http://oncoding.net/tools/jsmin/CSSValidationService  http://jigsaw.w3.org/cs

发表回复

您的电子邮箱地址不会被公开。

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