来点大神帮看下AVR单片机的程序吧。
整理时间:2013-05-09 06:39 来源:www.vimiy.com 作者:编辑 点击:次
【楼主】2013-05-06 21:07
» 来点大神帮看下AVR单片机的程序吧。
#include <iom88v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define LCM_Data PORTD
#define RS_1 PORTC |= BIT(1)
#define RS_0 PORTC &= ~BIT(1)
#define RS_OUT DDRC |= BIT(1)
#define RW_1 PORTC |= BIT(2)
#define RW_0 PORTC &= ~BIT(2)
#define RW_OUT DDRC |= BIT(2)
#define E_1 PORTC |= BIT(3)
#define E_0 PORTC &= ~BIT(3)
#define E_OUT DDRC |= BIT(3)
#define B_1 PORTB |= BIT(0)
#define B_OUT DDRB |= BIT(0)
void delay_ms(uint ms);
void delay_us(uint us);
void Writedat(unsigned char dat); //写数据
void Writecom(unsigned char com); //写指令
void Init_12864(void); //12864初始化
void display(void); //显示
void port_init(void); //AVR端口初始化
uchar table="AVR";
void delay_us(uint us) //延时微秒
{
uint i;
us=us*2*5/4;
for(i=0;i<us;i++);
}
void delay_ms(uint ms) //延时毫秒
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void display(void) //显示 ok
{
uchar i;
Writecom(0x80); //第一行起始地址
delay_ms(100);
for(i=0;i<3;i++)
{
Writedat(table);
delay_ms(100);
}
}
void port_init(void) //AVR端口初始化 ok
{
PORTD = 0x00;
DDRD = 0xff;
RS_OUT;
RW_OUT;
E_OUT;
B_OUT;
B_1 ; //并行设置
delay_ms(200);
}
void Init_12864(void) //12864初始化 ok
{
delay_ms(1000);
Writecom(0x30); //功能设置
delay_ms(10);
Writecom(0x30); //判断设置是否成功
delay_ms(10);
Writecom(0x0f);
delay_ms(10);
Writecom(0x01); //清屏
delay_ms(100);
Writecom(0x06); //光标移动
delay_ms(100);
}
void Writedat(uchar dat) //写数据 ok
{
RW_0;
RS_1;
delay_us(500);
LCM_Data = dat;
delay_ms(10);
E_1;
delay_ms(10);
E_0;
delay_ms(10);
}
void Writecom(uchar com) //写指令 OK
{
RW_0;
RS_0;
delay_us(500);
LCM_Data = com;
delay_ms(10);
E_1;
delay_ms(10);
E_0;
delay_ms(10);
}
void main(void)
{
port_init();
Init_12864(); //12864初始化
while(1)
{
display();
while(1);
}
}
控制12864的 但是为什么不行了。。。都一天的,感觉程序没问题吧。
网友评论2013-05-06 21:48
没法王就没人吗
网友评论2013-05-06 22:01
标题看一半就滚进来了,看了看内容就滚出去了。
网友评论2013-05-06 22:07
看了下 不是还很懂啊
网友评论2013-05-06 22:15
我发个我经常用的吧,你自己对照一下,晚上不想看程序了 MSP430单片机,但时序过程是一样的
*******************************************************************************/
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向
//(默认游标右移,图像整体不动)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF 0x08 //显示关
#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
#define SET_DD_AC 0x80
/******************************************************************************
液晶端口设定
*******************************************************************************/
#define LCD_DATA P4OUT
#define PSB_SET P5OUT|=BIT0//PSB置高
#define PSB_CLR P5OUT&=~BIT0
#define RS_SET P5OUT|=BIT5
#define RS_CLR P5OUT&=~BIT5
#define RW_SET P5OUT|=BIT6
#define RW_CLR P5OUT&=~BIT6
#define EN_SET P5OUT|=BIT7
#define EN_CLR P5OUT&=~BIT7
//#define RST_CLR P5OUT &= ~BIT0 //RST置低
//#define RST_SET P5OUT |= BIT0 //RST置高
/*******************************************************************************
名称:void write_cmd(uchar cmd)
功能:向液晶写入命令段
入口参数:cmd 操作液晶功能的数字段
出口参数:无
*******************************************************************************/
void write_cmd(uchar cmd)
{
RS_CLR;
RW_CLR;
EN_SET;
LCD_DATA=cmd;
delay_ms(5);
EN_CLR;
}
/*******************************************************************************
名称:void LCD_init(void)
功能:液晶功能的初始化设定
入口参数:无
出口参数:无
*******************************************************************************/
void LCD_init(void)
{
P4SEL = 0x00;
P4DIR = 0xFF;
P5SEL = 0x00;
P5DIR|= BIT0 + BIT1 + BIT5 + BIT6 + BIT7;
PSB_SET; //液晶并口方式
write_cmd(FUN_MODE); //显示模式设置
delay_ms(5);
write_cmd(FUN_MODE); //显示模式设置
delay_ms(5);
write_cmd(0x0c); //显示开
delay_ms(5);
write_cmd(CLEAR_SCREEN); //清屏
delay_ms(5);
}
/*******************************************************************************
名称:void write_data(uchar data)
功能:向液晶写入数据
入口参数:data 液晶显示的数据
出口参数:无
*******************************************************************************/
void write_data(uchar data)
{
RS_SET;
RW_CLR;
EN_SET;
LCD_DATA=data;
delay_ms(5);
EN_CLR;
}
/*******************************************************************************
名称:void lcd_clear(void)
功能:清除液晶显示,清屏
入口参数:无
出口参数:无
*******************************************************************************/
void lcd_clear(void)
{
write_cmd(0x01);
delay_ms(5);
}
/*******************************************************************************
名称:void DisplayCgrom(uchar addr,uchar *hz)
功能:向液晶的某地址写入字符串或数组或某变量(用指针表示)
入口参数: addr:表示液晶显示的地址 *hz:指针变量
出口参数:无
说明:如DisplayCgrom(0x080,&num)
*******************************************************************************/
void DisplayCgrom(uchar addr,uchar *hz)
{
write_cmd(addr);
delay_ms(5);
while(*hz!='\0')
{
write_data(*hz);
hz++;
delay_ms(5);
}
}
LOL罗辑思维全国人大代表真三搞笑视频柳岩
Copyright © 2012年2月8日