📄 6963c.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 + -