?? lcd.c
字號:
/**********************************
標題:12864液晶串行通訊常用子函數
文件名:lcd.c
編譯:WinAVR-20080411
硬件環境:
時鐘:外部6MHz
***********************************/
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include "spi.c"
#define lcd_cs PB0 //LCD片選可選PB0-PB4
void lcd_init(void);
void lcd_wri(uint8_t data_i);//寫指令子函數,參數為欲寫數據
void lcd_wrd(uint8_t data_d);//寫數據子函數,參數為欲寫數據
void lcd_write(uint8_t lcd_data1,uint8_t lcd_data2,uint8_t lcd_data3);
void lcd_dis(uint8_t lcd_addr,uint8_t dis_data);//顯示子程序,第一參數為顯示地址(0x80~0x9f)
//地址會自加連續顯示時可指定一范圍外地址,第二
//參數為顯示數據
void lcd_clear(void);//清屏
uint8_t lcd_tmp1,lcd_tmp2,lcd_tmp3;
void lcd_init(void)
{
_delay_ms(40);//延時40ms
lcd_wri(0x30);//功能設置---8BIT控制界面,基本指令集
_delay_ms(1);
lcd_wri(0x0c);//顯示打開,光標關,反白顯示關
_delay_ms(1);
lcd_wri(0x01);//清除屏幕顯示,將DDRAM的地址計數器歸零
_delay_ms(10);
lcd_wri(0x06);//DDRAM的地址計數器(AC)加1
}
void lcd_wri(uint8_t data_i)
{
lcd_tmp1=0xf8; //串行通訊第一字節為1 1 1 1 1 1 Rw Rs 0
//寫指令RS=RW=0
lcd_tmp2=data_i&0xf0;//第二字節為D7 D6 D5 D4 0 0 0 0
lcd_tmp3=data_i<<4; //第三字節為D3 D2 D1 D0 0 0 0 0
lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);
}
void lcd_wrd(uint8_t data_d)
{
lcd_tmp1=0xfa; //串行通訊第一字節為1 1 1 1 1 1 Rw Rs 0
//寫數據RS=1 RW=0
lcd_tmp2=data_d&0xf0; //第二字節為D7 D6 D5 D4 0 0 0 0
lcd_tmp3=data_d<<4; //第三字節為D3 D2 D1 D0 0 0 0 0
lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);
}
void lcd_clear(void)
{
lcd_wri(1);
}
void lcd_dis(uint8_t lcd_addr,uint8_t dis_data)
{
if((lcd_addr>=0x80)&&(lcd_addr<=0x9f)) lcd_wri(lcd_addr);
lcd_wrd(dis_data);
}
void lcd_write(uint8_t lcd_data1,uint8_t lcd_data2,uint8_t lcd_data3)
{
PORTB|=(1<<lcd_cs); //LCD選通
SPCR|=(1<<SPE); //SPI使能
SPDR=lcd_data1; //SPI傳送第一字節
while(!(SPSR&(1<<SPIF)));//等待傳送完成
SPDR=lcd_data2; //SPI傳送第一字節
while(!(SPSR&(1<<SPIF)));
SPDR=lcd_data3; //SPI傳送第一字節
while(!(SPSR&(1<<SPIF)));
SPCR&=(~(1<<SPE)); //SPI關閉
PORTB&=(~(1<<lcd_cs)); //LCD關閉
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -