?? 1602drive.c
字號:
///////////////////////1602驅動函數//////////////////////////////////////
//////////////////////////////////////////////////////////////
// 函數原型:print(ucahr *string);
// 輸出字符串,超過16個字符時自動移入第二行
// printone(uchar x,uchar y,ucahr Data);
// 在指定的位置(x,y)輸出一個字符
// lcm_init(void);
// 要調用本函數時,必須在main()初始化階段調用 lcm_init() 初始化 1602
//////////////////////////////////////////////////////////////////////////
#include "myreg51.h"
#define E P3_5
#define RW P3_6
#define RS P3_7
#define Data_port P1
void delayms(uint time) //延時為5ms的整數倍
{
uint _5ms=300;
while(time--)
{
while(_5ms--);
}
}
void checkbusy(void) //讀狀態
{ //每次寫指令,讀寫數據之前均需檢測忙信號
Data_port=0xff;
RS=0;
RW=1;
E=0;
E=0;
E=1;
while(Data_port&0x80);
}
void Writedata(uchar d) //寫數據
{
checkbusy();
Data_port=d;
RS=1;
RW=0;
E=0;
E=0;
E=1;
}
void Writecmd(uchar cmd) //寫命令
{
checkbusy();
Data_port=cmd;
RS=0;
RW=0;
E=0;
E=0;
E=1;
}
void lcm_init(void)
{
delayms(3);
Data_port=0;
Writecmd(0x38); //必要的三次命令
delayms(1);
Writecmd(0x38);
delayms(1);
Writecmd(0x38);
delayms(1);
Writecmd(0x38);
Writecmd(0x08);
Writecmd(0x01);
Writecmd(0x06);
Writecmd(0x0c);
Writecmd(0x01);
delayms(1);
}
void printone(uchar x,uchar y,uchar d) //x的范圍為0-15
{
uchar a;
y&=0x01;
x&=0x0F;
if(y)x=x|0x40; //關鍵部分!!!
a=x|0x80;
Writecmd(a);
Writedata(d);
}
void print(uchar *string)
{
uchar i=0,y=0,j=0;
Writecmd(0x01);
for(;string[i]!='\0'&&i<=15;i++)
{
printone(i,y,string[i]);
}
j=i;
if(j>=15)
{
i=0;
for(;string[j+i]!='\0'&&i<=15;i++)
{
printone(i,1,string[i+j]);
}
delayms(5);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -