文档库 最新最全的文档下载
当前位置:文档库 › avr驱动12864

avr驱动12864

本程序开发环境为atmel studio6.2,你若采用其他开发环境,其中的一些寄存器定义可能会有所不同
程序具有较好的可移植性,在大多avr都能使用,
采用spi和模拟spi两种方式,可以通过sim_spi设置选择
采用spi的好处是速度快,不闪屏;
模拟spi则适用于更多种类的单片机
本程序作为子程序来使用所以并未包含一些必要的文件,请查看你的程序是否包含以下头文件;若用其他编译环境请根据实际情况调整
#define F_CPU 8000000UL //定义晶振频率 delay.h前必须定义
#include // atmel studio6.2环境下avr单片机的通用头文件
#include //atmel studio6.2环境下标准延时函数,本程序引用其中的 _delay_ms()
显示时调用void lcd_disp(int x,int y,char data[])即可
参数说明:x 行号;12864从上到下行号分别为1、2、3、4;
Y列号;12864每行从左到右分别为1至8;
Data[]数据;要显示的数据,不超过16个字符,一个汉字占2字符

本程序是本人编写、亲测,也许并不完美,贴出来仅供给你参考,若用于商业用途请酌情修改
由于程序漏洞或者错误,以及本程序衍生出的问题给你造成的损失请自行承后果。





#define uchar unsigned char
#define DDR_SPI1 DDRB |= (1<#define DELAY_CMD 20 //写命令后延时
#define DELAY_DAT 20 //写一个数据后延时;时间越长每个字间隔越明显
#define DELAY_HANG 10 //写完一行后延时

#define sim_spi false //是否用io口模拟spi

/***************************************模拟spi时配置以下参数******************************************************/
#define mosi0 PORTB &=~(1<#define mosi1 PORTB |=(1<#define sclk0 PORTB &=~(1<#define sclk1 PORTB |=(1<#define css0 PORTB &=~(1<#define css1 PORTB |= (1</***************************************模拟spi时配置以上参数******************************************************/
#if sim_spi
void spi(char data){
DDR_SPI1; SPCR |= (1<while(!(SPSR&(1<}
#else
void spi(char data){
char i; for(i=0;i<8;i++) { SREG |= 0x00;//关闭全局中断 sclk0; if(data&0x80) mosi1; else mosi0; data=data<<1; //左移一位 sclk1; sclk0; SREG |= 0x80;//开全局中断 }
}
#endif


void cmd(char data){
css0;
css1;

spi(0xf8);
spi(data & 0xf0);
spi((data<<4) & 0xf0);
css0;
_delay_ms(DELAY_CMD);

}

void dat

(char data){
css0;
css1;
spi(0xfa);
spi(data & 0xf0);
spi((data<<4) & 0xf0);
css0;
_delay_ms(DELAY_DAT);
}

void lcd_init(){
_delay_ms(20);
DDR_SPI1;//模拟spi口配置为输出
//DDRA = 0xff;
//PORTF = 0xff;
cmd(0x34);//扩展
_delay_ms(50);
cmd(0x30);//基本
_delay_ms(50);
cmd(0x0c);//显示开
_delay_ms(50);
//cmd(0x0d);//显示开 光标开 游标位置开
_delay_ms(50);
cmd(0x02);//地址归位
_delay_ms(50);
cmd(0x01);//清屏
_delay_ms(50);
}

void lcd_disp(int x,int y,char data[])
{
switch(x){
case 1 : x=0x80;break;
case 2 : x=0x90;break;
case 3 : x=0x88;break;
default : x=0x98;break;
}
cmd(x+y-1);
int i=0;
while(data[i]!='\0'&&((y*2+i)<=17))//判断到达data结尾
{
dat(data[i]);
i++;

}
_delay_ms(DELAY_HANG);
cmd(0x02);//地址归位
}

相关文档