#include <reg52.h> //52系列單片機頭文件
#include <intrins.h>
#include <stdlib.h>
#define uchar unsigned char //宏定義
#define uint unsigned int
#define LCD_data P1 //數(shù)據(jù)口
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; //串行數(shù)據(jù)輸入
sbit LCD_SCLK=P3^7;
void lcd_sbyte(); //串行時鐘
uchar code dis1[]={"物電創(chuàng)新基地"};
uchar code dis2[]={"姓名;劉冰冰"};
uchar code dis3[]={"202107044138"};
uchar code dis4[]={"xzxdbb"};
void keyscan(); //函數(shù)聲明
//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初始化設(shè)定
void lcd_pos(uchar x,uchar y);
void main() //主函數(shù)
{
lcd_init(); //調(diào)用清屏函數(shù)
while(1)
keyscan();
//循環(huán)執(zhí)行按鍵掃描函數(shù)
}
void keyscan() //按鍵循環(huán)函數(shù)
{
uchar i;
if(key1==0) //按鍵1開始,程序檢測key1==0,執(zhí)行下面的指令
{
delayms(10); //按鍵去抖延時
if(key1==0)
{
lcd_pos(0,0); //設(shè)置顯示位置為第一行的第一個字符
i=0;
while(dis1[i]!='\0') //當查到空字符時退出循環(huán)
{
write_dat(dis1[i]); //顯示字符
i++;
}
lcd_pos(1,0); //設(shè)置顯示位置為第二行的第一個字符
i=0;
while(dis2[i]!='\0') //當查到空字符時退出循環(huán)
{
write_dat(dis2[i]); //顯示字符
i++;
}
lcd_pos(2,0); //設(shè)置顯示位置為第三行的第一個字符
i=0;
while(dis3[i]!='\0') //當查到空字符時退出循環(huán)
{
write_dat(dis3[i]); //顯示字符
i++;
}
lcd_pos(3,0); //設(shè)置顯示位置為第四行的第一個字符
i=0;
while(dis4[i]!='\0') //當查到空字符時退出循環(huán)
{
write_dat(dis4[i]); //顯示字符
i++;
}
}
}
if(key2==0) //程序檢測key2==0,執(zhí)行下面的指令
{
delayms(10); //按鍵去抖延時
if(key2==0)
{
LCD_PSB=0; //串口方式
write_cmd(0x01); //清除LCD顯示內(nèi)容
}
}
}
void delayms(uint xms) //延時函數(shù)
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void lcd_sbyte(uchar by) //輸出串行數(shù)據(jù)
{
uchar s;
for(s=0;s<8;s++)
{
LCD_SID=by&0x80; //將by的最高位取出來賦給SID
by=by<<1; //依次將by的每一位從高到低在SCLK的作用送給SID
LCD_SCLK=0; //輸入數(shù)據(jù)
LCD_SCLK=1;
}
}
void write_cmd(uchar cmd) //寫指令數(shù)據(jù)到LCD
{
LCD_CS=1;
lcd_sbyte(0Xf8); //發(fā)送指令
lcd_sbyte(cmd&0xf0); //將所發(fā)送字節(jié)的高四位取出,低四位補0
lcd_sbyte(cmd<<4); //將所發(fā)送的字節(jié)低四位移到高四位的位置上,原來的低四位自動補0
LCD_SCLK=0; //輸入數(shù)據(jù)
LCD_SCLK=1;
LCD_CS=1;
delayms(100);
}
void write_dat(uchar dat) //寫顯示數(shù)據(jù)到LCD
{
LCD_CS=1;
lcd_sbyte(0Xfa); //發(fā)送數(shù)據(jù)
lcd_sbyte(dat&0xf0); //將所發(fā)送字節(jié)的高四位取出,低四位補0
lcd_sbyte(dat<<4); //將所發(fā)送的字節(jié)低四位移到高四位的位置上,原來的低四位自動補0
LCD_SCLK=0; //輸入數(shù)據(jù)
LCD_SCLK=1;
LCD_CS=0;
delayms(100);
}
void lcd_pos(uchar x,uchar y) //設(shè)定顯示位置
{
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初始化設(shè)定
//{
// LCD_PSB=0; //串口方式
// write_cmd(0x30); //基本指令操作
// delayms(5);
// write_cmd(0x0c); //顯示開,關(guān)光標
// delayms(5);
// write_cmd(0x01); //清除LCD顯示內(nèi)容
// 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);
}
|