液晶顯示器LCD12864驅(qū)動(dòng)程序
掃描二維碼
隨時(shí)隨地手機(jī)看文章
#include
#include "lcd12864.h"
#include "typedef.h"
#define cyCSBIT0//P2.0,片選信號(hào)
#define cySIDBIT1//P2.1,串行數(shù)據(jù)
#define cyCLKBIT2//P2.2,同步時(shí)鐘
#define cyPORTP2OUT
#define cyDDRP2DIR
void Write_8bits(u8 W_bits)
{
u8 i;
cyDDR |= cyCLK + cySID;//設(shè)置輸出方向
for(i = 0; i < 8; i++)
{
if(( W_bits << i )&0x80)
{
cyPORT |= cySID;
}
else
{
cyPORT &= ~cySID;
}
delay_ms(1);
cyPORT |= cyCLK;
delay_ms(1);
delay_ms(1);
cyPORT &= ~cyCLK;
}
}
void w_1byte(u8 RS, u8 w_data)
{
u8 H_Data,L_Data;
u8 tmp_Data = 0xf8;
cyDDR |= cyCS;//設(shè)置CS口為輸出
if(RS == 0) tmp_Data &= ~0x02;
elsetmp_Data |= 0x02;
H_Data = w_data;//高位數(shù)據(jù)
H_Data &= 0xf0;
L_Data = w_data;//低位數(shù)據(jù)
L_Data &= 0x0f;
L_Data <<= 4;
cyPORT |= cyCS;
Write_8bits(tmp_Data);
Write_8bits(H_Data);
Write_8bits(L_Data);
cyPORT &= ~cyCS;
}
void init_Lcd(void)
{
cyDDR |= cyCLK + cySID + cyCS;//相應(yīng)的位端口設(shè)置為輸出
delay_ms(10);//延時(shí)等待液晶完成復(fù)位
w_1byte(0,0x30);
delay_ms(1);
w_1byte(0,0x02);
delay_ms(5);
w_1byte(0,0x0c);
delay_ms(1);
w_1byte(0,0x01);
delay_ms(5);
w_1byte(0,0x06);
delay_ms(1);
}
//清屏
void clear_lcd(void)
{
delay_ms(1);
w_1byte(0,0x01);
delay_ms(5);
}
void lcd_pos(u8 x,u8 y)//定位
{
u8 pos;
switch(x)
{
case 1:pos=0x80;break;
case 2:pos=0x90;break;
case 3:pos=0x88;break;
case 4:pos=0x98;break;
default:pos=0x80;
}
pos += y;
w_1byte(0,pos);
}
//顯示漢字
void Disp_HZ(const u8 * pt,u8 num)
{
u8 i;
for(i = 0;i < num*2;i++)
{
w_1byte(1,*(pt++));
}
}
//顯示字符
void Disp_Ch(const u8 ch)
{
w_1byte(1, ch);
}
//漢字和字符混合顯示
void disp_lcd_str(u8 x, u8 y, const u8 *str, u8 len)
{
u8 i;
lcd_pos(x, y);
for(i = 0;i < len && *str; )
{
if(*(str) >= 0x80)
{
w_1byte(1,*(str++));
w_1byte(1,*(str++));
i++;
i++;
}
else
{
w_1byte(1,*(str++));
i++;
}
}
}