钻石会员
主题
回帖0
积分21684
阅读权限50
注册时间2010-3-13
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2012-3-11 18:34
|
显示全部楼层
M16部分没问题,是最小系统板,我通过一个蜂鸣器加在循环中,可以正常鸣叫,说明都忙都是成功的,估计是写数据不成功。
对比度Vo已经接了,按照淘宝上的方法接的,实际也可以调:注意!对比度调法:用10k电位器一脚接地,一脚接负压输出脚(18脚),中间抽头接Vo对比度调节脚(3脚),对比度的调节和程序是否运行无关,对比度过浅看不见字。
我从51改的程序:
////////////////lcd.c
- /***************************************************************************************
- * QQ:120173389 MAIL: tlp.totop@foxmail.com *
- * Baidu 空间 http://hi.baidu.com/tlptotop *
- ***************************************************************************************/
- #include <datatype.h>
- //#include <intrins.h>
- //#include <stdio.h>
- //#include <STC89.H>
- #include <avr/io.h>
- #include "lcd.h"
- #include "chartbl8x16.h"
- //#include "chartbl16x16.h"
- #define FREQ 8 //晶振频率
- //延时t毫秒
- void DelayMs(uint t)
- {
- uint i;
- for(i=0;i<t;i++)
- _delay_loop_2(FREQ * 250);
- }
- //延时t微秒
- void DelayUs(uint t)
- {
- _delay_loop_2(2*t);
- }
- void SelectScreen(uchar screen)
- {
- switch(screen)
- {
- case 0: lcdCS1_L();lcdCS2_H(); break; //左屏
- case 1: lcdCS2_L();lcdCS1_H(); break; //右屏
- }
- }
- //===========================================================
- //测忙
- void whileBusy(void)
- {
- DDRD&=0x00; //全部输入
- PORTD=0xFF; //PD上拉电阻开
- lcdEn_L();
- DelayUs(1);
- lcdRs_L(); //在进行读操作前要进行一次空读操作
- lcdRw_H();
- DelayUs(1);
- lcdEn_H();
- DelayUs(1);
- while(busyFlag())
- {
- lcdEn_L();
- DelayUs(1);
- lcdEn_H();
- DelayUs(1);
- }
- lcdEn_L();
- }
- //===========================================================
- //写指令
- void lcdWriteCommand (uchar cmd)
- {
- whileBusy();
- lcdEn_L();
- //DelayUs(1);
- DDRD|=0xFF; //全部输出
- lcdDataOut=cmd;
- lcdRs_L();
- lcdRw_L();
- DelayUs(1);
- lcdEn_H();
- DelayUs(1);
- lcdEn_L();
- lcdRw_H();
- DelayUs(1);
- }
- //===========================================================
- //写数据
- void lcdWriteData (uchar dat)
- {
- whileBusy();
- lcdEn_L();
- //DelayUs(1);
- DDRD|=0xFF; //全部输出
- lcdDataOut=dat;
- lcdRs_H();
- lcdRw_L();
- DelayUs(1);
- lcdEn_H();
- DelayUs(1);
- lcdEn_L();
- lcdRw_H();
- DelayUs(1);
- }
- //===========================================================
- //读数据
- uchar lcdReadData (void)
- {
- uchar dat;
- lcdEn_L();
- //DelayUs(1);
- whileBusy();
- DDRD&=0x00; //全部输入
- PORTD=0xFF; //PD上拉电阻开
- lcdRs_H();
- lcdRw_H();
- DelayUs(1);
- lcdEn_H();
- DelayUs(1);
- dat=lcdDataIn;
- lcdEn_L();
- lcdRw_L();
- return dat;
- }
- //===========================================================
- //写入坐标
- void wrPosition (uchar page,uchar y)
- {
- lcdWriteCommand(0xB8+page); //设置页
- lcdWriteCommand(0x40+y); //设置列
- }
- //===========================================================
- //液晶屏初始化
- void lcdInit(void)
- {
- SelectScreen(0);
- lcdWriteCommand(0xC0); //设置初始行
- lcdWriteCommand(0x3F); //显示打开
- SelectScreen(1);
- lcdWriteCommand(0xC0); //设置初始行
- lcdWriteCommand(0x3F); //显示打开
- }
- void dispChar8x16(uchar line,uchar row,uchar shift)
- {
- uchar i=0;
- if (row<8)
- SelectScreen(0);
- else
- {
- SelectScreen(1);
- row-=8;
- }
- wrPosition(line*2,row*8);
- for(i=0; i<8; i++)
- {
- lcdWriteData(ASCII816[(shift-32)*16+i]);
- }
- wrPosition(line*2+1,row*8);
- for(i=0; i<8; i++)
- {
- lcdWriteData(ASCII816[(shift-32)*16+8+i]);
- }
- }
- /*//===========================================================
- //显时一个字符
- void dispChar16x16(uchar line,uchar row,uchar shift)
- {
- uchar i=0;
- SelectScreen(0);
- wrPosition(line*2,row*16);
- for(i=0; i<16; i++)
- {
- lcdWriteData(~HZTable[shift*32+i]);
- }
- wrPosition(line*2+1,row*16);
- for(i=0; i<16; i++)
- {
- lcdWriteData(~HZTable[shift*32+16+i]);
- }
- }
- */
- //===========================================================
- //显时文本
- void dispString(uchar line,uchar row,char *msg)
- {
- while(*msg!='\0')
- {
- uchar data=*msg;
- dispChar8x16(line,row,data);
- msg++;
- row++;
- //DelayMs(50);
- }
- }
-
复制代码
/////////////lcd.h
- /***************************************************************************************
- * QQ:120173389 MAIL: tlp.totop@foxmail.com *
- * Baidu 空间 http://hi.baidu.com/tlptotop *
- ***************************************************************************************/
- #ifndef __LCD_H__ //防止头文件被重复编译
- #define __LCD_H__
- #include<datatype.h>
- #include <avr/io.h>
- //#include <STC89.H>
- /*************************************************
- 预定义声明
- *************************************************/
- /*************************************************
- 硬件连接声明
- *************************************************/
- #define lcdRs_H() PORTC|=1<<PC7 //数据
- #define lcdRs_L() PORTC&=~(1<<PC7) //命令
- #define lcdRw_H() PORTC|=1<<PC6 //读控制
- #define lcdRw_L() PORTC&=~(1<<PC6) //写控制
- #define lcdEn_H() PORTC|=1<<PC5 //使能控制
- #define lcdEn_L() PORTC&=~(1<<PC5) //使能控制
- #define lcdCS1_H() PORTC|=1<<PC0 //CS1
- #define lcdCS1_L() PORTC&=~(1<<PC0) //CS1
- #define lcdCS2_H() PORTC|=1<<PC1 //CS2
- #define lcdCS2_L() PORTC&=~(1<<PC1) //CS2
- #define lcdRST_H() PORTC|=1<<PC2 //RST
- #define lcdRST_L() PORTC&=~(1<<PC2) //RST
- #define busyFlag() PIND&_BV(PD7) //液晶忙标志
- #define lcdDataOut PORTD //液晶数据
- #define lcdDataIn PIND //液晶数据
- #define NOP asm volatile("nop"::)
- #endif
- /*******************************************************************************
- End Of File
- *******************************************************************************/
复制代码
|
|