论坛风格切换切换到宽版
  • 3519阅读
  • 7回复

用1602做频率显示,遇到很多问题,望指教 [复制链接]

上一主题 下一主题
离线永远的FM
 
发帖
12128
只看楼主 倒序阅读 0楼 发表于: 2008-01-25
现在用89c52控制1602lcd和mb1504做信号发生器,1602做频率显示。现在想实现最简单的频率调整功能:用2个按键,按下其中一个,频率升高5khz(频率最小步进),另一个按下频率减少5k。现在能正常控制mb1504了,不过lcd那边一直没法搞掂

在第一行显示:cb 29.600mhz,按按键,显示29.605mhz,29.610mhz。。。。。。
现在频率最后一位已经能正常变化,不过中间几个数一直无法正常变化。想请教下坛里做过这类东西的朋友,显示控制程序要怎么写?

我现在还是用汇编的。或者给个思路也行。我想我的理解能力应该还可以
离线BD8BT
发帖
283
只看该作者 1楼 发表于: 2008-01-25
我写过一个用来显示ad9851频率的,试验正常,不知对你有没有帮助。
离线永远的FM
发帖
12128
只看该作者 2楼 发表于: 2008-01-25
谢谢!可以试试!是汇编的吗,能上文件参考下吗?
另外继续寻求解答
离线代洪波
发帖
4809
只看该作者 3楼 发表于: 2008-01-25
现在我手头上就正在写一个1602做显示的项目!和我qq联系 7982728
离线小比尔/5
发帖
2582
只看该作者 4楼 发表于: 2008-01-25
这是我的,但是是用c写的。

/* ks0066 series lcm driver */
/* mcu xtal freq. 12.000mhz */
/* for 0802, 1602, 2002 etc.*/

#include <at89x52.h>
#include <string.h>

#define lcd_rs p3_0     /* switch register: command/data */
#define lcd_rw p3_1     /* switch mode:!write/read */
#define lcd_en p3_4     /* lcd operation enable */
#define lcd_bled p3_7     /* lcd backlight */
#define lcd_data p1     /* the port connected to lcm */
#define lcd_clear 0x01
#define max_x 0x10       /* x letters */
#define max_y 0x02       /* y letters */

#define uchar unsigned char
#define uint unsigned int

/* s declaration about lcd driver */
void delay5ms(void);
void delay400ms(void);
void lcd_wrtcmd(uchar command, busy_c);
void init_lcd(void);
uchar get_lcd_status(void);
void lcd_wrtdata(uchar data);
void putcharxy(uchar x,uchar y,unsigned disp_data);
void outtextxy(uchar x,uchar y,uchar *disp_data);

/* main */
void main(void)
{
  uchar i;
  delay400ms();
  init_lcd();
  outtextxy(0,0,"hello");
  outtextxy(0,1,"world!");
  while(1);
}

void init_lcd(void)
{
  lcd_data=0;
  lcd_wrtcmd(0x38,0); /* two lines, 5x7 font style, no cursors, no blink */
  delay5ms();
  lcd_wrtcmd(0x38,0);
  delay5ms();
  lcd_wrtcmd(0x38,0);
  delay5ms();
  lcd_wrtcmd(0x38,1);
  lcd_wrtcmd(0x80,1);
  lcd_wrtcmd(lcd_clear,1);
  lcd_wrtcmd(0x06,1);
  lcd_wrtcmd(0x0c,1);
}

uchar get_lcd_status(void)
{
  lcd_data=0xff;
  lcd_en=0;
  lcd_en=0;
  lcd_rw=1;
  lcd_rs=0;
  lcd_en=1;
  while(lcd_data & 0x80);
  lcd_en=0;
  return lcd_data;
}

void lcd_wrtdata(uchar data)
{
  lcd_en=0;
  get_lcd_status();
  lcd_data=data;
  lcd_rs=1;
  lcd_rw=0;
  lcd_en=0;
  lcd_en=0;
  lcd_en=1;
  lcd_en=1;
  lcd_en=0;
}

void lcd_wrtcmd(uchar command, busy_c)
{
  lcd_en=0;
  if(busy_c) get_lcd_status();
  lcd_data=command;
  lcd_rs=0;
  lcd_rw=0;
  lcd_en=0;
  lcd_en=0;
  lcd_en=1;
  lcd_en=1;
  lcd_en=0;
}

void putcharxy(uchar x,uchar y,unsigned disp_data)
{
  y=y&(max_y-1);
  x=x&(max_x-1);
  if(y) x+=0x40;
  x+=0x80;
  lcd_wrtcmd(x,1);
  lcd_wrtdata(disp_data);
}

void outtextxy(uchar x,uchar y,uchar *disp_data)
{
  uchar char_length,j;
  char_length=strlen(disp_data);
  y=y&(max_y-1);
  x=x&(max_x-1);
  for (j=0;j<char_length;j++)
  {
    putcharxy(x,y,disp_data[j]);
    x++;
  }
}

void delay5ms(void) { uint i=6025;while(i--); }

void delay400ms(void)
{
  uchar i=5; uint j;
  while(i--){ j=7888; while(j--); }
}
离线cctvcctv
发帖
412
只看该作者 5楼 发表于: 2008-01-26
汇编的

rs bit p2.5     ;确定具体硬件的连接方式
rw bit p2.6     ;确定具体硬件的连接方式
e bit p2.7

mov p0,#00000001b;清屏并光标复位
acall enable;调用写入命令子程序

mov p0,#00111000b;设置显示模式:8位2行5x7点阵
acall enable ;调用写入命令子程序

mov p0,#00001111b;显示器开、光标开、光标允许闪烁
acall enable ;调用写入命令子程序

mov p0,#00000110b;文字不动,光标自动右移
acall enable ;调用写入命令子程序

mov p0,#0cfh;写入显示起始地址(第二行第一个位置)
acall enable ;调用写入命令子程序

mov p0,#01000001b;字母a的代码

setb rs;rs=1
clr rw;rw=0 ;准备写入数据
clr e;e=0 ;执行显示命令
acall delay ;判断液晶模块是否忙?
setb e;e=1 ;显示完成,程序停车

ajmp $

enable:
clr rs;写入控制命令的子程序
clr rw
clr e
acall delay
setb e
ret

delay:
mov p0,#0ffh;判断液晶显示器是否忙的子程序
clr rs
setb rw
clr e
nop
setb e
jb p0.7,delay;如果p1.7为高电平表示忙就循环等待
ret

end
离线代洪波
发帖
4809
只看该作者 6楼 发表于: 2008-01-26
我问清楚了,他的在计算显示数据的时候出了问题,不是1602控制本身!
离线永远的FM
发帖
12128
只看该作者 7楼 发表于: 2008-01-27
非常感谢各位热心朋友帮助。现在程序已经调好了!