📄 液晶显示.txt
字号:
// Target : M128
// Crystal: 8.0000Mhz
#include <iom128v.h>
#include <macros.h>
#include <stdio.h>
// 直接访问方式地址定义 PA0~7接DB0~7
// PC0~CS PC1~A0
//CS=0 A0=0 写数据口
#define LcmWdataPort (*(volatile unsigned char *)0xFC00)
//CS=0 A0=1 写命令口
#define LcmCmdPort (*(volatile unsigned char *)0xFE00)
//CS=0 A0=1 读数据口
#define LcmRdataPort LcmCmdPort
//CS=0 A0=0 读忙状态标志口
#define LcmStatusPort LcmWdataPort
void port_init(void) // I/O端口初始化函数{
{
DDRG = 0xFF;; //PG3设定为输出(液晶RESET复位端)
PORTG = 0xFF; //PG3输出高电平1(液晶低电平复位)
PORTA = 0xff;
}
void init_devices(void) //调用初始化函数以及外部存储器初始化
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XMCRA = 0x0A; // 外部存储器地址不分区,在RD、WR后插入2个等待周期
XMCRB = 0x00; //不使能总线保持功能,不释放地址线
port_init(); //I/O口初始化
MCUCR = 0x80; //使能外部存储器,并与XMCRA配合设定了插入2个等待周期
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
// 变量类型标识的宏定义
#define Uchar unsigned char
#define Uint unsigned int
// 时序要求:/WR=0;/RD=1
#define SystemSet 0x40
// P1-P8参数
Uchar ParaSysTable[8]= {0x30,0x87,0x07,0x27,0x42,0xF0,0x30,0x00};
/* P1=0x30 : 顶天无边界,单屏结构驱动,内部CGROM+CGRAM1(8×8点阵)
P2=0x87 : B形驱动波形,字符体宽度8列
P3=0x07 : C形驱动波形,字符体高度8行
P4=0x27 : C/R 有效显示窗口参数 320/8 = 40 = 0x27
P5=0x42 : 驱动频率时间常数 TC/R >= C/R+4 Fosc >= 9*TC/R*L/F*FR FR=70Hz
P6=0xF0 : L/F 扫描的行数 240行 = 0xF0
P7,P8 : 设定分配给每一行的显示存储空间0x30=48字节 */
/*******************显示域设置。后续10字节参数串ParaScrTableA[]****************/
// 时序要求:/WR=0;/RD=1
#define Scroll 0x44
#define BasePart1 0x00
#define BasePart2 0x40
#define BasePart3 0x80
#define BasePart4 0x00
Uchar ParaScrTableA[10]={0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4 };
/*****************************休闲模式设置。后续参数:无*********************************/
#define SleepIn 0x53
/*****************************显示状态设置。后续参数1字节.*****************************/
#define DispOn 0x59
#define DispOff 0x58
//设定光标闪烁,4个显示区均显示但不闪烁。
#define DispOnP1 0x56
/***************************显示合成方式设置。后续参数1字节。**************************/
#define Ovlay 0x5b
//设定1、3显示区为文本显示,2显示区为图形。L1、L2、L3简单或合成
#define OvlayP1 0x00
/*****************************点位移设置。后续参数1字********************************/
#define HdotScr 0x5A
//设定点位移为1
#define HdotScrP1 0x00
/***********************光标形状设置。后续参数2字节*********************************/
#define CsrForm 0x5D
//设定光标占8列
#define CsrFormP1 0x07
//设定光标为块状,占8行
#define CsrFormP2 0x87
/*********************Cgram首地址设置。后续参数2字节*********************************/
#define CgramAdr 0x5C
//定义外部CGROM开始地址为8000H
#define CgramAdrP1 0x00
#define CgramAdrP2 0x80
/************************光标移动方向设置。后续参数:无****************************/
//光标右移
#define CsrDirR 0x4c
//光标左移
#define CsrDirL 0x4d
//光标上移
#define CsrDirU 0x4e
//光标下移
#define CsrDirD 0x4f
/************************光标指针设置。后续参数2字节*****************************/
#define CsrW 0x46
/************************读取光标指针。后续参数2字节****************************/
#define CsrR 0x47
/**************************数据写入设置。后续参数N字节************************/
#define mWrite 0x42
/**************************数据读取设置。后续参数N字节***********************/
#define mRead 0x43
/*******************************程序参数定义***************************/
// 忙状态标志位0b0100 0000
#define Busy 0x40
// 相对于320 X 240 液晶屏
#define AP 0x30
/*____________________________微妙延时程序_,8M晶振______________________________*/
void delay_1us()
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void delay_us(Uchar n)
{
while(n--)
{ delay_1us();}
}
/*___________________________毫秒延时程序_______________________________*/
void delay_ms(Uchar m)
{
while(m--)
{delay_us(1000);}
}
/*___________________________判断忙标志BF子程序________________________*/
void WaitForBusy(void)
{
while(LcmStatusPort & Busy);
}
/*__________________________写指令子程序_______________________________*/
void WriteCommand(Uchar CommandByte)
{
LcmCmdPort = CommandByte;
}
/*__________________________写参数及数据子程序________________________*/
void WriteData(Uchar DataW)
{
LcmWdataPort = DataW;
}
/*_________________________读参数及显示数据子程序_____________________*/
Uchar ReadDataLcm(void)
{
return LcmRdataPort;
}
/*_________________________初始化LCM子程序____________________________*/
void LcmInition(void)
{
Uchar i;
PORTG &= 0xF7; //先复位液晶模块SED1330
delay_us(400);
PORTG |=0x08;
delay_ms(50);
WriteCommand(SystemSet); //写系统设置命令
for(i=0;i<8;i++)
{
WriteData(ParaSysTable[i]); //写P1—P8参数
};
delay_1us();
WriteCommand(Scroll); //写显示区域设定命令
for(i=0;i<10;i++)
{
WriteData(ParaScrTableA[i]);
};
delay_1us();
WriteCommand(HdotScr); //写入点位移设置指令
WriteData(HdotScrP1); //写入P1参数,点位移0
delay_1us();
WriteCommand(Ovlay); //写入区域合成设定指令
WriteData(OvlayP1); //写入P1参数,L1,L2,L3简单或合成
delay_1us();
WriteCommand(CsrForm); //写入光标形状设定指令
WriteData(CsrFormP1); //写入P1参数 8列
WriteData(CsrFormP2); //写入P2参数 8行
delay_1us();
}
/*______________________________清32K显存即清屏子程序__________________________________*/
void LcmClear(void)
{
Uint Number=32768;
WriteCommand(CsrDirR);
delay_1us();
WriteCommand(CsrW);
WriteData(0x00);
WriteData(0x00);
delay_1us();
WriteCommand(mWrite);
while(Number--)
{
WriteData(0x00);
}
delay_1us();
}
void main()
{
delay_ms(100);
init_devices();
delay_ms(100);
LcmInition();
delay_ms(5);
LcmClear();
WriteCommand(DispOn); //写入LCM开显示屏幕指令
WriteCommand(DispOnP1); //写入P1参数,光标闪烁,1,2,3,4区显示
delay_us(20);
WriteCommand(CgramAdr); //设置CG地址 8000
WriteData(CgramAdrP1);
WriteData(CgramAdrP2);
delay_1us();
WriteCommand(CsrDirR);
delay_1us();
WriteCommand(CsrW); //写入光标地址
WriteData(0x04); //光标设定指向显示1区首地址
WriteData(0x00);
delay_1us();
WriteCommand(mWrite); //显示内部字符
WriteData(0x44); //"D"
WriteData(0x5F); //"_"
WriteData(0x42); //"B"
WriteData(0x4F); //"O"
WriteData(0x59); //"Y"
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -