这是的AVR mega8 的程序
/*
* _1602_mega8.c
*
* Created: 2014-5-12 10:47:19
* Author: Administrator
//这是LCD 1602 通用程序
#define F_CPU 3686400UL
#include <avr/io.h>
#include <avr/delay.h>
#include <string.h>
//LCD控制引脚定义
/***********************************/
#define RS PB0 //寄存器控制端口 0为命令 1数据
#define RW PB1 //读写操作端口
#define E PB2 //使能操作端口
/***********************************/
//LCD 控制端口定义
/***********************************/
#define LCD_CRTL_PORT PORTB
/***********************************/
//LCD 控制引脚操作定义
#define RS_1 LCD_CRTL_PORT|= (1<<RS) //RS为1 进行数据传输
#define RS_0 LCD_CRTL_PORT&=~(1<<RS) //RS为0 进行命令控制
#define RW_1 LCD_CRTL_PORT|= (1<<RW) //RW为1 进行读操作
#define RW_0 LCD_CRTL_PORT&=~(1<<RW) //RW为0 进行写操作
#define EN_1 LCD_CRTL_PORT|= (1<<E) //EN为1 使能1602
#define EN_0 LCD_CRTL_PORT&=~(1<<E) //EN为0 不使能1602
/***********************************
#define RS_1 LCD_CRTL_PORT|=_BV(RS) //RS为1 进行数据传输
#define RS_0 LCD_CRTL_PORT&=~_BV(RS) //RS为0 进行命令控制
#define RW_1 LCD_CRTL_PORT|=_BV(RW) //RW为1 进行读操作
#define RW_0 LCD_CRTL_PORT&=~_BV(RW) //RW为0 进行写操作
#define EN_1 LCD_CRTL_PORT|=_BV(E) //EN为1 使能1602
#define EN_0 LCD_CRTL_PORT&=~_BV(E) //EN为0 不使能1602
***********************************/
//LCD 数据端口定义
/***********************************/
#define LCD_PORT PORTD //发送LCD数据端口
#define LCD_PIN PIND //读取LCD数据端口
#define LCD_DDR DDRD //LCD数据端口方向
/***********************************/
// LCD忙等待
/***********************************/
void LCD_BUSY_WAIT()
{
RS_0; RW_1; //读状态
LCD_DDR=0x00; //端口设为输入
_delay_ms(10);
EN_1; //使能1602 等待
//loop_un
til_bit_is_clear(LCD_PIN,7);
//空转直到端口的最高位7 为0
while((LCD_PIN&0X80)!=0);
EN_0;
LCD_DDR=0XFF; //还原LCD端口为输出
_delay_ms(5);
}
/***********************************/
// 写LCD命令寄存器
/***********************************/
void Write_LCD_Command(unsigned char cmd)
{
LCD_BUSY_WAIT();
RS_0; RW_0; //写状态寄存器
_delay_ms(10);
LCD_PORT=cmd; //写入命令
_delay_ms(15);
EN_1;
_delay_ms(5);
EN_0; //使能
芯片执行
LCD_CRTL_PORT=0X00; //清除端口
}
/***********************************/
// 写LCD数据寄存器
/***********************************/
void Write_LCD_Data(unsigned char data)
{
LCD_BUSY_WAIT();
RS_1; RW_0; //写数据寄存器
_delay_ms(10);
LCD_PORT=data; //写入数据
_delay_ms(15);
EN_1;
_delay_ms(5);
EN_0; //使能
}
/***********************************/
// LCD初始化
/***********************************/
void Initialize_LCD()
{
Write_LCD_Command(0x01); _delay_ms(15); //清屏
Write_LCD_Command(0x38); _delay_ms(15); //置功能,8位数据,双行显示,5*7字体
Write_LCD_Command(0x06); _delay_ms(15); //字符进入模式,屏幕不移动,字符移动,数据时递增的
Write_LCD_Command(0x0c); _delay_ms(15); //显示开,关闭光标
Write_LCD_Command(0x01); _delay_ms(15); //清屏
}
/***********************************/
// LCD字符串显示
/***********************************/
void LCD_ShowString(unsigned char x,unsigned char y,char *str) //表示要再显示屏上的第y行的第x个位置(从左往右)开始显示字符
{
unsigned char i=0;
if(y==0)Write_LCD_Command(0x80|x); //假如第一行开始显示 从x位开始
if(y==1)Write_LCD_Command(0xC0|x); //假如第二行开始显示 从x位开始
for (i=0;i<16 && str
!=' ';i++) //输出字符串
{
Write_LCD_Data(str);
};
}
main()
{
DDRB=0XFF;DDRC=0XFF;
Initialize_LCD();
LCD_ShowString(0,0,"U=");
_delay_ms(10);
LCD_ShowString(2,0,"10v");
PORTC=(1<<PC0);
}
这是我的仿真截图
但是我的实际图是这样的
1.尝试过调解VL 对地的电阻,除了方块对比度变化 ,别的没反应
2.尝试过只接VSS VDD BLK BLA,只是亮起无显示,但是一接上VL就是这样块块了。。。(难道我这个液晶坏了?)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一周热门 更多>