📄 lcd.c
字号:
//(2)主程序
#include "f2407_c.h"
char table1[300]={
0x08,0x08,0x0A,0xEA,0xAA,0xAA,0xAA,0xFF,0xA9,0xA9,0xA9,0xE9,0x08,0x08,0x08,0x00,
0x40,0x40,0x48,0x4B,0x4A,0x4A,0x4A,0x7F,0x4A,0x4A,0x4A,0x4B,0x48,0x40,0x40,0x00,
// 重
0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0xC5,0x7E,0xC4,0x44,0x44,0x44,0x44,0x44,0x00,
0x40,0x30,0x0F,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x18,0x30,0x60,0x20,0x00,
// 庆
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,
// 大
0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
// 学
};
//屏蔽中断子程序
void inline disable()
{
asm(" setc INTM");
}
//系统初始化子程序
void initial()
{
asm(" setc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
asm(" setc INTM"); // 禁止所有中断
*SCSR1=0x81FE; // CLKIN=6M,CLKOUT=4*CLKIN=24M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WDC位复位后的缺省值,故可以用
// 软件禁止看门狗
*IMR=0x0000; // 禁止所有中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
*MCRC=*MCRC&0x0e3FF; // IOPF2,F3,F4端口配置为一般的I/O功能
*PFDATDIR=0x0FFe3; //IOPF2,F3,F4端口配置为输出低电平
*MCRA=*MCRA&0x00c7; // 配置IOPA[3-5],IOPB[0-7]为一般I/O口功能
*PADATDIR=0x0FF00; // IOPA[3-4]为输出,且全部为0
disable(); // 总中断禁止
}
//读液晶显示器的状态子程序,形参E代表处理的液晶的边(E1或E2边)
void LCDSTA1(E)
int E;
{
int E1FLAG,i=0;
*PBDATDIR=*PBDATDIR&0x0000; //IOPB口为输入
if(E==1)
*PADATDIR=0x0FF18; //E1=1
else *PADATDIR=0x0FF20; //E2=1
*PFDATDIR=0x0FF08; // LCD_RW = 1;
// LCD_DI = 0;
while(1)
{
*PFDATDIR=*PFDATDIR|0x0FF10; //LCD_E = 1;
for(i=0; i<2; i++){}
*PFDATDIR=*PFDATDIR&0x0FFef; //LCD_E = 0;
E1FLAG=*PBDATDIR&0x0080; // 读液晶状态
if(E1FLAG==0x0000)break; //若液晶空闲,则停止等待
}
}
//对液晶显示器发指令子程序,形参E代表处理的液晶的边(E1或E2)
void TRANS1(TRANS,E) //该函数采用形参和实参的方式传递数值,TRANS为一个形参
int TRANS,E;
{ int i=0;
LCDSTA1(E); //判断液晶是否为忙
*PBDATDIR=*PBDATDIR|0x0FF00; //IOPB口为输出
if(E==1) *PADATDIR=0x0FF18; //E1=1,
else *PADATDIR=0x0FF20; //E2=1,
*PFDATDIR=0x0FF10; //LCD_RW = 0;
//LCD_DI = 0;
//LCD_E = 1;
*PBDATDIR=(*PBDATDIR&0x0FF00)|TRANS; //需要写入的命令字送入数据线
for(i=0; i<2; i++){}
*PFDATDIR=*PFDATDIR&0x0FFef; //LCD_E = 0;
}
//对液晶显示器写数据子程序,注意在此子程序中列地址没有加1,需要用户在外对其进行操作,形参E代表处理的液晶的边(E1或E2)
void WRITE1(WRITE,Yaddress,E) //WRITE代表需要写入的数据,Yaddress代表需要的列地址
int WRITE,Yaddress,E;
{
int i=0;
TRANS1(Yaddress,E); //设置列地址
LCDSTA1(E); //查询液晶是否空闲
*PBDATDIR=*PBDATDIR|0x0FF00; //IOPB口为输出
if(E==1) *PADATDIR=0x0FF18; //E1=1
else *PADATDIR=0x0FF20; //E1=0,E2=1
*PFDATDIR=0x0FF14;// LCD_RW = 0;
//LCD_DI = 1;
//LCD_E = 1;
*PBDATDIR=(*PBDATDIR&0x0FF00)|WRITE; //写入数据
for(i=0; i<2; i++){}
*PFDATDIR=*PFDATDIR&0x0FFef; //LCD_E = 0;
}
//开E1显示子程序,形参E代表处理的液晶的边(E1或E2)
void DISP1(E)
int E;
{
int E1FLAG,i=0;
while(1)
{
TRANS1(0x03F,E); //送出控制字
LCDSTA1(E); //判断液晶是否为忙
*PBDATDIR=*PBDATDIR&0x00ff; //IOPB口为输入
if(E==1) *PADATDIR=0x0FF18; //E1=1
else *PADATDIR=0x0FF20; //E1=0,E2=1
*PFDATDIR=0x0FF18;// LCD_RW = 1;
//LCD_DI = 0;
//LCD_E = 1;
for(i=0; i<2; i++){}
*PFDATDIR=*PFDATDIR&0x0ffef; //LCD_E = 0;
E1FLAG=*PBDATDIR&0x0020; // 读液晶状态
if(E1FLAG==0x0000) break; //如果液晶被打开,则退出循环
}
}
//E1边清屏子程序,形参E代表处理的液晶的边(E1或E2)
void CLEAR1(int E)
{
int PAGENUM,Yaddress; //定义所需要的局部变量
for (PAGENUM=0x0B8; PAGENUM<=0x0BF; PAGENUM++)
{
TRANS1(PAGENUM,E); //设置相应的页地址
for(Yaddress=0x40; Yaddress<=0x7F; Yaddress++)
{
WRITE1(0x00,Yaddress,E); //向相应的列送0以清屏
}
}
}
//关E1显示子程序,形参E代表处理的液晶的边(E1或E2)
void DISOFF1(int E)
{
int E1FLAG,i=0;
while(1)
{
TRANS1(0x3E,E); //送出控制字
LCDSTA1(E); //判断液晶是否为空闲
*PBDATDIR=*PBDATDIR&0x00FF; //IOPB口为输入
if(E==1) *PADATDIR=0x0FF18; //E1=1
else *PADATDIR=0x0FF20; //E1=0
*PFDATDIR=0x0FF18;// LCD_RW = 1;
//LCD_DI = 0;
//LCD_E = 1;
for(i=0; i<2; i++){}
*PFDATDIR=*PFDATDIR&0x0FFef; //LCD_E = 0;
E1FLAG=*PBDATDIR&0x0020; // 读液晶状态
if(E1FLAG==0x0020) break; //如液晶关闭,则退出循环
}
}
//LCD的E1初始化子程序,形参E代表处理的液晶的边(E1或E2)
void LCD1INIT(int E)
{
DISOFF1(E); //关显示E1
TRANS1(0x0A4,E); //不静态显示驱动
TRANS1(0x0A9,E); //占空比为1/32
TRANS1(0x0E2,E); //复位
TRANS1(0x0A0,E); //ADC选择正常输出
CLEAR1(E); //清屏
DISP1(E); //开显示
}
// 汉字显示子程序,入口为存储汉字库的数组的首地址,页地址和起始列地址
// 和选中的E1或E2的边数
DISPLAY1(n,E,PAGADD,Yaddress)
int n,PAGADD,Yaddress,E; // 定义所需要的局部变量
{
int K;
char TEMP;
TRANS1(0x0C0,E); // 从第0行开始显示
TRANS1(PAGADD,E); // 送需要显示的页地址
n=n*32;
for(K=0;K<16;K++,Yaddress++)
{
TEMP=table1[K+n];
WRITE1(TEMP,Yaddress,E); // 送需要显示的数据字节
}
Yaddress=Yaddress-16; // 恢复列地址
PAGADD=PAGADD+1; // 页地址加1
TRANS1(PAGADD,E);
for(;K<32;K++,Yaddress++)
{
TEMP=table1[K+n];
WRITE1(TEMP,Yaddress,E); // 送需要显示的数据字节
}
TRANS1(0x0c0,E);
PAGADD=PAGADD-1;
TRANS1(PAGADD,E);
}
// 主程序
main()
{
initial(); // 系统初始化
LCD1INIT(1); // LCD的E1边初始化
LCD1INIT(2); // LCD的E2边初始化
DISPLAY1(0,1,0xBA,0x47);//重
DISPLAY1(1,1,0xBA,0x67);//庆
DISPLAY1(2,2,0xBA,0x47);//大
DISPLAY1(3,2,0xBA,0x67);//学
for( ; ; ){}
}
// 如若因干扰引起中断的误执行,则执行此中断服务程序
void interrupt nothing()
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -