m12232a.c
来自「液晶12232A程序」· C语言 代码 · 共 1,913 行 · 第 1/4 页
C
1,913 行
返回值:
************************************************************************/
void lcdwd(uchar dispdata){
if(Lcd_CurrentX<61){
lcdwd1(dispdata);
}
else{
lcdwd2(dispdata);
}
}
/************************************************************************
函数名:
参数:
功能:内部数据地址指针定位
返回值:
************************************************************************/
void lcdpos(void){
if(Lcd_CurrentX<61){
lcdwc(LCD_CMD_COL|(Lcd_CurrentX&0x3f)); //设置地址列指针(芯片1)
}
else{
lcdwc(LCD_CMD_COL|((Lcd_CurrentX-61)&0x7f)); //设置地址列指针(芯片2)
}
lcdwc(LCD_CMD_PAGE|((Lcd_CurrentY/8)&0x3)); //设置地址页指针
}
/************************************************************************
函数名:
参数:
功能:读数据
返回值:
************************************************************************/
uchar lcdrd(void){
uchar i;
if(Lcd_CurrentX<61){
i=lcdrd1(); //读两次
i=lcdrd1();
}
else{
i=lcdrd2();
i=lcdrd2();
}
lcdpos();
return i;
}
/************************************************************************
函数名:
参数:
功能:当前坐标移动到下一个点
返回值:
************************************************************************/
void lcdcursornext(void){
Lcd_CurrentX++;
if(Lcd_CurrentX>LCD_RIGHT){
Lcd_CurrentX=LCD_LEFT;
Lcd_CurrentY+=8;
if(Lcd_CurrentY>LCD_BOTTOM){
Lcd_CurrentY=LCD_TOP;
}
}
}
/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void displaybyte(uchar dispdata){
lcdpos(); //内部数据地址指针定位
lcdwd(dispdata); //写数据
lcdcursornext(); //当前坐标移动到下一个点
}
/************************************************************************
函数名:
参数:
功能:整屏显示
返回值:
************************************************************************/
void lcdfill(uchar FillData){
for(Lcd_CurrentX=LCD_LEFT,Lcd_CurrentY=LCD_TOP;1;){
DogReset();
displaybyte(FillData);
if((Lcd_CurrentX==LCD_LEFT)&&(Lcd_CurrentY==LCD_TOP)){
break;
}
}
}
/************************************************************************
函数名:
参数:
功能:初始化
返回值:
************************************************************************/
void lcdreset(){
lcdwc1(0xe2); lcdwc2(0xe2); //复位
lcdwc1(0xc0); lcdwc2(0xc0); //设置显示初始行
lcdwc1(0xa0); lcdwc2(0xa0); //设置列序方向为正向
lcdwc1(0xa4); lcdwc2(0xa4); //设置显示模式为正常显示
lcdwc1(0xa9); lcdwc2(0xa9); //设置占空比为1/32
lcdwc1(0xaf); lcdwc2(0xaf); //开显示
}
/**************************************************************************
* 函数原型: void ComOutChar(unsigned char OutData);
* 功 能: 向串口输出一个字符(非中断方式)
**************************************************************************/
/*
void ComOutChar(unsigned char OutData){
SBUF = OutData; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
}
/**************************************************************************
* 函数原型: unsigned char KeyScan(void);3*3键盘
* 功 能: 对按键进行扫描,返回键值
**************************************************************************/
/*
uint KeyScan(void){
uint iColumnScan;
uint iKey;
KS1=0;
KS2=0;
KS3=0;
if((P1&0x07)==0x07){
KS1=1;
KS2=1;
KS3=1;
return(vKeyVal_Null); // 若无键按下,则返回0,并清除键值
}
iKey=0;
// 扫描第一行
KS1=0;
KS2=1;
KS3=1;
if((P1&0x07)!=0x07){
iColumnScan=~(P1&0x07)&0x07; // 被按下键对应位为1
iColumnScan&=0x0007;
iKey|=iColumnScan;
}
// 扫描第二行
KS1=1;
KS2=0;
KS3=1;
if((P1&0x07)!=0x07){
iColumnScan=~(P1&0x07)&0x07; // 被按下键对应位为1
iColumnScan<<=4;
iColumnScan&=0x0070;
iKey|=iColumnScan;
}
// 扫描第三行
KS1=1;
KS2=1;
KS3=0;
if((P1&0x07)!=0x07){
iColumnScan=~(P1&0x07)&0x07; // 被按下键对应位为1
iColumnScan<<=8;
iColumnScan&=0x0700;
iKey|=iColumnScan;
}
KS1=1;
KS2=1;
KS3=1;
return(iKey);
}
/**************************************************************************
* 函数原型: unsigned char KeyScan(void);3*4键盘
* 功 能: 对按键进行扫描,返回键值
**************************************************************************/
uint KeyScan(void){
uint iColumnScan;
uint iKey;
P1&=0x8f;
if((P1&0x0f)==0x0f){
P1|=0x70;
return(vKeyVal_Null); // 若无键按下,则返回0,并清除键值
}
iKey=0;
// 扫描第一行
P1&=0x8f;
P1|=0x60;
if((P1&0x0f)!=0x0f){
iColumnScan=~(P1&0x0f)&0x0f; // 被按下键对应位为1
iColumnScan&=0x000f;
iKey|=iColumnScan;
}
// 扫描第二行
P1&=0x8f;
P1|=0x50;
if((P1&0x0f)!=0x0f){
iColumnScan=~(P1&0x0f)&0x0f; // 被按下键对应位为1
iColumnScan<<=4;
iColumnScan&=0x00f0;
iKey|=iColumnScan;
}
// 扫描第三行
P1&=0x8f;
P1|=0x30;
if((P1&0x0f)!=0x0f){
iColumnScan=~(P1&0x0f)&0x0f; // 被按下键对应位为1
iColumnScan<<=8;
iColumnScan&=0x0f00;
iKey|=iColumnScan;
}
P1|=0x70;
return(iKey);
}
/**************************************************************************
* 函数原型: unsigned char KeyScan(void);4*4键盘
* 功 能: 对按键进行扫描,返回键值
**************************************************************************/
/*
uint KeyScan(void){
uint iColumnScan;
uint iKey;
P1&=0x0f;
if((P1&0x0f)==0x0f){
P1|=0xf0;
return(vKeyVal_Null); // 若无键按下,则返回0,并清除键值
}
iKey=0;
// 扫描第一行
P1&=0x0f;
P1|=0x70;
if((P1&0x0f)!=0x0f){
iColumnScan=~(P1&0x0f)&0x0f; // 被按下键对应位为1
iColumnScan&=0x000f;
iKey|=iColumnScan;
}
// 扫描第二行
P1&=0x0f;
P1|=0xb0;
if((P1&0x0f)!=0x0f){
iColumnScan=~(P1&0x0f)&0x0f; // 被按下键对应位为1
iColumnScan<<=4;
iColumnScan&=0x00f0;
iKey|=iColumnScan;
}
// 扫描第三行
P1&=0x0f;
P1|=0xd0;
if((P1&0x0f)!=0x0f){
iColumnScan=~(P1&0x0f)&0x0f; // 被按下键对应位为1
iColumnScan<<=8;
iColumnScan&=0x0f00;
iKey|=iColumnScan;
}
// 扫描第四行
P1&=0x0f;
P1|=0xe0;
if((P1&0x0f)!=0x0f){
iColumnScan=~(P1&0x0f)&0x0f; // 被按下键对应位为1
iColumnScan<<=8;
iColumnScan&=0xf000;
iKey|=iColumnScan;
}
P1|=0xf0;
return(iKey);
}
/**************************************************************************
* 函数原型: uchar KeyAction(void);
* 功 能: 按键动作类型
返 回 值: 当按键为空, 返回值为vKeyType_Null=0
当按键按下时,返回值为vKeyType_Push=1
当按键弹起时,按回值为vKeyType_Pop =2
当按键长按时,返回值为vKeyType_Keep=3
*************************************************************************/
uchar KeyAction(void){
uint iVal;
iVal=KeyScan();
if(iVal==iKeyVal){
// 无按键
if(iVal==vKeyVal_Null){
return(vKeyAct_Null);
}
// 按键保持
else{
return(vKeyAct_Keep);
}
}
else{
delay_ms(20);
if(KeyScan()==iVal){
// 按键弹起
if(iVal==vKeyVal_Null){
iKeyValPre=iKeyVal;
iKeyVal=iVal;
return(vKeyAct_Pop);
}
// 按键按下
else{
iKeyValPre=iKeyVal;
iKeyVal=iVal;
return(vKeyAct_Push);
}
}
}
}
/**************************************************************************
* 函数原型: void KeyHandle(void);
* 功 能: 处理键盘输入
**************************************************************************/
void KeyHandle(void){
uchar cKeyType;
uchar i;
DogReset();
cKeyType=KeyAction();
if(cKeyType==vKeyAct_Push){
switch(iKeyVal){
case vKeyVal_1:
SBUF=0x01;
// lcdfill(0); //清屏
if(KeyCount++>Count){
KeyCount=0;
}
DisplayRecord(KeyCount);
break;
case vKeyVal_2:
SBUF=0x02;
// lcdfill(0); //清屏
DisplayTime();
break;
case vKeyVal_3:
SBUF=0x03;
// lcdfill(0); //清屏
break;
case vKeyVal_4://开机次数
SBUF=0x04;
// lcdfill(0); //清屏
break;
case vKeyVal_5://开始时长
SBUF=0x05;
// lcdfill(0); //清屏
break;
case vKeyVal_6:
SBUF=0x06;
break;
case vKeyVal_7:
SBUF=0x07;
// lcdfill(0); //清屏
break;
case vKeyVal_8:
SBUF=0x08;
// lcdfill(0); //清屏
break;
case vKeyVal_9:
SBUF=0x09;
// lcdfill(0); //清屏
timeRead();
vSecond=0;
vSecondST=0;
Byte_Write(vSecondAddr, 0);//秒清零
break;
case vKeyVal_10:
SBUF=0x10;
// lcdfill(0); //清屏
timeRead();
vMinute=0;
vMinuteST=0;
Byte_Write(vMinuteAddr, 0);//分清零
break;
case vKeyVal_11:
SBUF=0x11;
// lcdfill(0); //清屏
timeRead();
vHour=0;
vHourST=0;
Byte_Write(vHourAddr, 0);//时清零
break;
case vKeyVal_12:
SBUF=0x12;
// lcdfill(0); //清屏
lcdfill(0); //清屏
Count=0;
Byte_Write(CountAddr, Count);
for(i=0;i<Count;i++){
Sector_Erase(RecordBaseAddr+i*0x1ff);//记录相应也要清除
}
WriteString(0, 16, "次数:00");//次数清零
WriteString(0, 0, "时间:");
break;
case vKeyVal_13:
SBUF=0x13;
// lcdfill(0); //清屏
break;
case vKeyVal_14:
SBUF=0x14;
// lcdfill(0); //清屏
break;
case vKeyVal_15:
SBUF=0x15;
// lcdfill(0); //清屏
break;
case vKeyVal_16:
SBUF=0x16;
// lcdfill(0); //清屏
break;
default:
break;
}
}
}
/**************************************************************************
* 函数原型: uchar BcdToHex(uchar cCh);
* 功 能: 一个BCD码转化为十六进制数
**************************************************************************/
/*
uchar BcdToHex(uchar cCh){
if((cCh&0xf0)<0xa0){
if((cCh&0x0f)<0x0a){
return((cCh>>4)*10+(cCh&0x0f));
}
else{
return(cCh>>4);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?