📄 lcd.c
字号:
//深圳瑞特RT12864M(控制器ST7920A)
//并行连接方式,PTC0-RS,PTC1-RW,PTC2-E
#include "gp32.h"
typedef unsigned int Uint;
typedef unsigned char Uchar;
#define cli() _asm("cli\n") /*开中断*/
#define sei() _asm("sei\n") /*关中断*/
//定义位操作的结构体
typedef struct bits {
Uchar b0:1;
Uchar b1:1;
Uchar b2:1;
Uchar b3:1;
Uchar b4:1;
Uchar b5:1;
Uchar b6:1;
Uchar b7:1;
}BITS;
typedef union bit_char {
Uchar byte;
BITS b;
} BIT_CHAR;
#define BSET(x, y) ((x).b.b ## y = 1)
#define BCLR(x, y) ((x).b.b ## y = 0)
@tiny volatile BIT_CHAR PTC @0x02; //重新定义PTC口,使其能进行位操作
extern void menu(void);
const Uchar delay=40; //延时时间常数
//延迟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();
}
//读忙标志
void RDBF(void){
Uchar temp;
DDRB=0x00; //数据线为输入
DDRC=0x0F; //控制线为输出
BCLR(PTC,2); // E=0
BSET(PTC,1); // RW=1
BCLR(PTC,0); // RS=0
while(1){
BSET(PTC,2); // E=1
temp=PTB;
BCLR(PTC,2); // E=0
if ((temp&0x80)==0) break;
}
}
//写数据到指令寄存器
void WRCommand(Uchar comm){
RDBF();
DDRB=0xff;
BCLR(PTC,2); // E=0
BCLR(PTC,1); // RW=0
BCLR(PTC,0); // RS=0
BSET(PTC,2); // E=1
PTB=comm;
BCLR(PTC,2); // E=0
}
//写数据到数据寄存器
void WRData(Uchar data){
RDBF();
DDRB=0xff;
BCLR(PTC,2); // E=0
BCLR(PTC,1); // RW=0
BSET(PTC,0); // RS=1
BSET(PTC,2); // E=1
PTB=data;
BCLR(PTC,2); // E=0
}
//初始化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=0xFF; //上拉电阻允许,PTC3-PTC0为高电平,即PSB=1,E=1,RW=1,RS=1
menu(); //主菜单显示
KeyInit(); //键盘中断初始化
cli(); //开中断
for(;;); //等待键盘中断,并进行处理
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -