📄 main.c
字号:
// 1602的写时序是使能信号在由高到低时写进去的,
//前面可以没有使能信号先置低这条指令,在由高到低的变化
//之前,一定要先赋要送出去的值到IO端口,如果在这之前就有
//由高到低的变化就会送出去乱码,即不是自己想要的值
#include"LF2407.H"
#define E_H *PFDATDIR=*PFDATDIR|0x0001
#define E_L *PFDATDIR=*PFDATDIR&0x0FFFE
#define RW_H *PFDATDIR=(*PFDATDIR|0x0002)
#define RW_L *PFDATDIR=(*PFDATDIR&0x0FFFD)
#define RS_H *PFDATDIR=(*PFDATDIR|0x0004)
#define RS_L *PFDATDIR=(*PFDATDIR&0x0FFFA)
#define PFSC *PFDATDIR=*PFDATDIR|0x0F00
#define PESC *PEDATDIR=*PEDATDIR|0x0FF00
#define PESR *PEDATDIR=*PEDATDIR&0x00FF
#define uchar unsigned char
#define uint unsigned int
uchar tab1[]={" Hello! "};
uchar tab2[]={" I am zhuyubing "};
uchar tab3[]={"F:1500r/min sShi"};
uchar tab4[]={"A:1500r/min nShi"};
uchar tabnum[]={"0123456789"};
void SystemInit();
void LCD1602init();
void writecommand(uchar command);
void kjdisplay();
void readstat();
void delay(unsigned int i);
main()
{SystemInit();
LCD1602init();
//while(1)//循环是否都可以
kjdisplay();
}
void SystemInit()
{ asm(" SETC INTM "); /* 关闭总中断 */
asm(" CLRC SXM "); /* 禁止符号位扩展 */
asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/
asm(" CLRC OVM "); /* 累加器结果正常溢出*/
*SCSR1=0x02FC; /* 系统时钟CLKOUT=20*2=40M */
*WDCR=0x0E8; //不是能看门狗,软件禁止看门狗
*IMR=0x0000;
*IFR=0x0FFFF;
*MCRC=*MCRC&0x0E000;//IOPE口和IOPF0-4口为一般I/O口
*MCRA=*MCRA&0x8FFF;
}
void LCD1602init()//LCD1602初始化函数
{delay(150);//可以不要
writecommand(0x38);//可以不要
delay(50);//可以不要
writecommand(0x38);//可以不要
delay(50);//可以不要
writecommand(0x38);//可以不要
writecommand(0x38);//可以不要
writecommand(0x08);
writecommand(0x01);
writecommand(0x06);
writecommand(0x0c);
}
void writecommand(uchar command)//LCD1602写命令函数
{readstat();
PESC;
PFSC;
RS_L;
RW_L;
*PEDATDIR=*PEDATDIR&0x0FF00|command;
//在此条指令之后只要使能信号有个由高到低的跳变即可写液晶
//E_L;//可以不要
//asm(" NOP");//可以不要
//asm(" NOP");//可以不要
//asm(" NOP");//可以不要
E_H;
//delay(5);//可以不要
E_L;
}
void readstat()
{unsigned int stat;
PESR;
PFSC;
while(1)
{
RS_L;
E_H;
RW_H;
stat=*PEDATDIR&0x0080;
if(stat==0)break;
}
}
void writedata(uchar data)//LCD1602写数据函数
{readstat();
PESC;
PFSC;
RS_H;
RW_L;
*PEDATDIR=*PEDATDIR&0x0FF00|data;
//在此条指令之后只要使能信号有个由高到低的跳变即可写液晶
//如果在这之前就有
//由高到低的变化就会送出去乱码,即不是自己想要的值
E_L;//可以不要
asm(" NOP");//可以不要
asm(" NOP");//可以不要
asm(" NOP");//可以不要
E_H;
//delay(5);//可以不要
E_L;
}
void kjdisplay()//开机显示画面
{uchar address=0x80,add=0,data;
for(add=0;add<16;add++,address++)
{writecommand(address);
data=tab1[add];
writedata(data);
}
address=0xc0;
for(add=0;add<16;add++,address++)
{writecommand(address);
data=tab2[add];
writedata(data);
}
}
void delay(unsigned int i)
{ unsigned int j;
for(;i>0;i--)
for(j=1000;j>0;j--);
}
void interrupt nothing()
{asm(" CLRC INTM ");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -