LCD12864子程序

以下资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!

/*********************************************************************
 微 雪 电 子   WaveShare   http://www.waveShare.net             
目    的:   建立LCD12864操作库
目标系统:   基于AVR单片机                                                
应用软件:   ICCAVR                                                     
版    本:   Version 1.0                                                      
圆版时间:   2005-06-25
开发人员:   SEE
说    明:   若用于商业用途,请保留此段文字或注明代码来源
  深 圳 市 微 雪 电 子 有 限 公 司 保 留 所 有 的 版 权    
*********************************************************************/

/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
版本更新记录:

 

----------------------------------------------------------------------
入口参数说明:
//#define OUT_LCD_CS sbi(DDRD,0)
//#define SET_LCD_CS sbi(PORTD,0)
//#define CLR_LCD_CS cbi(PORTD,0)

----------------------------------------------------------------------
待定参数说明:

----------------------------------------------------------------------
对外变量说明:

----------------------------------------------------------------------
对外函数说明:

----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/

/*--------------------------------------------------------------------
接口定义:

LCD12864_ST7920 ATmega16
1.GND -------- GND
2.VCC -------- VCC
3.V0 -------- V0
4.RS(CS) -------- VCC
5.R/W(SID) -------- MOSI/PB5
6.E(SCLK) -------- SCK/PB7
7.D0 -------- NC
8.D1 -------- NC
9.D2 -------- NC
10.D3 -------- NC
11.D4 -------- NC
12.D5 -------- NC
13.D6 -------- NC
14.D7 -------- NC
15.PSB -------- GND
16.NC -------- NC
17.RST -------- NC
18.NC -------- NC
19.LED+ -------- VCC
20.LED- -------- GND

说明:
(1)使用ATmega16的硬件SPI操作LCD12864_ST7920
(2)PIN4/CS接VCC,其实也可接到特定的IO口,但外部程序需要指定
--------------------------------------------------------------------*/

#ifndef LCD12864_ST7920_H
#define LCD12864_ST7920_H

#include "D:\ICC_H\CmmIcc.h"

void SPI_init()
{
DDRB |= 0xB0;
SPCR = 0x50; //setup SPI
SPSR = 0x01; //setup SPI
SEI();
}

void lcd_wrByte(uint8 data)
{
SPDR = data;
while ((SPSR & 0x80) == 0);
}

void lcd_wrCmd(uint8 HC,uint8 LC)
{
lcd_wrByte(0xF8);
lcd_wrByte(HC); //传输高四位
lcd_wrByte(LC); //传输低四位
}

void lcd_wrDat(uint8 HD,uint8 LD)
{
lcd_wrByte(0xFA);
lcd_wrByte(HD); //传输高四位
lcd_wrByte(LD); //传输低四位
}

/*
x表示在第几行显示,y表示在第几列显示
*/
void lcd_set_xy(uint8 x,uint8 y)
{
uint8 adr;

switch(x)
{
case 1: adr = 0x7F + y;
break; //在第1行y列显示
case 2: adr = 0x8F + y;
break; //在第2行y列显示
case 3: adr = 0x87 + y;
break; //在第3行y列显示
case 4: adr = 0x97 + y;
break; //在第4行y列显示
default: ;
}
lcd_wrCmd(adr&0xF0,(adr&0x0F)<<4);
}

void lcd_putc(uint8 x,uint8 y,uint8 ch)
{
lcd_set_xy(x,y);
delay50us(20);
lcd_wrDat(ch&0xF0,(ch&0x0F)<<4);
}

void lcd_putd0(uint8 x,uint8 y,uint32 dat,uint8 length)
{
sint8 i;

speaData(dat,length);
lcd_set_xy(x,y);
delay50us(40);
for(i=length-1;i>=0;i--)
{
lcd_wrDat( (dataElem[i]+0x30)&0xF0 ,( (dataElem[i]+0x30)&0x0F )<<4 );
delay50us(40);
}
}

void lcd_putd(uint8 x,uint8 y,uint32 dat,uint8 length)
{
sint8 i;
sint8 effectLen;

if(dat>999999)
effectLen=7;
else if(dat>99999)
effectLen=6;
else if(dat>9999)
effectLen=5;
else if(dat>999)
effectLen=4;
else if(dat>99)
effectLen=3;
else if(dat>9)
effectLen=2;
else
effectLen=1;
speaData(dat,effectLen);

lcd_set_xy(x,y);
delay50us(40);
if(length>effectLen)
{
for(i=length-effectLen-1;i>=0;i--)
{
lcd_wrDat(' '&0xF0,(' '&0x0F)<<4);
delay50us(40);
}
}
for(i=effectLen-1;i>=0;i--)
{
lcd_wrDat( (dataElem[i]+0x30)&0xF0 ,( (dataElem[i]+0x30)&0x0F )<<4 );
delay50us(40);
}
}

void lcd_puts(uint8 x,uint8 y,uint8 *str)
{
lcd_set_xy(x,y);
delay50us(20);
while(*str)
{
lcd_wrDat((*(str))&0xF0,((*(str))&0x0F)<<4);
str++;
delay50us(20);
}
}

void lcd_puts_(uint8 x,uint8 y,uint8 *str,uint8 dlyMs)
{
lcd_set_xy(x,y);
delay50us(20);
while(*str)
{
lcd_wrDat((*(str))&0xF0,((*(str))&0x0F)<<4);
str++;
delay50ms(dlyMs);
}
}

void lcd_clr()
{
lcd_wrCmd(0x00,0x10); //显示右移
delay50us(200);
}

void lcd_init(void)
{
SPI_init();
//OUT_LCD_CS; //若LCD_CS
//SET_LCD_CS;
delay50ms(1);
lcd_wrCmd(0x30,0x30); //使用8位控制界面,使用基本指令集
//lcd_wrCmd(0x00,0xF0); //整体显示ON
lcd_wrCmd(0x00,0xC0); //整体显示ON
lcd_wrCmd(0x00,0x10); //清屏
//lcd_wrCmd(0x10,0x00); //光标
lcd_wrCmd(0x00,0x60);
//lcd_wrCmd(0x00,0x70); //显示右移
delay50ms(1); //不可省去!!!
}

#endif

 

 相关AVR资料说明

可作为如下AVR的参考资料: ATtiny13 ATtiny24 ATtiny44 ATtiny84 ATtiny2313 ATtiny26 ATmega48 ATmega88 ATmega168 ATmega8 ATmega16 ATmega32 ATmega64 ATmega128 ATmega162 ATmega169 ATmega169P ATmega8515 ATmega8535

 相关AVR型号资料

ATtiny13 ATtiny24 ATtiny44 ATtiny84 ATtiny26 ATtiny2313
ATmega48 ATmega88 ATmega168 ATmega8 ATmega16 ATmega32
ATmega64 ATmega128 ATmega162 ATmega169 ATmega8515 ATmega8535

LCD12864子程序

——