📄 lcd.c
字号:
//深圳瑞特TR12864M(控制器ST7920A)
//串行连接方式,PTC0-CS,PTC1-SID,PTC2-SCLK
#include "gp32.h"
#define cli() _asm("cli\n") /*开中断*/
#define sei() _asm("sei\n") /*关中断*/
typedef unsigned int Uint;
typedef unsigned char Uchar;
extern void menu(void);
const Uchar delay=80;
//延迟1 ms
static void Wait1ms(void) {
Uchar cnt=0;
while (cnt<delay) cnt++;
}
//延迟n ms
void WaitNms(int n){
Uchar i;
for(i=1;i<=n;i++)
Wait1ms();
}
//RT12864HZ的E信号由1到0变化,即SCLK下降沿触发,SCLK接PTC2
void Tollge(void){
PTC|=0x04; //SCLK=1;
PTC&=0xFB; //SCLK=0;
}
//读忙标志
void RDBF(void){
Uchar k;
Uchar temp=0x00;
while(1){
//接收五个连续“1”同步字串
DDRC|=0x02; //PTC1为输出
PTC&=0xFB; //SCLK=0;
PTC|=0x02; //SID=1;
for(k=0;k<5;k++) Tollge();//
PTC&=0xFD; //SID=0;
Tollge(); //从SID读数据CS=0
//读数据的高四位
DDRC&=0xFD; //PTC1为输入
PTC&=0xFD;
Tollge();
temp|=(PTC<<6); //第7位
PTC&=0xFD;
Tollge();
temp|=(PTC<<5); //第6位
PTC&=0xFD;
Tollge();
temp|=(PTC<<4); //第5位
PTC&=0xFD;
Tollge();
temp|=(PTC<<3); //第4位
DDRC|=0x02; //PTC1为输出
PTC&=0xFD; //SID=0;
for(k=0;k<4;k++) Tollge(); //从SID读数据0
//数据的低四位
DDRC&=0xFD;
PTC&=0xFD;
Tollge();
temp|=(PTC<<2);
PTC&=0xFD;
Tollge();
temp|=(PTC<<1);
PTC&=0xFD;
Tollge();
temp|=PTC;
PTC&=0xFD;
Tollge();
temp|=(PTC>>1);
DDRC|=0x02;
PTC&=0xFD; //SID=0;
for(k=0;k<4;k++)Tollge(); //从SID读数据0
}
PTC&=0xFE; //CS=0;
WaitNms(5);
}
//写数据到指令寄存器
void WRCommand(Uchar comm){
Uchar k;
PTC&=0xFB; //SCLK=0;
PTC|=0x02; //SID=1;
for(k=0;k<5;k++) Tollge(); //SCLK下降沿
PTC&=0xFD; //SID=0;
Tollge(); //从SID读数据SID=0
Tollge(); //从SID读数据CS=0
Tollge(); //从SID读数据0
//数据的高四位
if((comm&0x80)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.7;
Tollge(); //从SID读数据A.7
if((comm&0x40)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.6;
Tollge(); //从SID读数据A.6
if((comm&0x20)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.5;
Tollge(); //从SID读数据A.5
if((comm&0x10)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.4;
Tollge(); //从SID读数据A.4
PTC&=0xFD; //SID=0;
for(k=0;k<4;k++) Tollge(); //从SID读数据0
//数据的低四位
if((comm&0x08)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.3;
Tollge(); //从SID读数据A.3
if((comm&0x04)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.2;
Tollge(); //从SID读数据A.2
if((comm&0x02)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.1;
Tollge(); //从SID读数据A.1
if((comm&0x01)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.0;
Tollge(); //从SID读数据A.0
PTC&=0xFD; //SID=0;
for(k=0;k<4;k++)Tollge(); //从SID读数据0
WaitNms(10);
}
//写数据到数据寄存器
void WRData(Uchar data){
Uchar k;
//接收五个连续“1”同步字串
PTC&=0xFB; //SCLK=0;
PTC|=0x02; //SID=1;
for(k=0;k<5;k++)Tollge();//从SID读数据1
PTC&=0xFD; //SID=0;
Tollge(); //从SID读数据SID=0
PTC|=0x02; //SID=1;
Tollge(); //从SID读数据CS=1
PTC&=0xFD; //SID=0;
Tollge(); //从SID读数据0
//数据的高四位
if((data&0x80)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.7;
Tollge(); //从SID读数据A.7
if((data&0x40)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.6;
Tollge(); //从SID读数据A.6
if((data&0x20)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.5;
Tollge(); //从SID读数据A.5
if((data&0x10)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.4;
Tollge(); //从SID读数据A.4
PTC&=0xFD; //SID=0;
for(k=0;k<4;k++)Tollge(); //从SID读数据0
//数据的低四位
if((data&0x08)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.3;
Tollge(); //从SID读数据A.3
if((data&0x04)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.2;
Tollge(); //从SID读数据A.2
if((data&0x02)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.1;
Tollge(); //从SID读数据A.1
if((data&0x01)==0) PTC&=0xFD;
else PTC|=0x02; //SID=A.0;
Tollge(); //从SID读数据A.0
PTC&=0xFD; //SID=0;
for(k=0;k<4;k++)Tollge(); //从SID读数据0
WaitNms(10);
}
//初始化LCD-8位接口
void LCDInit(void){
WRCommand(0x30); //基本指令集,8位并行
WaitNms(10); //等待时间>37us
WRCommand(0x06); //启始点设定:光标右移
WaitNms(10); //等待时间>100us
WRCommand(0x01); //清除显示DDRAM
WaitNms(20); //等待时间>10ms
WRCommand(0x0C); //显示状态开关:整体显示开,光标显示关,光标显示反白关
WaitNms(10); //等待时间>100us
WRCommand(0x02); //地址归零
}
//显示英文字符串(显示半宽字型16*8点阵)
void ShowEnglish(Uchar addr,Uchar *english,Uchar count){
Uchar i;
WaitNms(1);
WRCommand(addr); //设定DDRAM地址
for(i=0;i<count;i++)
WRData(english[i]);
}
//显示汉字串(16*16点阵)
void ShowChinese(Uchar addr,Uchar chinese[],Uchar count){
Uchar i;
WRCommand(addr); //设定DDRAM地址
for(i=0;i<count;i++){
WRData(chinese[2*i]);
WRData(chinese[2*i+1]);
}
}
//PLL初始化
void PLLInit(void){
PCTL=0; //关闭PLL,准备进行设置
PBWC=0x80; //自动带宽模式
PCTL=1; //R=1
PMSH=1;
PMSL=0x2c; //N=012c
PMRS=0x80; //L=80
PCTL=0x22; //E=2,PLLON=1,启动PLL
while(!(PBWC&0x40)); //等待稳定输出
PCTL|=0x10; //频率锁定,选PLL作为时钟源
}
/* 系统集成模块(SIM)初始化,禁止COP(看门狗)*/
void SIMInit(void) {
CONFIG2=0x01; /* 内部总线时钟用作SCI的时钟*/
CONFIG1=0x3d; /* 允许LVE复位信号,禁止LVI的电源,LVI工作在5V,*/
/* 经过32个CGMXCLK周期退出STOP模式,禁止COP模块 */
}
//主函数
void main(void){
sei(); //关中断
SIMInit(); //SIM初始化
PLLInit(); //PLL初始化
DDRC=0x0F;
PTCPUE=0xf7; //上拉电阻允许,PTC3-PTC0为高电平,即PSB=0,SCLK=1,SID=1,CS=1
PTC&=0xF7; //CS=0;
PTC|=0x01; //CS=1; CS加上升沿
menu(); //主菜单显示
KeyInit(); //键盘中断初始化
cli(); //开中断
for(;;); //等待键盘中断,并进行处理
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -