📄 2007620133251.c
字号:
/*
功能描述:本文件可以实现LCD的简单显示,包括十进制数字、字母、汉字、16进制数据
*/
#include <c8051f020.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS = P3^6 ; //PIN4 片选高有效 P33
sbit SID = P3^3; //PIN5 串行输入 P34
sbit CLK = P3^2; //PIN6 串行时钟,上升沿有效 P32
sbit PSB = P3^1; //PIN15 工作方式,低为串行 P31
sbit RESET= P3^0; //PIN17 复位,低有效
void delay1us(uchar t);//延时1us
void config(void);//配置单片机
void lcdini(); //初始化LCD
void sendbyte(bit RS,bit RW,short data8); //发送一个字节的数据,可以是指令,可以是8位数据
void sendword(short place,int word); //显示一个汉字
void sendnumber(short place,int number); //显示一个十进制的数字
void dishex(uchar hexnum);//显示一个16进制的数据
void single(uchar addr,uchar num);//显示单个字符
void strings(uchar addr,uchar *str,uchar x);//显示字符串
//配置时要把相应的P口置为推挽
uchar num[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};//0-f
void delay1us(uchar t)
{ uchar i,j;
for(i=0;i<t;i++)
for(j=0;j<200;j++);
}
void lcdini() //初始化LCD
{
unsigned int delay;
delay1us(40000);
sendbyte(0,0,0x30); //8位扩展指令
delay1us(100);
sendbyte(0,0,0x30); //8位扩展指令
delay1us(37);
sendbyte(0,0,0x0C); //整体显示
delay1us(100);
sendbyte(0,0,0x01); //清屏
delay1us(10000);
sendbyte(0,0,0x07);
delay1us(40000);
}
void sendbyte(bit RS,bit RW,short data8) //向LCD输出指令
{
short n;
CLK=0; //Init
CS=1;
for(n=0;n<5;n++)
{ //Syn 5bit
SID=1;
CLK=1;
CLK=0;
}
//RW 1bit
SID=RW;
CLK=1;
CLK=0;
SID=RS; //RS 1bit
CLK=1;
CLK=0;
SID=0; //0 1bit
CLK=1;
CLK=0;
for(n=7;n>3;n--) //DH4 8bit
{
SID=(data8>>n)&1;
CLK=1;
CLK=0;
}
for(n=0;n<4;n++)
{
SID=0;
CLK=1;
CLK=0;
}
for(n=3;n>-1;n--) //DL4 8bit
{
SID=(data8>>n)&1;
CLK=1;
CLK=0;
}
for(n=0;n<4;n++)
{
SID=0;
CLK=1;
CLK=0;
}
CS=0;
}
/*
void sendword(short place,int word) //输出一个字
{
// short delay;
sendbyte(0,0,place); //位置
// for(delay=0;delay<100;delay++);
sendbyte(1,0,word>>8); //高半字
// for(delay=0;delay<100;delay++);
sendbyte(1,0,word&0xFF); //低半字
// for(delay=0;delay<100;delay++);
}
*/
/*
void sendnumber(short place,int number) //显示数字结果
{
short buffer1,buffer2,on=0;
buffer1=(number/10000+0x30)*0x100;
if(0x3000==buffer1)
buffer1=0x2000;
else
on=1;
buffer2=number%10000/1000+0x30;
if(0x30==buffer2&&0==on)
buffer1=0x2020;
else
{
on=1;
buffer1+=buffer2;
}
sendword(place,buffer1);
place++;
buffer1=(number%1000/100+0x30)*0x100;
if(0x3000==buffer1&&0==on)
buffer1=0x2000;
else
on=1;
buffer2=number%100/10+0x30;
if(0x30==buffer2&&0==on)
buffer1=0x2020;
else
buffer1+=buffer2;
sendword(place,buffer1);
place++;
buffer1=(number%10+0x30)*0x100+0x20;
sendword(place,buffer1);
}
*/
void single(uchar addr,uchar num)
{ sendbyte(0,0,addr);
sendbyte(1,0,num);
}
void strings(uchar addr,uchar *str,uchar x)
{ uchar i;
sendbyte(0,0,addr);
for(i=0;i<x;i++)
{
sendbyte(1,0,str[i]);
}
}
void dishex(uchar hexnum) //显示一位16进制
{ uchar hex[2];
hex[1]=num[hexnum&0x0F];
hex[0]=num[(hexnum&0xF0)>>4];
strings(0x80,hex,2);
}
void config(void)
{ WDTCN=0xDE;
WDTCN=0xAD;//禁止看门狗
XBR0=0x00;
XBR1=0x00;
XBR2=0x40;//使能交叉开关
P74OUT=0xFF;//P4—-P7设置为推挽方式
OSCXCN=0x00;//禁止外部振荡器
OSCICN=0x07;//使用内部时钟16Mz
}
void main()
{
number[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
letter[7]={0x41,0x42,0x43,0x44,0x45,0x46,0x47};
chinese[8]={0xc5,0xf4,0xb8,0xe7,0xbb,0xb5,0xb5,0xb0};
delay1us(10000);
config();
delay1us(10000);
lcdini(); //显示初始化
delay1us(10000);
strings(0x80,number,10);
// strings(0x90,letter,7);
// strings(0x88,chinese,8);
// single(0x80,0x48);
// sendword(0x80,0xced0);
// sendnumber(0x80,12345);
// dishex(0xced0);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -