?? lcd1602.c
字號:
/*1602B驅(qū)動庫函數(shù)
在主程序中加入: #include<stdio.h>
語句:
static int uart_putchar(unsigned char c,FILE *stream) ;
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);
即可使用printf()實現(xiàn)標準格式輸出
Redstone編寫-2005.11.8
翟寧改寫-2008-07-06
*/
#include <avr/io.h>
#include "lcd1602.h"
void Delay10uS(void)
{
unsigned char i;
for(i=80;i>0;i--)
{
asm("nop");
}
}
void Delay1mS(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
{
for(j=199;j>0;j--)
{
asm("nop");
}
}
}
void DelayMS(unsigned int time)
{
unsigned char i,j;
for(;time>0;time--)
{
for(i=20;i>0;i--)
{
for(j=199;j>0;j--)
{
asm("nop");
}
}
}
}
/********************************************************************
函 數(shù) 名: Lcd_Init
功能描述: 液晶初始化函數(shù)
函數(shù)說明: 液晶被初始化為8位數(shù)據(jù)端口,2行顯示,5*7點陣
調(diào)用函數(shù): DelayMS,LCD_write_char
全局變量: 無
輸 入: 無
返 回: 無
**********************************************************************/
void LCD_Init(void)
{
LCD_DATA_DDR=0xff;//設(shè)置液晶數(shù)據(jù)口為輸出
LCD_RS_DDR |= _BV(LCD_RS_PIN); //RS引腳設(shè)為輸出
LCD_RW_DDR |= _BV(LCD_RW_PIN); //RW引腳設(shè)為輸出
LCD_EN_DDR |= _BV(LCD_EN_PIN); //EN引腳設(shè)為輸出
unsigned char i; // 用于3次設(shè)置顯示模式
DelayMS(4); // 等待LCD進入工作狀態(tài)
for (i=0; i<3; i++)
{
// 3次設(shè)置顯示模式,不檢測忙信號
LCD_write_char(LCD_FUNCTION_SET3,0);//8位數(shù)據(jù)端口,2行顯示,5*7點陣
Delay1mS();
}
// 設(shè)置顯示模式,開始要求每次檢測忙信號
LCD_write_char(LCD_FUNCTION_SET3,0); // 8位數(shù)據(jù)端口,2行顯示,5*7點陣
DelayMS(1);
LCD_write_char(LCD_DISPLAY_ON,0);// 關(guān)閉顯示
DelayMS(1);
LCD_write_char(LCD_CLEAR_DISPLAY,0);// 清屏
DelayMS(1);
LCD_write_char(LCE_MODE_SET3,0);// 光標右移一格,AC值加1,字符全部不動
DelayMS(1);
LCD_write_char(LCD_CURSOR_SET3,0);// 光標會出現(xiàn)在地址計數(shù)器所指的位置,光標不出現(xiàn)
DelayMS(1);
}
/********************************************************************
函 數(shù) 名: LCD_set_xy
功能描述: 設(shè)置顯示的位置
函數(shù)說明: 無
調(diào)用函數(shù): LCD_write_char
全局變量: 無
輸 入: x,y(設(shè)置顯示位置坐標)
返 回: 無
**********************************************************************/
/*void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
LCD_write_char( address, 0 );
}*/
/********************************************************************
函 數(shù) 名: LCD_write_char
功能描述: 寫入LCD命令或數(shù)據(jù)函數(shù),時序參照LCD1602的Datasheet
函數(shù)說明: 當命令變量(LCD_Command)為0時寫入數(shù)據(jù),否則寫入命令
調(diào)用函數(shù): 無
全局變量: 無
輸 入: LCD_Command(欲寫入的命令),LCD_Data(欲寫入的數(shù)據(jù))
返 回: 無
**********************************************************************/
void LCD_write_char(unsigned char LCD_Command,unsigned char LCD_Data)
{
LCD_DATA_DDR=0xff;//設(shè)置液晶數(shù)據(jù)口為輸出
/*if (busy) // 是否判忙
{
ReadStatusLcd();
}*/
LCD_EN_LOW();
if(LCD_Command==0)
{
LCD_RS_HIGH();
LCD_RW_LOW();
Delay10uS();
LCD_EN_HIGH();
Delay10uS();
LCD_DATA_PORT=LCD_Data;//寫入數(shù)據(jù)
Delay10uS();
LCD_EN_LOW();
Delay10uS();
LCD_RW_HIGH();
Delay10uS();
}
else
{
LCD_RS_LOW();
LCD_RW_LOW();
Delay10uS();
LCD_EN_HIGH();
Delay10uS();
LCD_DATA_PORT=LCD_Command;//寫入命令
Delay10uS();
LCD_EN_LOW();
Delay10uS();
LCD_RW_HIGH();
Delay10uS();
}
}
/********************************************************************
函 數(shù) 名: DisplayOneChar
功能描述: LCD1602顯示一個字節(jié)函數(shù)
函數(shù)說明: 無
調(diào)用函數(shù): 無
全局變量: 無
輸 入: XStart(顯示位置X),YStart(顯示位置Y),DData(顯示的內(nèi)容)
返 回: 無
**********************************************************************/
void DisplayOneChar(unsigned char XStart, unsigned char YStart, unsigned char DData)
{
// 限制x不能大于16,y不能大于1
YStart &= 0x01; // Y的變化范圍0 ~ 1
XStart &= 0x0f; // X的變化范圍0 ~ 16
if (YStart != 0) // 若Y=1,顯示第二行
{
// 當要顯示第2行時地址碼+40h
XStart |= 0x40;
}
// 指令碼為地址+0x80
XStart |= DD_RAM;
LCD_write_char(XStart,0);// 不檢測忙信號,發(fā)送地址碼
DelayMS(1);
LCD_write_char(0,DData);
DelayMS(1);
}
/********************************************************************
函 數(shù) 名: DisplayListChar
功能描述: LCD1602顯示字符串函數(shù)
函數(shù)說明: 無
調(diào)用函數(shù): 無
全局變量: 無
輸 入: XStart(顯示位置X),YStart(顯示位置Y),pData(顯示字符串指針)
返 回: 無
**********************************************************************/
void DisplayListChar(unsigned char XStart, unsigned char YStart,char *pData)
{
unsigned char ListLength = 0; // 字符串長度
// 限制x不能大于16,y不能大于1
YStart &= 0x01;
XStart &= 0x0f;
// XStart坐標應小于16并且若到達字串尾則退出
while (XStart <= 0x0f)
{
if (pData[ListLength] == '\0')
{
return;
}
// 顯示單個字符
DisplayOneChar(XStart, YStart, pData[ListLength]);
ListLength++;
XStart++;
}
DDRB = 0x00;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -