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

2022-11-08 20:04:22 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

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

搞了几天的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.cn/190775.html原文链接:https://javaforall.cn

0 人点赞