搜档网
当前位置:搜档网 › 1602液晶屏一个按键控制光标位移-51单片机程序

1602液晶屏一个按键控制光标位移-51单片机程序

#include

#define CMDREAD 0x15
#define LCD_DATA P0

sbit LCD_RS = P1^2; // 0 = Cmd, 1 = Data
sbit LCD_RW = P1^6; // 0 = Write, 1 = Read
sbit LCD_E = P1^3; // 1 = ReadEnable, 1->0 = WriteEnable
sbit CS = P1^0;
sbit CLK = P1^7;
sbit DATA = P1^6;
sbit KEY = P3^2;
unsigned char KeyValue;
unsigned char code Logo[] = {"S M I C"};
unsigned char code Time[] = {"00:00:00 AM"};

void Delay10us(unsigned char count);
void Delay1ms(unsigned int count);
void WriteLcdCmdNoBusy(unsigned char cmd);
void WriteLcdCmd(unsigned char cmd);
void WriteLcdData(unsigned char byte);
void LCDInitial(void);
unsigned char Read7279(void);
unsigned char ReceiveByte(void);
void SendByte(unsigned char byte);

main()
{
unsigned char i,j=0;
LCDInitial(); // 初始化
WriteLcdCmd(0x84); // 第1行
for (i=0; Logo[i] != '\0'; i++)
{
WriteLcdData(Logo[i]); // S M I C
}

WriteLcdCmd(0xc2); // 第2行
i = 0;
while (Time[i] != '\0')
{
WriteLcdData(Time[i]); // 时间
i++;
}

while (1)
{
if (!KEY) // 有键按下
{
KeyValue = Read7279(); // 读键值
if(KeyValue==0)
{
WriteLcdCmd(0x0f); // 设置闪烁
WriteLcdCmd(0xc2 + j); // AC指定位移位
j++;
if(j>=8)
{j=0;}
Delay1ms(1000); // 维持1s
}
while (!KEY);
}
}
}

// LCD初始化
void LCDInitial(void)
{
Delay1ms(15);
WriteLcdCmdNoBusy(0x38);
Delay1ms(5);
WriteLcdCmdNoBusy(0x38);
Delay1ms(5);
WriteLcdCmd(0x38); // 5*8点阵,8位数据
WriteLcdCmd(0x38);
WriteLcdCmd(0x08);
WriteLcdCmd(0x01); // 清屏
WriteLcdCmd(0x06); // AC自动加1,不移位
WriteLcdCmd(0x0c); // 开显示,光标不显示,不闪烁
}

// 延时count * 10us
void Delay10us(unsigned char count)
{
unsigned char i;
while(count--)
{
for (i =0 ; i<4 ; i++);
}
}

// 延时count ms
void Delay1ms(unsigned int count)
{
unsigned char i;
while(count--)
{
for (i =0 ; i<120 ; i++);
}
}

// 写LCD命令,不读取Busy位
void WriteLcdCmdNoBusy(unsigned char cmd)
{
LCD_RS = 0; // Cmd
LCD_RW = 0; // Write
LCD_E = 1;
LCD_DATA = cmd;// Data
LCD_E = 0; // 下降沿
LCD_DATA = 0xff;
}

// 写LCD命令
void WriteLcdCmd(unsigned char cmd)
{
unsigned char temp;
WriteLcdCmdNoBusy(cmd);
LCD_RW = 1; // Read
do
{
LCD_E = 1;
Delay1ms(1);
temp = LCD_DATA;
LCD_E = 0;
}while (temp & 0x80);
}

// 写LCD数据
void WriteLcdData(unsigned char byte)
{
unsigned char temp;
LCD_RS = 1; // Data
LCD_RW = 0; // Write
LCD_E = 1;
LCD_DATA = byte;
LCD_E = 0;
LCD_DATA = 0xff;

LCD_RS = 0;
LCD_RW = 1; // Read
do
{
LCD_E = 1;
Delay1ms(1);
temp = LCD_DATA;
LCD_E = 0;
}while (temp & 0x80);
}

// 从7279读取键值, 返回无符号字节的键值
unsigned char Read7279(void)
{
unsigned char byte;
CS = 0;
Delay10us(5);
SendByte(CMDREAD);
byte = ReceiveByte();
CS = 1;
return (byte);
}

// 按位读取8位数据, 返回值为字节数据
unsigned char ReceiveByte(void)
{
unsigned char i, byte = 0;
DATA = 1; // 设为输入口
for (i=0; i<8; i++)
{
CLK = 1;
Delay10us(1);
byte = byte << 1;
if (DATA)
{
byte = byte | 0x01;
}
CLK = 0;
Delay10us(1);
}
DATA = 0; // 设为输出口
return (byte);
}

// byte字节按位送出
void SendByte(unsigned char byte)
{
unsigned char i;
CLK = 0;
for (i=0; i<8; i++)
{
if (byte & 0x80) // byte最高位为1
{
DATA = 1; // 输出1
}
else
{
DATA = 0; // 输出0
}
CLK = 1; // CLK上升沿
Delay10us(1);
CLK = 0;
Delay10us(1);
byte = byte << 1; // 输出数据左移,移走最高位
}
DATA = 0;
}



相关主题