//1602.h
#include
//數(shù)據(jù)類型定義
typedef unsigned char uchar;
typedef unsigned int uint;
//1602指令定義
//屏幕初始化
#define SCREEN_INIT 0x38 //屏幕設置:16*2行,5*7點陣,8位數(shù)據(jù)接口
//光標及屏幕顯示設置
#define SHOW_SCREEN 0x0C //屏幕顯示
#define HIDE_SCREEN 0x08 //屏幕不顯示
#define SHOW_CURSOR 0x02 //顯示光標
#define FLASH_CURSOR 0x01 //光標閃爍
//地址指針及滾動設置
#define DPTR_INC 0x06 //讀/寫一個字節(jié)地址指針+1,光標+1
#define DPTR_DEC 0x04 //讀/寫一個字節(jié)地址指針-1,光標-1
#define SCREEN_SCR 0x01 //寫一個字符,整屏左移/右移
//ADDR設置
#define ADDR_LINE1 0x80 //第一行
#define ADDR_LINE2 0xC0 //第二行
#define LINE1_END 0x10
#define LINE2_END 0x50
//忙碌狀態(tài)
#define BUSY 0x80
//清屏
#define CLR_SCR 0x01 //清屏
//DPTR清零
#define CLR_DPTR 0x02 //數(shù)據(jù)指針清零
復制代碼
復制代碼
//1602.c
#include
#include
#include "1602.h"
//女孩不哭
//2012-10-25
//ts=sts=sw=4
//以下是端口定義,自行修改
sbit RS = P0^0; //數(shù)據(jù)/指令選擇
sbit RW = P0^1; //讀/寫控制
sbit E = P0^2; //使能
#define DATA P2 //數(shù)據(jù)端口 P[0~7] -> DATA[0~7]
/*
函數(shù):微秒延時
參數(shù):
us[uchar]:微秒
返回:(無)
*/
void delay_us(uchar us)
{
for(; us>0; us--)
_nop_();
}
/*
函數(shù):10毫秒延時
參數(shù):
ms10[uint]:10毫秒
返回:(無)
*/
void delay_10ms(uint ms10)
{
uchar x,y,z;
while(ms10--){
for(x=5; x>0; x--);
for(y=4; y>0; y--);
for(z=248; z>0; z--);
}
}
/*
函數(shù):讀取1602狀態(tài)
參數(shù):(無)
返回:(無)
說明:最高位為忙碌狀態(tài)位,1代表忙碌
*/
uchar read_state(void)
{
DATA = 0xff;
RW = 1;
RS = 0;
E = 1;
return DATA;
}
/*
函數(shù):執(zhí)行一條命令
參數(shù):
cmd[uchar]:命令
返回:(無)
*/
void do_cmd(uchar cmd)
{
while(read_state()&BUSY)
_nop_();
RS = 0;
RW = 0;
DATA = cmd;
E = 1;
delay_us(50);
E = 0;
delay_us(50);
}
/*
函數(shù):1602初始化
參數(shù):(無)
返回:(無)
*/
void init_lcd(void)
{
do_cmd(CLR_SCR);//清屏
do_cmd(SCREEN_INIT);//顯示模式設置
do_cmd(SHOW_SCREEN|SHOW_CURSOR/*|FLASH_CURSOR*/);
do_cmd(DPTR_INC);
}
/*
函數(shù):寫一個字節(jié)到顯存
參數(shù):
ch[uchar]:顯示字符ASCII碼
返回:(無)
*/
void write(uchar ch)
{
uchar addr;
while(read_state()&BUSY)
;
//換行處理
addr = read_state()&~BUSY;
if(addr == LINE1_END)
do_cmd(ADDR_LINE2);
else if(addr == LINE2_END)
do_cmd(ADDR_LINE1);
RW = 0;
RS = 1;
DATA = ch;
E = 1;
delay_us(50);
E = 0;
delay_us(50);
}
void write_str(uchar line, uchar pos, uchar* str)
{
uchar addr;
uchar* ptr;
if(line!=1 && line!=2)
return;//只能是第1,2行
if(pos>16)
return;//只能是第 1~16 個字符
//pos=0表示從當前位置開始寫,忽略行
if(pos){
addr = (line==1?ADDR_LINE1:ADDR_LINE2)+pos-1;
do_cmd(addr);
}
for(ptr=str; *ptr; ptr++){
write(*ptr);
delay_10ms(80);
}
}
#if 0
void main(void)
{
uchar str[16] = {0};
uchar x;
delay_10ms(10);
init_lcd();
write_str(1,1,"012345671");
delay_10ms(200);
write_str(2,1,"AbCdEfGhIjK");
delay_10ms(200);
write_str(1,1,"Nv Hai Bu Ku!");
delay_10ms(200);
do_cmd(CLR_SCR);
do_cmd(SHOW_SCREEN|FLASH_CURSOR);
write_str(1,1,"this is a very very very long string!");
for(x=0; x<4; x++){
do_cmd(HIDE_SCREEN);
delay_10ms(300);
do_cmd(SHOW_SCREEN);
delay_10ms(300);
}
do_cmd(SHOW_SCREEN);
delay_10ms(200);
do_cmd(CLR_SCR);
write_str(1,1,"Screen will now Scroll....");
delay_10ms(300);
do_cmd(DPTR_INC|SCREEN_SCR);
write_str(1,0,"Screen Scrolling");
do_cmd(DPTR_DEC|SCREEN_SCR);
write_str(1,0,"Screen Scrolling");
do_cmd(DPTR_INC);
delay_10ms(200);
do_cmd(CLR_SCR);
for(x=0x20; x<0xdf; x++){
write(x);
delay_10ms(80);
}
delay_10ms(200);
do_cmd(CLR_SCR);
write_str(2,1," ... what??");
for(;;){
}
}
#endif