×
单片机 > 单片机程序设计 > 详情

LCD12864子程序

发布时间:2024-05-19 发布时间:
|

/*********************************************************************

目 的: 建立LCD12864操作库

目标系统: 基于AVR单片机

应用软件: ICCAVR

版 本: Version 1.0

*********************************************************************/


/*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_HCmmIcc.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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会