前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1602驱动电路_lcd1602的a和k接哪里

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

作者头像
全栈程序员站长
发布2022-11-08 20:04:22
4120
发布2022-11-08 20:04:22
举报
文章被收录于专栏:全栈程序员必看

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

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

搞了几天的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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月22日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档