📄 lcd.c
字号:
/******************************************************
** 功能描述:该程序对CF12864液晶屏进行初始化并开启显示
*****************************************************/
#include "DSP280x_Device.h"
#define LCD_DI GpioDataRegs.GPADAT.bit.GPIO10 //指令/数据,低为数据
#define LCD_RW GpioDataRegs.GPADAT.bit.GPIO9 //读/写,低为写
#define LCD_E GpioDataRegs.GPADAT.bit.GPIO8 //使能信号,下降沿写入
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 ReadLcdState (Uint16 E) //读状态字,判断忙否,E为区分左右
{
unsigned long int i = 0;
Uint32 STAFLAG;
EALLOW;
GpioCtrlRegs.GPADIR.all =GpioCtrlRegs.GPADIR.all&0xfff00fff;//D0~D7输入
EDIS;
if(E==1)
GpioDataRegs.GPBDAT.all = 0xfffa; //CSA=0,CSB=1左
else
GpioDataRegs.GPBDAT.all = 0xfffb; //CSA=1,CSB=0右
LCD_DI = 0;
for(i=0; i<2; i++){}
LCD_RW = 1;
for(i=0; i<2; i++){}
while(1)
{
LCD_E = 1;
for(i=0; i<2; i++){}
// LCD_E = 0;
STAFLAG = GpioDataRegs.GPADAT.all&0x80000;// 读液晶状态
if(STAFLAG==0x0000)break;
}
}
void WriteLcdIns (Uint32 INS,Uint16 E) //写指令,E为区分左右
{
unsigned long int i = 0;
ReadLcdState (E);
EALLOW;
GpioCtrlRegs.GPADIR.all =GpioCtrlRegs.GPADIR.all|0x000ff000;//D0~D7输出
EDIS;
if(E==1)
GpioDataRegs.GPBDAT.all = 0xfffa; //CSA=0,CSB=1左
else
GpioDataRegs.GPBDAT.all = 0xfffb; //CSA=1,CSB=0右
LCD_RW = 0;
for(i=0; i<2; i++){}
LCD_DI = 0;
for(i=0; i<2; i++){}
LCD_E = 1;
GpioDataRegs.GPADAT.all=(GpioDataRegs.GPADAT.all&0xfff00fff)|(INS<<12); // 指令写入LCD
for(i=0; i<2; i++){}
LCD_E = 0;
}
void WriteLcdData (Uint32 DATA,Uint16 Yaddress,Uint16 E) //写数据,E为区分左右
{
unsigned long int i = 0;
WriteLcdIns(Yaddress,E); //设置列地址
ReadLcdState (E); //查询液晶是否为空闲
EALLOW;
GpioCtrlRegs.GPADIR.all =GpioCtrlRegs.GPADIR.all|0x000ff000;//D0~D7输出
EDIS;
if(E==1)
GpioDataRegs.GPBDAT.all = 0xfffa; //CSA=0,CSB=1左
else
GpioDataRegs.GPBDAT.all = 0xfffb; //CSA=1,CSB=0右
LCD_RW = 0;
for(i=0; i<2; i++){}
LCD_DI = 1;
for(i=0; i<2; i++){}
LCD_E = 1;
GpioDataRegs.GPADAT.all=(GpioDataRegs.GPADAT.all&0xfff00fff)|(DATA<<12); // 数据写入LCD
for(i=0; i<2; i++){}
LCD_E = 0;
}
void OffLcdDis (Uint16 E) //关显示
{
unsigned long int i = 0;
Uint32 STAFLAG;
while(1)
{
WriteLcdIns (0X3E,E); //写指令:关闭显示
ReadLcdState (E); //查询液晶是否为空闲
EALLOW;
GpioCtrlRegs.GPADIR.all =GpioCtrlRegs.GPADIR.all&0xfff00fff;//D0~D7输入
EDIS;
if(E==1)
GpioDataRegs.GPBDAT.all = 0xfffa; //CSA=0,CSB=1左
else
GpioDataRegs.GPBDAT.all = 0xfffb; //CSA=1,CSB=0右
LCD_RW = 1;
for(i=0; i<2; i++){}
LCD_DI = 0;
for(i=0; i<2; i++){}
LCD_E = 1;
for(i=0; i<2; i++){}
LCD_E = 0;
STAFLAG = GpioDataRegs.GPADAT.all&0X20000; // 读液晶状态
if(STAFLAG==0X20000)break; //如液晶关闭,则退出循环
}
}
void OpenLcdDis (Uint16 E) //开显示
{
unsigned long int i = 0;
Uint32 STAFLAG;
while(1)
{
WriteLcdIns (0x3F,E); //写指令:LCD显示RAM中的内容
ReadLcdState (E); //查询液晶是否为空闲
EALLOW;
GpioCtrlRegs.GPADIR.all =GpioCtrlRegs.GPADIR.all&0xfff00fff;//D0~D7输入
EDIS;
if(E==1)
GpioDataRegs.GPBDAT.all = 0xfffa; //CSA=0,CSB=1左
else
GpioDataRegs.GPBDAT.all = 0xfffb; //CSA=1,CSB=0右
LCD_RW = 1;
for(i=0; i<2; i++){}
LCD_DI = 0;
for(i=0; i<2; i++){}
LCD_E = 1;
for(i=0; i<2; i++){}
LCD_E = 0;
STAFLAG = GpioDataRegs.GPADAT.all&0X20000; // 读液晶状态
if(STAFLAG==0x00000)break; //如果液晶被打开,则退出循环
}
}
void ClrLcdDis (Uint16 E) //清屏
{
Uint16 PAGENUM; //页地址B8~BF
Uint16 Yaddress; // Y地址40~7F
for (PAGENUM=0xB8; PAGENUM<=0xBF; PAGENUM++)
{
WriteLcdIns (PAGENUM, E); //设置相应的页地址
for (Yaddress=0x40; Yaddress<=0x7F; Yaddress++)
{
WriteLcdData(0x00, Yaddress, E); //送0清屏
}
}
}
void LCDinit (Uint16 E) // LCD初始化子程序
{
OffLcdDis (E); //关显示
WriteLcdIns (0x0A4,E); //设置显示驱动,占空比,复位,ADC选择等
WriteLcdIns (0x0A9,E);
WriteLcdIns (0x0E2,E);
WriteLcdIns (0x0A0,E);
ClrLcdDis (E); //清屏
WriteLcdIns (0x3F,E); //写指令:LCD显示RAM中的内容
OpenLcdDis (E); //开显示
}
void DISPLAY(Uint16 n,Uint16 E,Uint16 PAGADD,Uint16 Yaddress) // 送显汉字子程序
{
Uint16 K;
char TEMP;
WriteLcdIns (0X0c0,E);
WriteLcdIns (PAGADD,E);
n=n*32;
for(K=0;K<16;K++,Yaddress++)
{
TEMP=table1[K+n];
WriteLcdData (TEMP,Yaddress,E);
}
Yaddress=Yaddress-16;
PAGADD=PAGADD+1;
WriteLcdIns (PAGADD,E);
for(;K<32;K++,Yaddress++)
{
TEMP=table1[K+n];
WriteLcdData (TEMP,Yaddress,E);
}
WriteLcdIns (0X0C0,E);
PAGADD=PAGADD-1;
WriteLcdIns (PAGADD,E);
}
void IOinit() // I/O初始化子程序
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = GpioCtrlRegs.GPAMUX1.all&0x00000000;
GpioCtrlRegs.GPAMUX2.all = GpioCtrlRegs.GPAMUX2.all&0x00000000;
GpioCtrlRegs.GPADIR.all = GpioCtrlRegs.GPADIR.all|0xfff00fff;
GpioCtrlRegs.GPBMUX1.all = GpioCtrlRegs.GPBMUX1.all&0x00000000;
GpioCtrlRegs.GPBDIR.all = GpioCtrlRegs.GPBDIR.all|0x0ff;
EDIS;
}
main()
{
InitSysCtrl(); // 系统初始化程序,该子程序在DSP28_sysctrl.c中
DINT; // 关闭总中断
IER = 0x0000; // 关闭外围中断
IFR = 0x0000; // 请中断标志
IOinit(); // I/O初始化子程序
LCDinit(1); // LCD初始化子程序
LCDinit(2);
DISPLAY (0,1,0xBA,0x47); //重
DISPLAY (1,1,0xBA,0x67); //庆
DISPLAY (2,2,0xBA,0x47); //大
DISPLAY (3,2,0xBA,0x67); //学
for( ; ; ){}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -