/*********************************************************************
目 的: 建立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
上一篇:AVR调试和下载官方平台的建立
下一篇:AVR PS/2 硬件中断控制程序
推荐阅读最新更新时间:2024-11-13 14:09
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LT1302CN8 的参考设计
- 固定频率单线圈发射器参考设计
- EVAL-ADM2485EB5Z,用于 ADM2485 半双工、隔离式 RS-485 收发器和变压器驱动器的评估板
- RT8015B 3A、2MHz、同步降压转换器的典型应用
- 适用于DFN8-EP封装的双运放系列裸PCB评估板
- LT1956EGN 5V 降压转换器的典型应用电路
- DER-754 -29 W 高功率因数隔离反激式 LED 驱动器,采用 LYTSwitch-6,具有 3 合 1、DALI 调光和 CCT 切换功能
- miniForce-motherboard-v1.0
- DER-188 - 20W空载功耗极低的电源
- LTC2611CDD-1 14 位轨至轨 DAC 在 10 引脚 DFN 中的典型应用
- ADI有奖下载活动之20:基于NDIR和PID的ADI气体探测器解决方案和新产品
- 报名有礼| Arm Tech Symposia 年度技术大会报名开启!
- 下载有礼:2017年泰克亚太专家大讲堂第二期: 100G/200G/400G通讯标准发展趋势及解决方案
- 有奖看视频|2022台北国际电脑展——美光主题演讲精选
- TI 嵌入式处理器最新产品发布会 全程在线直播 4月16日精彩为您呈现!预报名、看直播、享好礼
- 有奖直播:全方位详解TI MSP Academy 教程
- 【EEWORLD第二十二届社区明星人物】畅想十二月明星人物揭晓!
- 想要更直观的了解5G?观看罗德与施瓦茨主题演讲,填问卷赢好礼!
- 村田感恩季:这份电子元器件使用攻略已备好,速来闯关!
- 带上速度与激情,晒出你的TI WEBENCH 得意之作!