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

📄 6963c.c

📁 一个在51单片机下PS/2键盘的应用
💻 C
字号:
/*  www.wzlab.com *  LCM  控制芯片6963 点阵数量240×128 *  实现初级接口 *  编程工具:gcc avr */#include "6963c.h"unsigned char cur_row,cur_col;  // 当前行、列存储,行高16点,列宽8点/*		取当前行数据		*/unsigned char get_row(void){		return cur_row;}/*		取当前列数据		*/unsigned char get_col(void){	return cur_col;}/*		颠倒位函数		*/unsigned char upend(unsigned char a){	unsigned char b,i;	b=0;	for(i=0;i<8;i++){		if(((a<<(7-i))&0x80)!=0){			b|=1<<(7-i);		}	}		  return b;}/*		芯片时序		*//*		读取状态位		*/unsigned char r_sta(void){	unsigned char tmp;      	DDRC =0x00;   //作为输入口用	PORTA |= (1<<CD);    //CD  =  1;	      	PORTA  &=~(1<<RD);   //RD  =  0;	_NOP();_NOP();	tmp =PINC;	PORTA  |=(1<<RD);   //RD  =  1;	DDRC=0xFF;	return upend(tmp);  }unsigned char r_dt(void){	unsigned char tmp;      	DDRC =0x00;   //作为输入口用	PORTA &=~(1<<CD);    //CD  =  0;	      	PORTA  &=~(1<<RD);   //RD  =  0;	_NOP();_NOP();	tmp =PINC;	PORTA  |=(1<<RD);   //RD  =  1;	DDRC=0xFF;	return upend(tmp);  }/* 	         写数据			*/void  w_data(unsigned char data){//	DDRC=0xFF;	PORTA &=~ (1<<CD);    //CD  = 0	PORTC=upend(data);//	PORTA  |=(1<<RD);   //RD  =  1;	PORTA  &=~(1<<WR);  //WR  =  0;	_NOP();_NOP();	PORTA  |=(1<<WR);   //WR  =  1;		}/*		写命令			*/void w_command(unsigned char cmd){//	DDRC=0xFF;	PORTA |=(1<<CD);    //CD  = 1;	PORTC=upend(cmd);//	PORTA  |=(1<<RD);   //RD  =  1;		PORTA  &=~(1<<WR);  //WR  =  0;	_NOP();_NOP();	PORTA  |=(1<<WR);   //WR  =  1;}/************************************************//* 状态位STA1,STA0判断(读写指令和读写数据)    *//* 在读写数据或者写入命令前必须保证均为1      	*//************************************************/unsigned char judge_sta01(void)	//	fnSTA01(void){  	unsigned char i;  	for(i=5;i>0;i--)  	{    		if ((r_sta()&0x03)==0x03)// 读取状态LCMDW      		      break;	         	}  	return i;          			// 若返回零,说明错误}/********************************************************//*检查STA2,如果 STA2=1 为自动读状态      		*//********************************************************/unsigned char judge_sta2(void)	//fnSTA2(void){  	unsigned char i;  	for(i=5;i>0;i--)  	{  		if ( (r_sta()&0x04)==0x04)// 读取状态LCMDW      		break;	  	}  	return i;          			// 若返回零,说明错误}/********************************************************//* 状态位STA3判断(STA3 = 1 数据自动写状态)    	*//********************************************************/unsigned char judge_sta3(void)	//fnSTA3(void){	unsigned char i;     for(i=5;i>0;i--){     	if ( (r_sta()&0x08)==0x08)// 读取状态LCMDW	break;	}  	return i;          			// 若返回零,说明错误}/********************************************************//* 状态位STA6判断(STA6 =1 屏读/屏拷贝状态)    	*//********************************************************/unsigned char judge_sta6(void)	//fnSTA6(void){  	unsigned char i;  	for(i=5;i>0;i--){  		if ((r_sta()&0x80)==0x80)// 读取状态LCMDW      		break;	         	}  	return i;          			// 若返回零,说明错误}/********************************************************//* 写双参数的指令          				*//********************************************************/unsigned char w2para(unsigned char cmd,unsigned char para1,unsigned char para2)	//fnPR1(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2){  	if(judge_sta01() == 0)    		return 1;	  	w_data(para1);	  	if(judge_sta01() == 0)    		return 2;	  	w_data(para2);	  	if(judge_sta01() == 0)    		return 3;						  	w_command(cmd);  	return 0;        		// 返回0成功}/********************************************************//* 写单参数的指令          				*//********************************************************/unsigned char w1para(unsigned char cmd,unsigned char para)	//fnPR11(unsigned char uCmd,unsigned char uPar1){  	if(judge_sta01() == 0)    		return 1;  	w_data(para);	  	if(judge_sta01() == 0)    		return 2;	  	w_command(cmd);  	return 0;        		// 返回0成功}/********************************************************//* 写无参数的指令                    			*//********************************************************/unsigned char w0para(unsigned char cmd)	//fnPR12(unsigned char uCmd){  	if(judge_sta01() == 0)    		return 1;	        w_command(cmd);  	return 0;        		// 返回0成功}/********************************************************//*		写数据                			*//********************************************************/unsigned char wdata(unsigned char data)	//fnPR13(unsigned char uData){  	if(judge_sta3() == 0)    		return 1;  	w_data(data);  	return 0;        		// 返回0成功}/********************************************************//* 读数据            					*//********************************************************/unsigned char rdata(void)		//fnPR2(void){	unsigned char temp;  	if(judge_sta01() == 0)      return 1;    	// 获取状态,如果状态错      temp=r_dt();      return temp;        		// 返回数据}/********************************************************//* 设置当前地址            				*//********************************************************/void set_pos(unsigned char row, unsigned char col)		//fnSetPos(unsigned char urow, unsigned char ucol){  	unsigned int  pos;  	pos = (unsigned int)row * 30 + col;  	w2para(LC_ADD_POS,pos & 0xFF,pos / 256);  	cur_row = row;  	cur_col = col;}/********************************************************//* 设置当前显示行、列          				*//********************************************************/void cursor(unsigned char row, unsigned char col){  	set_pos(row * 16, col);}/********************************************************//* LCM 初始化            				*//********************************************************/unsigned char lcm_init(void){  	w2para(LC_TXT_STP,TEXT_ADD%256,TEXT_ADD/256);   	// 文本显示区首地址  	w2para(LC_TXT_WID,0x1E,0x00);    	// 文本显示区宽度  	w2para(LC_GRH_STP,GRH_ADD%256,GRH_ADD/256);    	// 图形显示区首地址  	w2para(LC_GRH_WID,0x1E,0x00);    	// 图形显示区宽度  	  	w0para(LC_CUR_SHP | 0x00);    		// 光标形状  	w0para(LC_MOD_XOR);      		// 显示方式设置  	w0para(LC_DIS_SW | 0x0F);    		// 显示开关设置  0x08  	return 0;}/********************************************************//*			图形清屏			*//********************************************************/void cls(void){  	unsigned int  i;  	w2para(LC_ADD_POS,GRH_ADD%256,GRH_ADD/256);    // 置地址指针为从零开始  	w0para(LC_AUT_WR);      	// 自动写  	for(i=0;i<240*128/8;i++){    	// 清一屏    		judge_sta3();    		wdata(0x00);      	// 写数据,实际使用时请将0x55改成0x0    	}  	w0para(LC_AUT_OVR);      	// 自动写结束  	w2para(LC_ADD_POS,0x00,0x00);  	// 重置地址指针  	cur_row = 0;        		// 置地址指针存储变量  	cur_col = 0;}/********************************************************//*		 文字清屏			             *//********************************************************/void cls_txt(void){    unsigned int  i;    w2para(LC_ADD_POS,TEXT_ADD%256,TEXT_ADD/256);    // 置地址指针为从零开始    w0para(LC_AUT_WR);      	// 自动写    for(i=0;i<240*128/8;i++){    	// 清一屏	    judge_sta3();	    wdata(0x00);      	// 写数据,实际使用时请将0x55改成0x0	}    w0para(LC_AUT_OVR);      	// 自动写结束    w2para(LC_ADD_POS,0x00,0x00);  	// 重置地址指针    cur_row = 0;        		// 置地址指针存储变量    cur_col = 0;}//光标位置闪烁void cursor_p(unsigned char row, unsigned char col){    //cursor(uRow,uCol);    //fnGetRow();    //fnGetCol();    w2para(LC_CUR_POS,row,col);//gCurRow,gCurCol); }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -