m12232a.c
来自「液晶12232A程序」· C语言 代码 · 共 1,913 行 · 第 1/4 页
C
1,913 行
}
else{
if((cCh&0x0f)<0x0a){
return(cCh&0x0f);
}
else{
return(0);
}
}
}
/**************************************************************************
* 函数原型: uchar HexToChar(uchar cCh);
* 功 能: 一个HEX字节转化为字符
**************************************************************************/
uchar HexToChar(uchar cCh){
if(cCh>=0&&cCh<10){
return(0x30+cCh);
}
else{
return(0x57+cCh);
}
}
/**************************************************************************
* 函数原型: void CursorFlash(void);
* 功 能: 光标闪动
**************************************************************************/
/*
void CursorFlash(void){
if(bFlash){
WriteString(1, 0, "_");
}
else{
WriteString(1, 0, " ");
}
}
/**************************************************************************
* 函数原型: void Sector_Erase(uint addres)
* 功 能: 扇区擦除
**************************************************************************/
void Sector_Erase(uint addres){
// uchar i;
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR|=0x80; //设时间与充ISP操作。
ISP_CMD=0x03; //扇区命命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
_nop_();
// for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
/**************************************************************************
* 函数原型: void Byte_Write(uint addres,uchar write_data)
* 功 能: 单字节写数据
**************************************************************************/
void Byte_Write(uint addres,uchar write_data){
// uchar i;
ISP_DATA=write_data; //要写入的数据。
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR|=0x80; //设时间与充ISP操作。
ISP_CMD=0x02; //写命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
_nop_();
// for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
/**************************************************************************
* 函数原型: void Byte_Read(uint addres)
* 功 能: 单字节读数据
**************************************************************************/
uchar Byte_Read(uint addres){
// uchar i;
uchar caData;
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR|=0x80; //设时间与充ISP操作。
ISP_CMD=0x01; //写命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。
_nop_();
// for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
caData=ISP_DATA;
return(caData);
}
/***********************************************************************************
函数名:void timeRead(void)
功能:保存参数
返回值:
***********************************************************************************/
void timeRead(void){
vSecond=Byte_Read(vSecondAddr)+1;
vMinute=Byte_Read(vMinuteAddr);
vHour=Byte_Read(vHourAddr);
}
/***********************************************************************************
函数名:void TimeSave(void)
功能:保存参数
返回值:
***********************************************************************************/
void TimeSave(void){
Sector_Erase(UseAddr);
Byte_Write(vSecondAddr, vSecond);
Byte_Write(vMinuteAddr, vMinute);
Byte_Write(vHourAddr, vHour);
}
/***********************************************************************************
函数名:void CountRead(void)
功能:保存参数
返回值:
***********************************************************************************/
void CountRead(void){
Count=Byte_Read(CountAddr);
}
/***********************************************************************************
函数名:void CountSave(void)
功能:保存参数
返回值:
***********************************************************************************/
void CountSave(void){
CountRead();
Sector_Erase(CountAddr);
if(Count++>50){
Count=0;
}
Byte_Write(CountAddr, Count);
}
/**************************************************************************
* 函数原型: void DisplayTime(void);
* 功 能: 时间显示
**************************************************************************/
void DisplayTime(void){
uchar *p;
uchar cTemp[9];
p=cTemp;
cTemp[0]=HexToChar(vHour/10);
cTemp[1]=HexToChar(vHour%10);
cTemp[2]=0x3a;
cTemp[3]=HexToChar(vMinute/10);
cTemp[4]=HexToChar(vMinute%10);
cTemp[5]=0x3a;
cTemp[6]=HexToChar(vSecond/10);
cTemp[7]=HexToChar(vSecond%10);
cTemp[8]=0x0a;
put_str_xy(40, 0, cTemp);
}
/**************************************************************************
* 函数原型: void DisplayCount(void);
* 功 能: 时间显示
**************************************************************************/
void DisplayCount(void){
uchar *p;
uchar cTemp[3];
p=cTemp;
cTemp[0]=HexToChar(Count/10);
cTemp[1]=HexToChar(Count%10);
cTemp[2]=0x0a;
put_str_xy(40, 16, cTemp);
}
/***********************************************************************************
函数名:void RecordSave(uchar number)
功能:保存每次具体参数
返回值:
***********************************************************************************/
void RecordSave(void){
uchar cTemp[3];
cTemp[0]=vSecondST;
cTemp[1]=vMinuteST;
cTemp[2]=vHourST;
Sector_Erase(RecordBaseAddr+0x1ff*Count);
Byte_Write(RecordBaseAddr+0+0x1ff*Count, cTemp[0]);
Byte_Write(RecordBaseAddr+1+0x1ff*Count, cTemp[1]);
Byte_Write(RecordBaseAddr+2+0x1ff*Count, cTemp[2]);
}
/***********************************************************************************
函数名:void DisplayRecord(uchar number)
功能:显示每次具体参数
返回值:
***********************************************************************************/
void DisplayRecord(uchar number){
uchar *p;
uchar cTemp[9];
uchar i;
uchar cNum[3];
for(i=0;i<3;i++){
cNum[i]=Byte_Read(RecordBaseAddr+i+0x1ff*number);
}
p=cTemp;
cTemp[0]=HexToChar(cNum[2]/10);
cTemp[1]=HexToChar(cNum[2]%10);
cTemp[2]=0x3a;
cTemp[3]=HexToChar(cNum[1]/10);
cTemp[4]=HexToChar(cNum[1]%10);
cTemp[5]=0x3a;
cTemp[6]=HexToChar(cNum[0]/10);
cTemp[7]=HexToChar(cNum[0]%10);
cTemp[8]=0x0a;
put_str_xy(40, 0, cTemp);
}
/**************************************************************************
* 函数原型: void ChipInit(void);
* 功 能: 对CPU及外部的硬件资源进行初始化
**************************************************************************/
void ChipInit(void){
IE=0;
// 使用外部扩展RAM,允许ALE输出
#if STC89C58
AUXR=0x00; // 禁止使用外部扩展RAM,允许ALE输出
#elif W77E58
CKCON=0xc1; // CKCON.2-0 = 100, MOVX指令用6个机器周期;CKCON.2-0 = 001, MOVX指令用3个机器周期
#endif
// 定时器控制字初始化
TMOD=0x21; // 定时器1为方式1,定时器0为方式1
T2CON=0x0d; // 选择定时器1为波特率发生器,T2为捕获工作方式
ET0=1;
TH0=vT0HVal; // 启动定时器0
TL0=vT0LVal;
TR0=1;
// UART全双工串口的初始化
SCON = 0x50; // 串口模式1,8位UART,接收使能
TH1 = vBaudTime; // 波特率目前为9600Hz
PCON&=0x7f; // 串口通信速率倍数为1
TR1=1; // 启动波特率发生器
ES=1; // 允许串口中断
// 优先级设置
IPH = 0x02;
IP = 0x02;
EA=1;
// 系统看门狗设定
Dog_Init();
lcdreset();
}
/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void systeminitial(void){
ChipInit();
lcdfill(0xff); //整屏显示
delay_ms(100);
lcdfill(0); //清屏
delay_ms(100);
vSecond=0;
vMinute=0;
vHour=0;
vSecondST=0;
vMinuteST=0;
vHourST=0;
FlashTime=250;
SBUF=0x55;
}
/************************************************************************
函数名:
参数:
功能:
返回值:
************************************************************************/
void main(void){
// uchar fosX=0,fosY=0,temp=1;
// uchar idata *p;
systeminitial();
while(1){
if(!bFlag){
bFlag=1;
timeRead();
delay_ms(100);//不加延时,则次数不能存储
CountSave();
WriteString(0, 16, "次数:");
DisplayCount();
WriteString(0, 0, "时间:");
DisplayTime();
}
DogReset();
KeyHandle();
// CursorFlash();
// DisplayTime();
if(b_1Min){
b_1Min=0;
TimeSave();
delay_ms(100);
RecordSave();
// DisplayTime();
}
/*
p=&Str[13];
put_str_xy(fosX,fosY,Str);
if(*p!=0x39)(*p)++;
if(*p==0x39){
if(Str[12]==0x36) Str[12]=0x30;
else Str[12]+=1;
if(temp<65){
if(fosY<32) {
fosY++;
fosX=0;
}
else {
*p=0x30;
fosY=0;
}
}
else{
if(fosX<122) {
fosY=0;
fosX++;
}
else {
temp=0;
fosX=0;
lcdfill(0); //清屏
delay_ms(100);
*p=0x30;
}
}
temp++;
if(temp==65)*p=0x30;
}*/
}
}
/**************************************************************************
* 函数原型: void Trint0(void) interrupt 1 using 1;
* 功 能: 全局定时
**************************************************************************/
void Trint0(void) interrupt 1 using 1{
// TR0=0; // 时基500uS
TH0=vT0HVal;
TL0=vT0LVal;
// TR0=1;
TF0=0;
if(!(--cT01ms)){
cT01ms=vT01MS;
if(iDY_Timer!=0xffff){ // 定时器标准定时
if(iDY_Timer!=0x0000){
--iDY_Timer;
}
else{
iDY_Timer=0xffff;
}
}
if(!(--cT010ms)){
cT010ms=vT010MS;
if(FlashTime!=0xff){ // 定时器标准定时
if(FlashTime!=0x00){
--FlashTime;
}
else{
bFlash=!bFlash;
}
}
if(!(--cT01s)){
cT01s=vT01S;
b_1Min=1;
if(++vSecondST>59){
vSecondST=0;
if(++vMinuteST>59){
vMinuteST=0;
if(++vHourST>99){
vHourST=0;
}
}
}
if(++vSecond>59){
vSecond=0;
// b_1Min=1;
if(++vMinute>59){
vMinute=0;
if(++vHour>99){
vHour=0;
}
}
}
}
}
}
}
/************************************************************************
END
************************************************************************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?