大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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账号...