📄 lcd5.c
字号:
#include "register.h"
#include "HZ.h"
void SysInit(void);
void LCDinit(void);
void LCDdelay(int delx);
void Writezimu(void);
void CmdWrite(unsigned char lcd_cmd);
void DataWrite(unsigned char lcd_data);
void SetCursor(int ox,int oy);
void WriteHZ(int ox,int oy,int k);
main()
{
SysInit();
LCDinit();
CmdWrite(0xFF5B); // 显示区合成方式
DataWrite(0xFF0C);
WriteHZ(0xFF17,0xFF11,0);
WriteHZ(0xFF1c,0xFF11,1);
WriteHZ(0xFF21,0xFF11,2);
WriteHZ(0xFF26,0xFF11,3);
WriteHZ(0xFF2b,0xFF11,4);
WriteHZ(0xFF30,0xFF11,5);
}
void LCDinit(void)
{
int i;
CmdWrite(0xFF40); // LCD系统设置指令,8参数
DataWrite(0xFF30);
DataWrite(0xFF87);
DataWrite(0xFF07);
DataWrite(0xFF28);
DataWrite(0xFF2F);
DataWrite(0xFFF0);
DataWrite(0xFF30);
DataWrite(0xFF00);
CmdWrite(0xFF44); // 显示区设置指令,10参数
DataWrite(0xFF00);
DataWrite(0xFF00);
DataWrite(0xFFF0);
DataWrite(0xFF00);
DataWrite(0xFF40);
DataWrite(0xFFF0);
DataWrite(0xFF00);
DataWrite(0xFF80);
DataWrite(0xFF00);
DataWrite(0xFF00);
CmdWrite(0xFF5A); // 水平卷动,必须清零
DataWrite(0xFF00);
CmdWrite(0xFF5B); // 显示区合成方式
DataWrite(0xFF00);
CmdWrite(0xFF59); // 开启LCD
DataWrite(0xFF54);
CmdWrite(0xFF4C); // 设定光标增量为1
CmdWrite(0xFF46); // 设定光标起始地址
DataWrite(0xFF00);
DataWrite(0xFF00);
CmdWrite(0xFF42); // 向显存写入数据
for(i=0;i<32767;i++)
{
DataWrite(0xFF00); // 将32K显存全部清零
// 即LCD不显示任何东西
}
}
void SetCursor(int x,int y) //设定光标,二区显示
{
CmdWrite(0xFF46); //设定光标起始位置
DataWrite(x); //地址低8位
DataWrite(y); //地址高8位
}
void WriteHZ(int x,int y,int k)
{
int i,j;
SetCursor(x,y);
CmdWrite(0xFF46); // 设定光标起始地址
DataWrite(x);
DataWrite(y);
CmdWrite(0xFF4F); // 设定光标增量为1
CmdWrite(0xFF42);
for(i=0;i<=15;i++)
DataWrite(HZ[k][i]);
CmdWrite(0xFF46); // 设定光标起始地址
DataWrite(x+1);
DataWrite(y);
CmdWrite(0xFF42);
for(j=16;j<=31;j++)
DataWrite(HZ[k][j]);
}
void CmdWrite(unsigned char lcd_cmd) /*写指令*/
{
*PADATDIR=*PADATDIR&0x0F0B; /*设置IOPE2=0;CS=0;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR|0x0F08; /*设置IOPE3=1;A0=1;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR&0x0F0E; /*设置IOPE0=0;WR=0;*/
LCDdelay(0x3);
*PBDATDIR=(*PBDATDIR&0xFF00)|lcd_cmd; /*送命令lcd-cmd;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR|0x0F01; /*设置IOPE0=1;WR=1;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR|0x0F04; /*设置IOPE2=1;CS=1;*/
LCDdelay(0x3);
}
void DataWrite(unsigned char lcd_data) /*写数据*/
{
*PADATDIR=*PADATDIR&0x0F0B; /*设置IOPE2=0;CS=0;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR&0x0F07; /*设置IOPE3=0;A0=0;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR&0x0F0E; /*设置IOPE0=0;WR=0;*/
LCDdelay(0x3);
*PBDATDIR=(*PBDATDIR&0xFF00)|lcd_data; /*送数据lcd-data;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR|0x0F01; /*设置IOPE0=1;WR=1;*/
LCDdelay(0x3);
*PADATDIR=*PADATDIR|0x0F04; /*设置IOPE2=1;CS=1;*/
LCDdelay(0x3);
}
void LCDdelay(int delx) //延时子程序
{
int m=0;
while(m<delx)
{
m++;
}
}
void SysInit(void) //DSP初始化子程序
{
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
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0000; // 禁止所有中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
*MCRA=*MCRA|0x00F0; // 把IOPB端口配置为一般的I/O
// 把IOPA0-3端口配置为一般的I/O
*PBDATDIR=*PBDATDIR|0xFF00; // 把IOPB端口设置为输出方式
*PBDATDIR=*PBDATDIR&0xFF00; // 把IOPB输出设置为0
*PADATDIR=*PADATDIR|0x0F0F; // 把IOPA0-3端口设置为输出方式
*PADATDIR=*PADATDIR&0x0F0F; // 把IOPA0-3输出设置为1
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -