#include <reg52.h> //52系列单片机头文件
#include <intrins.h>
#include <stdlib.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
#define LCD_data P1 //数据口
uchar i;
sbit key1=P3^0;
sbit key2=P3^1;
sbit LCD_PSB=P3^4; //串行,并行选择接口
sbit LCD_CS=P3^5; //串行片选信号
sbit LCD_SID=P3^6; //串行数据输入
sbit LCD_SCLK=P3^7;
void lcd_sbyte(); //串行时钟
uchar code dis1[]={"物电创新基地"};
uchar code dis2[]={"姓名;刘冰冰"};
uchar code dis3[]={"202107044138"};
uchar code dis4[]={"xzxdbb"};
void keyscan(); //函数声明
//void delay_1ms(uint x);
void delayms(uint xms);
void lcd_sbyte();
void write_cmd(uchar cmd);
void write_dat(uchar dat);
void lcd_init(); //LCD初始化设定
void lcd_pos(uchar x,uchar y);
void main() //主函数
{
lcd_init(); //调用清屏函数
while(1)
keyscan();
//循环执行按键扫描函数
}
void keyscan() //按键循环函数
{
uchar i;
if(key1==0) //按键1开始,程序检测key1==0,执行下面的指令
{
delayms(10); //按键去抖延时
if(key1==0)
{
lcd_pos(0,0); //设置显示位置为第一行的第一个字符
i=0;
while(dis1[i]!='\0') //当查到空字符时退出循环
{
write_dat(dis1[i]); //显示字符
i++;
}
lcd_pos(1,0); //设置显示位置为第二行的第一个字符
i=0;
while(dis2[i]!='\0') //当查到空字符时退出循环
{
write_dat(dis2[i]); //显示字符
i++;
}
lcd_pos(2,0); //设置显示位置为第三行的第一个字符
i=0;
while(dis3[i]!='\0') //当查到空字符时退出循环
{
write_dat(dis3[i]); //显示字符
i++;
}
lcd_pos(3,0); //设置显示位置为第四行的第一个字符
i=0;
while(dis4[i]!='\0') //当查到空字符时退出循环
{
write_dat(dis4[i]); //显示字符
i++;
}
}
}
if(key2==0) //程序检测key2==0,执行下面的指令
{
delayms(10); //按键去抖延时
if(key2==0)
{
LCD_PSB=0; //串口方式
write_cmd(0x01); //清除LCD显示内容
}
}
}
void delayms(uint xms) //延时函数
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void lcd_sbyte(uchar by) //输出串行数据
{
uchar s;
for(s=0;s<8;s++)
{
LCD_SID=by&0x80; //将by的最高位取出来赋给SID
by=by<<1; //依次将by的每一位从高到低在SCLK的作用送给SID
LCD_SCLK=0; //输入数据
LCD_SCLK=1;
}
}
void write_cmd(uchar cmd) //写指令数据到LCD
{
LCD_CS=1;
lcd_sbyte(0Xf8); //发送指令
lcd_sbyte(cmd&0xf0); //将所发送字节的高四位取出,低四位补0
lcd_sbyte(cmd<<4); //将所发送的字节低四位移到高四位的位置上,原来的低四位自动补0
LCD_SCLK=0; //输入数据
LCD_SCLK=1;
LCD_CS=1;
delayms(100);
}
void write_dat(uchar dat) //写显示数据到LCD
{
LCD_CS=1;
lcd_sbyte(0Xfa); //发送数据
lcd_sbyte(dat&0xf0); //将所发送字节的高四位取出,低四位补0
lcd_sbyte(dat<<4); //将所发送的字节低四位移到高四位的位置上,原来的低四位自动补0
LCD_SCLK=0; //输入数据
LCD_SCLK=1;
LCD_CS=0;
delayms(100);
}
void lcd_pos(uchar x,uchar y) //设定显示位置
{
uchar pos;
switch(x)
{ //x的范围为0-3,y的范围为0-7
case 0: x=0x80;break;
case 1: x=0x90;break;
case 2: x=0x88;break;
case 3: x=0x98;break;
default: break;
}
pos=x+y;
write_cmd(pos); //显示地址
}
//void lcd_init() //LCD初始化设定
//{
// LCD_PSB=0; //串口方式
// write_cmd(0x30); //基本指令操作
// delayms(5);
// write_cmd(0x0c); //显示开,关光标
// delayms(5);
// write_cmd(0x01); //清除LCD显示内容
// delayms(5);
//}
void lcd_init()
{
delayms(5);
write_cmd(0x30); //基本指令操作
write_cmd(0x02);
write_cmd(0x06);
write_cmd(0x0c);
write_cmd(0x01);
write_cmd(0x80);
}
|