|
- /* MAIN.C file
- *
- * Copyright (c) 2002-2005 STMicroelectronics
- */
- #include <stm8s003f3.h>
- // - - 定义函数
- #define BIAS 0x52 //0b1000 0101 0010 1/3duty 4com
- #define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
- #define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡器
- #define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压
- #define LCDON 0X06 //0b1000 0000 0110 打开LCD偏压
- #define XTAL 0x28 //0b1000 0010 1000 外部接时钟
- #define RC256 0X30 //0b1000 0011 0000 内部时钟
- #define TONEON 0X12 //0b1000 0001 0010 打开声音输出
- #define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
- #define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗
- #define WDTDIS 0X0A
- unsigned int b,v,v1,i,miao,fen,shi,e,f,yu;
- unsigned char m,n,m1,n1,miaodian;
- unsigned int flag,year,month,day,hour,min,a,keytime,set;
- unsigned char
- Ht1621wTab[]={0x0b,0x00,0x07,0x05,0x0c,0x0d,0x0f,0x00,0x0f,0x0d}; //seg 16
- unsigned char
- Ht1621cTab[]={0x0f,0x07,0x0d,0x0f,0x07,0x0b,0x0b,0x0f,0x0f,0x0f}; //seg 17
- unsigned char
- Ht1621dTab[]={0x0e,0x06,0x0c,0x0e,0x06,0x0a,0x0a,0x0e,0x0e,0x0e}; //seg 17
- unsigned char
- Ht1621eTab[]={0x00,0x0a,0x0d,0x0e};
- _Bool CS @PC_ODR:5;
- _Bool WR @PC_ODR:6;
- _Bool DAT @PC_ODR:7;
- _Bool SCLK @PD_ODR:4;
- _Bool SDA @PD_ODR:5;
- _Bool RST @PD_ODR:6;
- _Bool k1 @PB_IDR:4;
- _Bool k2 @PC_IDR:3;
- _Bool k3 @PC_IDR:4;
- //HT1621控制位(液晶模块接口定义,根据自已的需要更改)
- #define CLS_HT_WR WR = 0 //拉低
- #define SET_HT_WR WR = 1 //拉高
- #define CLS_HT_CS CS = 0 //拉低
- #define SET_HT_CS CS = 1 //拉高
- #define SET_HT_DAT DAT= 1 //数据位
- #define CLS_HT_DAT DAT = 0 //数据位
- //GPIO口设置
- void port_init(void)
- {
- PB_DDR |= 0x20;
- PB_CR1 |= 0x20;
- PB_CR2 |= 0x00;
- PD_DDR |= 0x74;
- PD_CR1 |= 0x04;
- PD_CR2 |= 0x00;
- PC_DDR |= 0xe0;
- PC_CR1 |= 0xe0;
- PC_CR2 |= 0x00;
- }
- void Init(void)
- {
- // CLK_ICKR |= 0x01; //打开内部高速RC
- //CLK_CKDIVR = 0x10; //HSI--4MHZ
- CLK_CKDIVR = 0x00;
- }
- //-----------------------------------------------------------------------------------------
- //函数名称:Delay()
- //功 能:延时子程序
- //-----------------------------------------------------------------------------------------
- void Delay(char us) //5,7,9
- {
- while(--us);
- }
- //-----------------------------------------------------------------------------------------
- //函数名称:DelayMS()
- //功 能:延时子程序
- //-----------------------------------------------------------------------------------------
- void DelayMS(int iMs)
- {
- int i,j;
- for(i=0;i<iMs;i++)
- for(j=0;j<65;j++)
- {
- Delay(1);
- }
- }
- void writebyb(unsigned char temp)
- {
- unsigned char i;
- SCLK=0;
- Delay(20);
- for(i=0;i<8;i++)
- {
- SDA=temp&0x01;
- Delay(5);
- SCLK=1;
- Delay(5);
- SCLK=0;
- temp>>=1;
- }
- }
- void write(unsigned char adress,unsigned char dat)
- {
- RST=0;
- SCLK=0;
- RST=1;
- Delay(20);
- writebyb(adress);
- writebyb(dat);
- SCLK=1;
- RST=0;
- }
- unsigned char readbybe(void)
- {
- unsigned i,dat;
- Delay(2);
- for(i=0;i<8;i++)
- {
- dat>>=1;
- if(SDA==1)
- {
- dat|=0x80;
- }
- else
- {
- dat&=0x7f;
- }
- SCLK=1;
- Delay(5);
- SCLK=0;
- Delay(5);
- }
- return dat;
- }
- unsigned char read(unsigned char adress)
- {
- unsigned char temp;
- RST=0;
- SCLK=0;
- RST=1;
- Delay(1);
- writebyb(adress);
- temp=readbybe();
- SCLK=1;
- RST=0;
- SDA=0;
- return temp;
- }
- void ds1302(void)
- {
- write(0x8e,0x00);
- write(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
- write(0x82,((0/10)<<4|(0%10))); //根据写分寄存器命令字,写入分的初始值
- write(0x84,((12/10)<<4|(12%10))); //根据写小时寄存器命令字,写入小时的初始值
- write(0x86,((16/10)<<4|(16%10))); //根据写日寄存器命令字,写入日的初始值
- write(0x88,((11/10)<<4|(11%10))); //根据写月寄存器命令字,写入月的初始值
- write(0x8c,((8/10)<<4|(8%10))); //根据写小时寄存器命令字,写入小时的初始值
- write(0x8e,0x80);
- }
- void settime(void)
- {
- unsigned char ReadValue;
- ReadValue = read(0x81); //从秒寄存器读数据
- miao=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化
- ReadValue = read(0x83); //从分寄存器读
- min=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
- ReadValue = read(0x85); //从分寄存器读
- hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
- ReadValue = read(0x87); //从分寄存器读
- day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
- ReadValue = read(0x89); //从分寄存器读
- month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
- ReadValue = read(0x8d); //从分寄存器读
- year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
- }
- //-----------------------------------------------------------------------------------------
- //函数名称:Ht1621Wr_Data()
- //功 能:写数据函数,cnt为传送数据位数,数据传送为低位在前
- //-----------------------------------------------------------------------------------------
- void Ht1621Wr_Data(char Data,char cnt)
- {
- char i;
- for (i=0;i<cnt;i++)
- {
- CLS_HT_WR; //HT1621_WR=0;
- Delay(1);
- if((Data & 0x80)==0x80)
- {
- SET_HT_DAT; //HT1621_DAT=1;
- }
- else
- {
- CLS_HT_DAT; //HT1621_DAT=0;
- }
- SET_HT_WR; //HT1621_WR=1;
- Delay(1);
- Data<<=1;
- }
- }
- //----------------------------------------------------------
- //函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
- //功能描述: HT1621在指定地址写入数据函数
- //参数说明:Addr为写入初始地址,Data为写入数据
- //说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后
- //----------------------------------------------------------
- void Ht1621WrOneData(char Addr,char Data)
- {
- CLS_HT_CS; //HT1621_CS=0;
- Ht1621Wr_Data(0xa0,3); //写入数据标志101
- Ht1621Wr_Data(Addr<<2,6); //写入地址数据
- Ht1621Wr_Data(Data<<4,4); //写入数据
- SET_HT_CS;//HT1621_CS=1;
- }
- //-----------------------------------------------------------------------------------------
- //函数名称:void Ht1621WrAllData()
- //功能描述: HT1621连续写入方式函数
- //说 明:HT1621的数据位4位,此处每次数据为8位,写入数据总数按8位计算
- //-----------------------------------------------------------------------------------------
- void Ht1621WrAllData(void)
- {
- char i;
- CLS_HT_CS;//HT1621_CS=0;
- Ht1621Wr_Data(0xa0,3); //写入数据标志101
- Ht1621Wr_Data(0x00<<2,6); //写入地址数据
- for (i=0;i<16;i++)
- {
- Ht1621Wr_Data(0x00,8); //写入数据
- }
- SET_HT_CS;//HT1621_CS=1;
- }
- //-----------------------------------------------------------------------------------------
- //函数名称:void Ht1621WrCmd(uchar Cmd)
- //功能描述: HT1621命令写入函数
- //参数说明:Cmd为写入命令数据
- //说 明:写入命令标识位100
- //-----------------------------------------------------------------------------------------
- void Ht1621WrCmd(char Cmd)
- {
- CLS_HT_CS;//HT1621_CS=0;
- Delay(1);
- Ht1621Wr_Data(0x80,4); //写入命令标志100
- Ht1621Wr_Data(Cmd,8); //写入命令数据
- SET_HT_CS;//HT1621_CS=1;
- }
- //-----------------------------------------------------------------------------------------
- //函数名称:void Ht1621_Init(void)
- //功能描述: HT1621初始化
- //说 明:初始化后,液晶屏所有字段均显示
- //-----------------------------------------------------------------------------------------
- void Ht1621_Init(void)
- {
- SET_HT_CS;//HT1621_CS=1;
- SET_HT_WR;//HT1621_WR=1;
- SET_HT_DAT;//HT1621_DAT=1;
- DelayMS(20); //延时使LCD工作电压稳定
- Ht1621WrCmd(BIAS);
- Ht1621WrCmd(RC256); //使用内部振荡器
- Ht1621WrCmd(SYSDIS);
- Ht1621WrCmd(WDTDIS);
- Ht1621WrCmd(SYSEN);
- Ht1621WrCmd(LCDON);
- Ht1621WrCmd(TONEON);
- Ht1621WrCmd(TONEOFF);
- }
- void dispaytemp(int a)
- {
- int ge,shi,bai;
- bai=a/100;
- shi=(a-bai*100)/10;
- ge=a%10;
- Ht1621WrOneData(0x16,Ht1621wTab[bai]);
- Ht1621WrOneData(0x15,Ht1621cTab[bai]);
- Ht1621WrOneData(0x14,Ht1621wTab[shi]);
- Ht1621WrOneData(0x13,Ht1621cTab[shi]);
- Ht1621WrOneData(0x12,Ht1621wTab[ge]);
- Ht1621WrOneData(0x11,Ht1621cTab[ge]);
- }
- void dispaytime(int b)
- {
- int fge,fshi,sge,sshi;
- fshi=b/10;
- fge=b%10;
- Ht1621WrOneData(0x08,Ht1621cTab[fge]);
- Ht1621WrOneData(0x09,Ht1621wTab[fge]);
- Ht1621WrOneData(0x0a,Ht1621dTab[fshi]);
- Ht1621WrOneData(0x0b,Ht1621wTab[fshi]);
- }
- void dispaytime2(int c,int d)
- {
- int fge,fshi,sge,sshi;
- fshi=d/10;
- fge=d%10;
- sshi=c/10;
- sge=c%10;
- Ht1621WrOneData(0x08,Ht1621cTab[fge]);
- Ht1621WrOneData(0x09,Ht1621wTab[fge]);
- Ht1621WrOneData(0x0a,Ht1621cTab[fshi]);
- Ht1621WrOneData(0x0b,Ht1621wTab[fshi]);
- Ht1621WrOneData(0x0c,Ht1621cTab[sge]);
- Ht1621WrOneData(0x0d,Ht1621wTab[sge]);
- Ht1621WrOneData(0x0e,Ht1621eTab[sshi]);
- }
- void dispaynian(int nian,int yue,int ri)
- {
- int niange,nianshi,rige,rishi,yueshi,yuege;
- nianshi=nian/10;
- niange=nian%10;
- yueshi=yue/10;
- yuege=yue%10;
- rishi=ri/10;
- rige=ri%10;
- Ht1621WrOneData(0x1e,Ht1621cTab[nianshi]);
- Ht1621WrOneData(0x1f,Ht1621wTab[nianshi]);
- Ht1621WrOneData(0x1c,Ht1621cTab[niange]);
- Ht1621WrOneData(0x1d,Ht1621wTab[niange]);
- Ht1621WrOneData(0x19,Ht1621eTab[rishi]);
- Ht1621WrOneData(0x17,Ht1621cTab[rige]);
- Ht1621WrOneData(0x18,Ht1621wTab[rige]);
- if(yueshi==1)
- {
- Ht1621WrOneData(0x1a,Ht1621cTab[yuege]);
- Ht1621WrOneData(0x1b,Ht1621wTab[yuege]);
- }
- else
- {
- Ht1621WrOneData(0x1a,Ht1621dTab[yuege]);
- Ht1621WrOneData(0x1b,Ht1621wTab[yuege]);
- }
- }
- void CLK_Init(void)
- {
- CLK_CKDIVR = 0x00;
- }
- void di(void)//蜂鸣器
- {
- Ht1621WrCmd(TONEON);
- DelayMS(2000);
- Ht1621WrCmd(TONEOFF);
- }
- void TIM1_Init(void)
- {
- TIM1_CR1 = 0x00; //向上的计数方向,中断计数不停
- TIM1_IER = 0x01;
- TIM1_PSCRH = 0x3e; //进行16000分频
- TIM1_PSCRL = 0x80;
- TIM1_ARRH = 0x01;
- TIM1_ARRL = 0xf4;
- TIM1_CR1 |=0x01;
- }
- /*void TIM2_Init(void)
- {
- TIM2_IER = 0x00; //禁止中断
- TIM2_EGR =0x01; //允许产生更新标志
- TIM2_PSCR =0x01; //设置时钟分频 2M/2=1MHz---1us
- TIM2_ARRH = 0x00; //0x32=50; 周期=50次,每50us复位一次定时器2
- TIM2_ARRL = 0x32; //ARR自动装载值,每1us递减1
- TIM2_CNTRH=0x00; //初值
- TIM2_CNTRL=0x00;
- TIM2_CR1 |= 0x81; //开启定时器
- TIM2_IER |= 0x01; //允许中断
- }*/
- void ADC_Init(void)
- {
- ADC_CSR|= 0x04;
- ADC_CR1 = 0x00;
- ADC_CR2 = 0x30;
- }
- void ht1621d(void)
- {
- /* if(yu==0)
- {
- Ht1621WrOneData(0x07,0x03);
- Ht1621WrOneData(0x10,0x01);
- Ht1621WrOneData(0x0f,0x01);
- }*/
- if(yu==2)
- {
- Ht1621WrOneData(0x07,0x07);
- Ht1621WrOneData(0x10,0x01);
- Ht1621WrOneData(0x0f,0x01);
- }
- /* if(yu==4)
- {
- Ht1621WrOneData(0x07,0x0f);
- Ht1621WrOneData(0x10,0x01);
- Ht1621WrOneData(0x0f,0x01);
- }*/
- if(yu==4)
- {
- Ht1621WrOneData(0x07,0x0f);
- Ht1621WrOneData(0x10,0x01);
- Ht1621WrOneData(0x0f,0x09);
- }
- /* if(yu==8)
- {
- Ht1621WrOneData(0x07,0x0f);
- Ht1621WrOneData(0x10,0x01);
- Ht1621WrOneData(0x0f,0x0d);
- }*/
- if(yu==6)
- {
- Ht1621WrOneData(0x07,0x0f);
- Ht1621WrOneData(0x10,0x01);
- Ht1621WrOneData(0x0f,0x0f);
- }
- /* if(yu==12)
- {
- Ht1621WrOneData(0x07,0x0f);
- Ht1621WrOneData(0x10,0x05);
- Ht1621WrOneData(0x0f,0x0f);
- }
- if(yu==14)
- {
- Ht1621WrOneData(0x07,0x0f);
- Ht1621WrOneData(0x10,0x0d);
- Ht1621WrOneData(0x0f,0x0f);
- }*/
- if(yu==8)
- {
- Ht1621WrOneData(0x07,0x0f);
- Ht1621WrOneData(0x10,0x0f);
- Ht1621WrOneData(0x0f,0x0f);
- }
- }
- unsigned int monday(unsigned year1,unsigned month1)
- {
- switch(month1)//根据月年计算日子
- {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:return 31;
- case 4:
- case 6:
- case 9:
- case 11:return 30;
- case 2:if(year%4==0&&year%100!=0||year%400==0)
- return 29;
- else
- return 28;
- default:
- return 0;
- }
- }
- void key(void)
- {
- if(k3==0)
- DelayMS(10);
- if(k3==0)
- {
- di();
- // while(!k3);
- flag++;
- keytime=0;
- if(flag==7)
- {
- flag=1;
- }
- }
- switch(flag)
- {
- case 1:if(set==0)
- {
- Ht1621WrOneData(0x1e,0x01);
- Ht1621WrOneData(0x1f,0x00);
- Ht1621WrOneData(0x1c,0x01);
- Ht1621WrOneData(0x1d,0x00);
- if(keytime==20)
- {
- flag=6;
- }
- }
- if(k1==0)
- {
- DelayMS(10);
- if(k1==0)
- {
- di();
- keytime=0;
- // while(!k1);
- year++;
- if(year==99)
- {
- year=0;
-
- }
- }
- }
- if(k2==0)
- {
- DelayMS(10);
- if(k2==0)
- {
- di();
- keytime=0;
- // while(!k2);
- year--;
-
-
-
- if(year==0)
- {
- year=99;
-
-
-
- }
- }
- }
- break;
- case 2:if(set==0)
- {
- Ht1621WrOneData(0x1a,0x00);
- Ht1621WrOneData(0x1b,0x00);
- if(keytime==20)
- {
- flag=6;
- }
- }
- if(k1==0)
- {
- DelayMS(10);
- if(k1==0)
- {
- di();
- keytime=0;
- // while(!k1);
- month++;
-
- if(month==13)
- {
- month=1;
-
- }
- }
- }
- if(k2==0)
- {
- DelayMS(10);
- if(k2==0)
- {
- di();
- keytime=0;
- // while(!k2);
- month--;
-
- if(month==0)
- {
- month=12;
-
- }
- }
- }
- break;
- case 3:if(set==0)
- {
- Ht1621WrOneData(0x19,0x00);
- Ht1621WrOneData(0x17,0x00);
- Ht1621WrOneData(0x18,0x00);
- if(keytime==20)
- {
- flag=6;
- }
- }
- if(k1==0)
- {
- DelayMS(10);
- if(k1==0)
- {
- di();
- keytime=0;
- // while(!k1);
- a=monday(year,month);
- a=a+1;
- day++;
-
- if(day==a)
- {
- day=1;
-
- }
- }
- }
- if(k2==0)
- {
- DelayMS(10);
- if(k2==0)
- {
- di();
- keytime=0;
- // while(!k2);
- a=monday(year,month);
- day--;
-
- if(day==0)
- {
- day=a;
-
- }
- }
- }
- break;
- case 4:if(set==0)
- {
- Ht1621WrOneData(0x0c,0x01);
- Ht1621WrOneData(0x0d,0x00);
- Ht1621WrOneData(0x0e,0x00);
- if(keytime==20)
- {
- flag=6;
- }
- }if(k1==0)
- {
- DelayMS(10);
- if(k1==0)
- {
- di();
- keytime=0;
- // while(!k1);
- hour++;
-
- if(hour==24)
- {
- hour=0;
-
- }
- }
- }
- if(k2==0)
- {
- DelayMS(10);
- if(k2==0)
- {
- di();
- keytime=0;
- // while(!k2);
- hour--;
-
- if(hour==0)
- {
- hour=23;
-
- }
- }
- }
- break;
- case 5:if(set==0)
- {
- Ht1621WrOneData(0x08,0x00);
- Ht1621WrOneData(0x09,0x00);
- Ht1621WrOneData(0x0a,0x01);
- Ht1621WrOneData(0x0b,0x00);
- if(keytime==20)
- {
- flag=6;
- }
- }
- if(k1==0)
- {
- DelayMS(10);
- if(k1==0)
- {
- di();
- keytime=0;
- // while(!k1);
- min++;
-
- if(min==60)
- {
- min=0;
-
- }
- }
- }
- if(k2==0)
- {
- DelayMS(10);
- if(k2==0)
- {
- di();
- keytime=0;
- //while(!k2);
- min--;
- if(min==0)
- {
- min=59;
- }
- }
- }
- break;
- case 6: DelayMS(10);
- break;
- }
- ht1621d();
- if(set==1)
- {
-
- dispaytime2(hour,min);
- dispaynian(year,month,day);
- }
- if(set==2)
- {
- set=0;
- if(flag==6)
- {
- dispaytime(min);
- }
- else
- {
- dispaytime2(hour,min);
- }
- }
- }
- void main( void )
- {
- ADC_Init();
- ADC_CR1|=0x01;
- _asm("sim");
- CLK_Init();
- TIM1_Init();
- _asm("rim");
- Init(); //时钟初始化
- port_init();//GPIO初始化
- Ht1621_Init(); //上电初始化LCD
- ds1302();
- DelayMS(50); //延时一段时间
- Ht1621WrAllData();
- flag=6;
- k1=1;
- k2=1;
- k3=1;
- while(1)
- {
- dispaytemp(b);
- key();
- settime();
- }
- }
- @far @interrupt void TIM1_OVER_Int(void)
- {
- unsigned char min1;
- TIM1_SR1 = 0x00;
- f++;
- yu++;
- set++;
- keytime++;
- keytime++;
- if(keytime==22)
- {
- keytime=0;
- }
- if(set==3)
- {
- set=0;
- }
- if(yu==10)
- {
- yu=0;
- }
- if(f==2)
- {
- miao++;
- f=0;
- v1=0;
- for(i=0;i<100;i++)
- {
- v=0;
- ADC_CR1|=0x01;
- while(!(0x80&ADC_CSR));
- ADC_CSR&=0x7f;
- v=(unsigned int)ADC_DRH;
- v=v<<2;
- v+=ADC_DRL;
- v1+=v;
- }
- b=770-v1/100;
- }
- }
复制代码 |
|