?? lcd.c
字號:
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include "font6x8.h"
#include "font8x16.h"
#include "my_type.h"
/****************************************
* output a byte to lcd
***************************************/
void send_byte (u8 temp)
{
u8 i;
for (i=0;i<8;i++)
{
CLR_CLK();
if (temp & 0x80) SET_DATA();
else CLR_DATA();
temp <<= 1;
SET_CLK();
}
}
/****************************************
send one command to lcd
*****************************************/
void lcd_send_command (u8 command)
{
CLR_CS();
CLR_RS();
send_byte (command);
SET_CS();
}
/****************************************
send one data to lcd
*****************************************/
void lcd_send_data (u8 data)
{
CLR_CS();
SET_RS();
send_byte (data);
SET_CS();
}
/****************************************
* set page value
*
*
*
* page : 0 ~ 16 ( now this lcd only have 12 page)
**************************************/
void lcd_set_page (u8 page)
{
lcd_send_command (0xb0 | page);
}
/****************************************
* set column value
*
*
*
* column : 0 ~ 0x7f( total 128 column)
**************************************/
void lcd_set_column (u8 column)
{
lcd_send_command (0x10 | (column>>4));
lcd_send_command (0x0f & column);
}
void lcd_init (void)
{
LCD_IO_INIT();
CLR_RST();
_delay_ms (5);
SET_RST();
lcd_send_command (0x48); //set display duty
lcd_send_command (0x60);
lcd_send_command (0xa1); //set ADC
lcd_send_command (0xc8); //set SHL
lcd_send_command (0x44); //set COM0
lcd_send_command (0x10);
lcd_send_command (0x40); //set start line
lcd_send_command (0x00);
lcd_send_command (0xab); //start oscillator
lcd_send_command (0x66); //DC-DC boost 5 times
lcd_send_command (0x27); //set regulator resistor
lcd_send_command (0x81); //set EV
lcd_send_command (0x20);
lcd_send_command (0x54); //set LCD bias resistor
lcd_send_command (0x94); //set FRC PWM
/**********************************************/
lcd_send_command (0x88); //set white gray
lcd_send_command (0x00);
lcd_send_command (0x89); lcd_send_command (0x00);
lcd_send_command (0x8a); //set light gray
lcd_send_command (0x09);
lcd_send_command (0x8b);
lcd_send_command (0x00);
lcd_send_command (0x8C); //set dark gray
lcd_send_command (0x99);
lcd_send_command (0x8d);
lcd_send_command (0x00);
lcd_send_command (0x8e); //set black gray
lcd_send_command (0x99);
lcd_send_command (0x8f);
lcd_send_command (0x09);
/**********************************************/
lcd_send_command (0x2c); //power control, open VC
_delay_ms (2);
lcd_send_command (0x2e); //open VR
_delay_ms (2);
lcd_send_command (0x2f); //open VF
_delay_ms (2);
lcd_send_command (0xaf); //display ON
_delay_ms (2);
lcd_clr_all();
}
void lcd_set_xy (u8 page,u8 column)
{
lcd_set_page(page);
lcd_set_column(column);
}
void lcd_put_char (u8 asc)
{
u8 i;
u8 buf[6];
asc -= 0x20;
memcpy_P (buf,font6x8[asc],6);
for (i=0;i<6;i++)
{
lcd_send_data (buf[i]);
lcd_send_data (buf[i]);
}
}
/******************************************************************************
* Function: void lcd_put_str (u8 page,u8 column,u8 *str)
*
* PreCondition: None
*
* Input: u8 page: page number
* u8 column: column number
* u8 *str: string point
* Output: None
*
* Side Effects: None
*
* Overview: This routine put 6*8 dot character on lcd.
*
* Note: None.
*****************************************************************************/
void lcd_put_str (u8 page,u8 column,u8 *str)
{
lcd_set_xy(page,column);
while ( * str )
{
lcd_put_char (* str++);
}
}
/***************************************************
****************************************************/
u8 page_temp;
u8 column_temp;
void lcd_put_big_char (u8 asc)
{
u8 i;
u8 buf[16];
asc -= 0x20;
memcpy_P (buf,font8x16[asc],16);
for (i=0;i<8;i++)
{
lcd_send_data (buf[i]);
lcd_send_data (buf[i]);
}
lcd_set_page (page_temp + 1);
lcd_set_column (column_temp);
for (i=8;i<16;i++)
{
lcd_send_data (buf[i]);
lcd_send_data (buf[i]);
}
lcd_set_page (page_temp);
column_temp += 8;
}
/******************************************************************************
* Function: void lcd_put_big_str (u8 page,u8 column,u8 *str)
*
* PreCondition: None
*
* Input: u8 page: page number
* u8 column: column number
* u8 *str: string point
* Output: None
*
* Side Effects: None
*
* Overview: This routine put 16*8 dot character on lcd.
*
* Note: It use the follow page.
*****************************************************************************/
void lcd_put_big_str (u8 page,u8 column,u8 *str)
{
lcd_set_xy(page,column);
page_temp = page;
column_temp = column;
while ( * str )
{
lcd_put_big_char (* str++);
}
}
/*************************************
* clear one page( 8 row).
************************************/
void lcd_clr_page(u8 page)
{
u8 i = 0;
lcd_set_page(page);
/*
* write 0 to this page
* write 256 times.( 128 dot/row, two data/dot)
*
*/
while (-- i)
lcd_send_data(0);
lcd_send_data(0);
}
/************************************
* clear all screen.
***********************************/
void lcd_clr_all(void)
{
u8 i;
for (i=0;i<12;i++)
lcd_clr_page(i);
}
/********************************************************************
below's fuction is for test.
********************************************************************/
void font_test (void)
{
lcd_put_str (0,0,"how are you ?");
lcd_put_str (3,0,"how are you ?");
lcd_put_big_str (7,0,"how are you ?");
lcd_put_big_str (10,0,"how are you ?");
}
void gray_test (void)
{
u8 i,j,k,l,m = 0xff,n = 0xff;
/*
lcd_send_command (0x10);
lcd_send_command (0x00);
lcd_set_column (0);
for (k=0;k<6;k++)
{
//lcd_send_command (0xb6 + k);
lcd_set_page (k);
for (j=0;j<2;j++)
{
m = ~m;
for (i=0;i<2;i++)
{
n = ~n;
for (l=0;l<32;l++)
{
lcd_send_data (m);
lcd_send_data (n);
}
}
}
}
*/
for ( j=0;j<3;j++)
{
lcd_set_page(4*j);
lcd_set_column(0);
for (i= 0;i<=128;i++)
{
lcd_send_data (0xff);
lcd_send_data (0xff);
}
lcd_set_page(4*j + 1);
lcd_set_column(0);
for (i= 0;i<=128;i++)
{
lcd_send_data (0xff);
lcd_send_data (0);
}
lcd_set_page(4*j + 2);
lcd_set_column(0);
for (i= 0;i<=128;i++)
{
lcd_send_data (0);
lcd_send_data (0xff);
}
lcd_set_page(4*j + 3);
lcd_set_column(0);
for (i= 0;i<=128;i++)
{
lcd_send_data (0);
lcd_send_data (0);
}
}
/*
lcd_set_page(2);
lcd_set_column(0);
for (i= 0;i<255;i++)
lcd_send_data (0xff);
lcd_send_data (0);
lcd_set_page(3);
lcd_set_column(0);
for (i= 0;i<255;i++)
lcd_send_data (0);
lcd_send_data (0);
lcd_set_page(4);
lcd_set_column(0);
for (i= 0;i<255;i++)
lcd_send_data (0xff);
lcd_send_data (0);
lcd_set_page(5 );
lcd_set_column(0);
for (i= 0;i<255;i++)
lcd_send_data (0); lcd_send_data (0);
*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -