⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 【液晶显示器的C语言程序设计 Freescale 8位微控制器】一书的光盘
💻 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 + -