📄 实验程序.txt
字号:
#include "io430x22x4.h"
#include "in430.h"
#define uchar unsigned char
#define uint unsigned int
/********************** LCD ********************************/
#define BIAS 0x24
#define SYSEN 0x01
#define LCDOFF 0x02
#define LCDON 0x03
uchar clear_1621[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//清屏数组
/********************** 1621 ********************************/
/********************** 使用P1口 ********************************/
#define cs_out P1OUT_bit.P1OUT_0 //31 p1_0
#define wr_out P1OUT_bit.P1OUT_1 //32 p1_1
#define dat_out P1OUT_bit.P1OUT_2 //33 p1_2
/********************** 18b20 ********************************/
/********************** 使用P2.0口 ********************************/
/********************** 蜂鸣器接到p1.7 *******************/
#define DQ1 P2OUT |= BIT0 //18b20的DQ位接到了p2_0 8脚
#define DQ0 P2OUT &= ~BIT0
uchar Temp_Flag=0;
int b=0;//在中断中为蜂鸣器计数
//*************************************************************************
uchar Time_Flag=1,Second_Flag=0;
int Time[5]={9,21,14,20,15};
int a;//在中断中为秒计数,每进一次中断,a+1
/****************************** key *********************************/
/****************************** key_1 p4.0 17 *********************************/
/****************************** key_2 p4.1 18 *********************************/
/****************************** key_3 p4.2 19 *********************************/
/****************************** key_4 p4.3 20 *********************************/
/********************** 使用P4口 ********************************/
#define key_DIR P4DIR
#define key_IN P4IN
/**********************************************************************************/
int DelaySleepFlag=0;//延时计数
/**********************************************************************************/
uchar mode=0;
/**********************************************************************************/
/***************************** 延时程序 *****************************************/
/**********************************************************************************/
//延时的时间为 us*5+6个指令周期,1MHz时为1us
void TempDelay(uint us)
{
while(us--);
}
/**********************************************************************************/
/***************************** 1621 *********************************************/
/**********************************************************************************/
void SendBit_1621(uchar date,uchar cnt)//data的高cnt位写入HT1621,高位在前
{
uchar i;
for(i=0;i<cnt;i++)
{
if((date&0x80)==0) dat_out=0;
else dat_out=1;
wr_out=0;
TempDelay(8);
wr_out=1;
date<<=1;
}
}
void SendDataBit_1621(uchar date,uchar cnt)//data的低cnt位写入HT1621,低位在前
{
uchar i;
for(i=0;i<cnt;i++)
{
if((date&0x01)==0) dat_out=0;
else dat_out=1;
wr_out=0;
TempDelay(8);
wr_out=1;
date>>=1;
}
}
void SendCmd_1621(uchar command)
{
cs_out=0;
SendBit_1621(0x80,3); //写入标志码"100"
SendBit_1621(command,9); //写入 9 位数据,其中前 8 位为 command 命令,最后 1 位任意
cs_out=1;
}
void Write_1621(uchar addr,uchar date)
{
cs_out=0;
SendBit_1621(0xa0,3); //写入标志码"101"
SendBit_1621(addr<<2,6); //写入 6 位 addr
SendDataBit_1621(date,4); //写入 date 的低 4 位
cs_out=1;
}
void WriteAll_1621(uchar addr,uchar *p,uchar cnt)
{
uchar i;
cs_out=0;
SendBit_1621(0xa0,3); //写入标志码"101"
SendBit_1621(addr<<2,6); //写入 6 位 addr
for(i=0;i<cnt;i++,p++) //连续写入数据
{
SendDataBit_1621(*p,8);
}
cs_out=1;
}
void Initial_1621()
{
cs_out=0;
wr_out=1;
dat_out=1;
TempDelay(2000);
SendCmd_1621(BIAS); //设置偏压和占空比
SendCmd_1621(SYSEN); //打开系统振荡器
SendCmd_1621(LCDON); //打开 LCD偏压发生器
WriteAll_1621(0x01,clear_1621,12);
}
void All_on_1621()
{
uchar i,addr=0x01;
for(i=0;i<12;i++)
{
Write_1621(addr,0xff);
addr+=2;
}
}
void All_off_1621()
{
uchar addr=0x01,i;
for(i=0;i<12;i++)
{
Write_1621(addr,0x00);
addr+=2;
}
}
void write_digital_1621(uchar addr1, uchar addr2, uchar addr3, uint a)
{
switch(a)
{
case 0: {Write_1621(addr1,0x03); Write_1621(addr2,0x05); Write_1621(addr3,0x03); break;}
case 1: {Write_1621(addr1,0x00); Write_1621(addr2,0x00); Write_1621(addr3,0x03); break;}
case 2: {Write_1621(addr1,0x02); Write_1621(addr2,0x07); Write_1621(addr3,0x01); break;}
case 3: {Write_1621(addr1,0x00); Write_1621(addr2,0x07); Write_1621(addr3,0x03); break;}
case 4: {Write_1621(addr1,0x01); Write_1621(addr2,0x02); Write_1621(addr3,0x03); break;}
case 5: {Write_1621(addr1,0x01); Write_1621(addr2,0x07); Write_1621(addr3,0x02); break;}
case 6: {Write_1621(addr1,0x03); Write_1621(addr2,0x07); Write_1621(addr3,0x02); break;}
case 7: {Write_1621(addr1,0x00); Write_1621(addr2,0x01); Write_1621(addr3,0x03); break;}
case 8: {Write_1621(addr1,0x03); Write_1621(addr2,0x07); Write_1621(addr3,0x03); break;}
case 9: {Write_1621(addr1,0x01); Write_1621(addr2,0x07); Write_1621(addr3,0x03); break;}
default: break;
}
}
/**********************************************************************************/
void Clr_Lcd()
{
WriteAll_1621(0x01,clear_1621,12);
}
void Clr_Front_Lcd()
{
WriteAll_1621(0x0d,clear_1621,6);
}
void Clr_Behind_Lcd()
{
WriteAll_1621(0x01,clear_1621,6);
}
/**********************************************************************************/
/***************************** 18b20 *********************************************/
/**********************************************************************************/
//对18b20进行初始化复位,对18b20进行操作之前必须进行
void Initial_18b20 (void)
{
P2DIR |=BIT0;
DQ0;
TempDelay(80); //delay 530 uS//847
DQ1;
TempDelay(30); //delay 100 uS//14
}
//向18B20写入一个字节
void Write_18b20 (uchar wr) //单字节写入
{
uchar i;
P2DIR |=BIT0;
for (i=0;i<8;i++)
{
DQ0;
if(wr&0x01) DQ1;
TempDelay(9); //delay 50 uS以上 //85
DQ1;
wr >>= 1;
}
}
//从18b20读一个字节
uint Read_18b20 (void) //读取单字节
{
uchar i;
uint u=0;
P2DIR |=BIT0;
for(i=0;i<16;i++)
{
u >>= 1;
DQ0;
DQ1;
P2DIR &=~BIT0;
if(P2IN_bit.P2IN_0)
{
u = u|0x8000;
}
_NOP();
P2DIR |=BIT0;
DQ1;
}
return u;
}
//读取温度并显示
float ReadTemp(void)
{
float Temper=0.0;
uint Temperature;
Temperature = Read_18b20();
Temper = Temperature*0.0625;
return Temper;
}
//显示温度
void Display_Temp()
{
float Temperature_final;
uint Temperature_x,Temperature_xx,Temperature_xxx;//温度的个位、十位与百位
Initial_18b20();
Write_18b20(0xcc);
Write_18b20(0x44);
_NOP();
Initial_18b20();
Write_18b20(0xcc);
Write_18b20(0xbe);
Temperature_final=ReadTemp();
if(Temperature_final>=30) P1OUT_bit.P1OUT_7=1;
else P1OUT_bit.P1OUT_7=0;
Temperature_x = ((int)(Temperature_final*10))%10;
Temperature_xx = ((int)Temperature_final)%10;
Temperature_xxx = ((int)(Temperature_final/10))%10;
WriteAll_1621(0x01,clear_1621,12);
write_digital_1621(0x13,0x15,0x17,Temperature_x);//显示温度的小数位
write_digital_1621(0x0d,0x0f,0x11,Temperature_xx);//显示温度的个位
write_digital_1621(0x07,0x09,0x0b,Temperature_xxx);//显示温度的十位
Write_1621(0x13,0x04);//显示小数点
}
//********************************************************************************
//显示时间
//********************************************************************************
void Display_Front(uint i)
{
write_digital_1621(0x01,0x03,0x05,(i/10)%10);
write_digital_1621(0x07,0x09,0x0b,i%10);
}
void Display_Behind(uint i)
{
write_digital_1621(0x0d,0x0f,0x11,(i/10)%10);
write_digital_1621(0x13,0x15,0x17,i%10);
}
//***********************************************
void Display_Month() //月
{
Display_Front(Time[0]);
}
void Display_Day() //日
{
Display_Behind(Time[1]);
}
//***********************************************
void Display_Hour() //时
{
Display_Front(Time[2]);
}
void Display_Min() //分
{
Display_Behind(Time[3]);
}
//***********************************************
void Display_Second() //秒
{
Display_Front(Time[4]);
}
//***********************************************
void Display_Time()
{
switch(Time_Flag)
{
case 1: {Clr_Lcd(); Display_Month(); Display_Day(); break;}
case 2: {Clr_Lcd(); Display_Hour(); Display_Min(); break;}
case 3: {Clr_Lcd(); Display_Second(); break;}
default:{Time_Flag=0; break;}
}
}
/**********************************************************************************/
/***************************** Initial 430 *************************************/
/**********************************************************************************/
void Initial_430()
{
WDTCTL=WDTPW+WDTHOLD; //关看门狗
BCSCTL1 = CALBC1_1MHZ; //设定DCO为8MHZ
DCOCTL = CALDCO_1MHZ;
TACTL=TASSEL+TACLR;
CCTL0|=CCIE;
CCR0=50000;
TACTL|=TAMC;
_BIS_SR(GIE);
P1DIR |=BIT0+BIT1+BIT2+BIT3+BIT7; //P1.0 P1.1 P1.2为输出方式
P1OUT |=BIT0+BIT1+BIT2+BIT3;
P2DIR |=BIT0+BIT1;
P2OUT |=BIT0+BIT1;
P3DIR |=BIT0+BIT1+BIT2;
}
#pragma vector = TIMERA0_VECTOR
__interrupt void ta0_isr(void)
{
a++;
DelaySleepFlag++;
if(a==17)
{
a=0;
if(Second_Flag==1) Time[4]=Time[4];
else Time[4]++;
if(Time[4]==60)
{
Time[4]=0;
Time[3]++;
if(Time[3]==60)
{
Time[2]++;
Time[3]=0;
if(Time[2]==24)
{
Time[2]=0;
}
}
}
}
if(DelaySleepFlag==540)
{
mode=3;
DelaySleepFlag=0;
}
}
void main()
{
int key;//i为个位,j为十位
uchar flag=0,tag=0;
Initial_430();
Initial_1621();
key_DIR &=~(BIT0+BIT1+BIT2+BIT3);
while(1)
{
while((P4IN&0x0f)==0x0f)
{
if(mode==1) Display_Time();
if(mode==2) Display_Temp();
if(mode==3) Clr_Lcd();
}
TempDelay(4000); //延时20ms
while((P4IN&0x0f)!=0x0f)
{
key=P4IN;
if((key&0x01)==0) //****************************** 0键按下
{
if((key&0x02)==0) //0键按下同时1键按下
{
mode=1; //模式1,显示时钟
Second_Flag=0;
while(!(P4IN&0x02));
Time_Flag++;
if(Time_Flag==4) Time_Flag=1;
Display_Time(); //flag=3时正常显示
}
else if((key&0x04)==0) //0键按下同时2键按下
{
mode=2;//模式2,显示温度
while(!(P4IN&0x04));
Display_Temp();//显示温度
}
}
else if(((key&0x02)==0)&&(mode==1)) //****************************** 1键按下
{
while(!(P4IN&0x02)); //等待1起来
tag++;
if(tag==20) tag=0;
flag=tag%2; //判断flag,如果flag是0则只显示前两位,flag是1则只显示后两位
if(flag==0)
{
Clr_Lcd();
if(Time_Flag==1) Display_Month();
else if(Time_Flag==2) Display_Hour();
else if(Time_Flag==3) {Display_Second(); Second_Flag=1;}
}
else if(flag==1)
{
Clr_Lcd();
if(Time_Flag==1) Display_Day();
else if(Time_Flag==2) Display_Min();
}
}
else if(((key&0x04)==0)&&(mode==1)) //****************************** 2键按下
{
while(!(P4IN&0x04));
if(flag==0)
{
if(Time_Flag==1) {Time[0]++; if(Time[0]==13) {Time[0]=1;} Display_Month();}
else if(Time_Flag==2) {Time[2]++; if(Time[2]==25) {Time[2]=1;} Display_Hour();}
else if(Time_Flag==3) {Time[4]++; if(Time[4]==60) {Time[4]=0;} Display_Second();}
}
else if(flag==1)
{
if(Time_Flag==1) {Time[1]++; if(Time[1]==31) {Time[1]=1;} Display_Day();}
else if(Time_Flag==2) {Time[3]++; if(Time[3]==61) {Time[3]=1;} Display_Min();}
else if(Time_Flag==3) {Time[4]++; if(Time[4]==60) {Time[4]=0;} Display_Second();}
}
}
else if(((key&0x08)==0)&&(mode==1)) //****************************** 3键按下
{
while(!(P4IN&0x08));
if(flag==0)
{
if(Time_Flag==1) {Time[0]--; if(Time[0]==-1) {Time[0]=12;} Display_Month();}
else if(Time_Flag==2) {Time[2]--; if(Time[2]==0) {Time[2]=24;} Display_Hour();}
else if(Time_Flag==3) {Time[4]--; if(Time[4]==0) {Time[4]=59;} Display_Second();}
}
else if(flag==1)
{
if(Time_Flag==1) {Time[1]--; if(Time[1]==0) {Time[1]=30;} Display_Day();}
else if(Time_Flag==2) {Time[3]--; if(Time[3]==-1) {Time[3]=59;} Display_Min();}
else if(Time_Flag==3) {Time[4]--; if(Time[4]==-1) {Time[4]=59;} Display_Second();}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -