c语言拆字显示程序,PIC按键LCD+DS1302+AD程序(C程序)

原标题:PIC按键LCD+DS1302+AD程序(C程序)

//;*******************************************

7a721fd2ba1fa97f6e5da1ef67b5c670.png

#include

#include

#define uchar unsigned char

#define uint unsigned int

static volatile unsigned char acc @ 0x20;

static volatile bit acc0 @ (unsigned)&acc*8+0;

static volatile bit acc7 @ (unsigned)&acc*8+7;

#define PORTAIT(add,bit) ((unsigned)(&add)*8+(bit))

#define PORTBIT(add,bit) ((unsigned)(&add)*8+(bit))

#define PORTCIT(add,bit) ((unsigned)(&add)*8+(bit))

static bit RS @ PORTCIT(PORTC,0);

static bit RW @ PORTCIT(PORTC,1);

static bit E @ PORTCIT(PORTC,2);

static bit T_RST @ PORTCIT(PORTC,5);

static bit T_CLK @ PORTCIT(PORTC,6);

static bit T_IO @ PORTCIT(PORTC,7);

static bit PORTA_0 @ PORTAIT(PORTA,0); ///*定义PORTA 0位*/

static bit PORTA_1 @ PORTAIT(PORTA,1); ///*定义PORTA 1位*/

static bit PORTA_2 @ PORTAIT(PORTA,2); ///*定义PORTA 2位*/

static bit PORTA_5 @ PORTAIT(PORTA,5);

static bit RB_7 @ PORTBIT(PORTB,7);

const unsigned char Data[ ]={'0', '1', '2','3','4', '5', '6','7', '8','9',' '};

const unsigned char Ds1302[] = {9, 9, 0, 7, 1, 9 ,3,9, 2,4, 5, 9 ,5,9,};

// // 年 星期 月 日 时 分 秒

const unsigned char _sub[ ]={0};

uchar DisCash[]={0x00,0x30,0x09,0x1,0x06,0x06,0x06};

//初始化参数 秒 分 时 日 月 星期 年

unsigned char y,i;

char *pc;

uchar BCD[3];

uchar get1302[7];

uchar appear[]={0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0};

void Delay ( );

void enable ();

void display();//显示程序

//延时子程序

void delay()

{

unsigned int i=1000;

while(i--) //for(i=6000;0

{

; // continue;

}

}

十六进制转十进制程序

void H_BCD (uchar x)

{

//i,j,t1,t2;

BCD [2]=x%10;

BCD [1]=(x%100)/10;

BCD [0]=x/100;

}

//写入数据子程序

void W_data ()

{

Delay();//判断液晶显示器是否忙

RS=1;

RW=0;

PORTB=y;

// enable();//写入控制命令子程序

E=1;

E=0;

}

//写入控制命令子程序

void enable ()

{ Delay();

RS=0;

RW=0;

PORTB =y;

E=1;

E=0;

}

///判断液晶显示器是否忙///

void Delay ()

{

RS=0;

RW=1;

E=0;

NOP();

TRISB=0x80;

E=1;

while(RB_7==1 )

{

RS=0;

RW=1;

E=0;

NOP();

E=1;

}

TRISB=0x00;

}

///

void adint(void)

{

ADIF=0;//清/AD中断标志位

}

系统 各I/O初始化子程序///

void initial ()

{ TRISB=0;

TRISC=0;

TRISA=0x0ff;

}

//A/D转换初始化子程序//

void adinitial()

{

ADCON1=15;//;设置RA为A/D甬道模拟输入

//;RC时钟。打开A/D转换器。先中通道0

ADCON0=0x0c1;// B'11000001' // ;A/D时钟为RC。RA0作A/D输入等

ADIE=1; //时。开放中断

ADIF=0; //清/AD中断标志位 PIR1,

PEIE=1; //开放外围部件中断INTCON,

GIE=1; //开放总中断 INTCON,

}

/往1302写入1Byte数据

void RTInputByte(uchar d)

{

uchar i;

acc = d;

TRISC=0x00;

for(i=8; i>0; i--)

{

T_IO = acc0;//CARRY;//ACC0; //*相当于汇编中的 RRC */

T_CLK = 1;

T_CLK = 0;

acc = acc >> 1;

}

}

///从1302读取1Byte数据

uchar RTOutputByte(void)

{

uchar i;

TRISC=0x80;

for(i=8; i>0; i--)

{

acc = acc >>1; //*相当于汇编中的 RRC */

acc7= T_IO;// CARRY

T_CLK = 1;

T_CLK = 0;

}

return(acc);

}

///先写地址,后写命令/数据//

void W1302(uchar ucAddr, uchar ucDa)

{

T_RST = 0;

T_CLK = 0;

T_RST = 1;

RTInputByte(ucAddr); // /* 地址,命令 */

RTInputByte(ucDa); // /* 写1Byte数据*/

T_CLK = 1;

T_RST = 0;

}

///先写地址,后读命令/数据

uchar R1302(uchar ucAddr)

{

uchar ucData;

T_RST = 0;

T_CLK = 0;

T_RST = 1;

RTInputByte(ucAddr); // /* 地址,命令 */

ucData = RTOutputByte(); // /* 读1Byte数据 */

T_CLK = 1;

T_RST = 0;

return(ucData);

}

/向1302写入 秒 分 时 日 月 星期 年 */

void Set1302(uchar *pClock)

{

uchar i;

uchar ucAddr = 0x80;

W1302(0x8e,0x00); ///* 控制命令,WP=0,允许写操作*/

for(i =7; i>0; i--)

{

W1302(ucAddr,*pClock); ///* 秒 分 时 日 月 星期 年 */

pClock++;

ucAddr +=2;

}

W1302(0x8e,0x80); // /* 控制命令,WP=1,写保护*/

}

从1302读出 秒 分 时 日 月 星期 年 *//

void v_Get1302(unsigned char ucCurtime[])

{

unsigned char i;

unsigned char ucAddr = 0x81;

for (i=0;i<7;i++)

{

ucCurtime[i] = R1302(ucAddr);///*格式为: 秒 分 时 日 月 星期 年 */

ucAddr += 2;

}

}

//拆字子程序///

void bcd_bcd( )

{ uchar a=6;

for (i=0;i<=15;)

{

appear[i]=(get1302[a]&0xf0)/16;

i++;

appear[i]=get1302[a]&0x0f;

i++;

a--;

}

}

按键扫描///

//按键扫描/

void Key()

{

uchar a,b,c,i;

di();

a=PORTA ;

if(56!=(a&56))

{

display();

a=PORTA ;

if(56!=(a&56))

{

for (b=0;b<14;)

{

uchar z,x;

for(z=50;z>0&&b<14;z--)

{ z--;

display();// delay();

delay();

a=PORTA;

a=a&56;

switch(a)

{

case 48 :

if(Ds1302[b]!=appear[b] )

(appear[b])++;

a=PORTA ;

for(x=20;x>0&&56!=(a&56);x--)

{ display();// delay();

delay();

} break; // 年 星期 月 日 时 分 秒

case 40 : if(appear[b]!=0)(appear[b])--;

a=PORTA ;

for(x=20;x>0&&56!=(a&56);x--)

{ display();// delay();

delay();

} break;// 年 星期 月 日 时 分 秒

case 24 : b++; while( PORTA_5==0); break;

}

}

a=PORTA ;

for(z=50;( z>0&&56==(a&56));z--)

{

i=appear[b];

appear[b]=10;

display( );

delay();

appear[b]=i;

a=PORTA;

//a=a&56;

z--;

}

}

while( PORTA_5==0);

i=13;

c=12;

for(b=0;b<7;b++)

{

DisCash[b]=((appear[c]&0x0f)*16)|(appear[i]&0x0f);

i=i-2;

c=c-2;

}

Set1302(&DisCash[0]);

a=PORTA ;

}

}

}

//显示子程序/

void display()//显示程序

{

y=0x80;//0x0C0;写入起始地址

enable();//写入控制命令子程序

for(i=0;i<8;)

{

y=Data[ appear[i]]; // 1';//0x47;

W_data ();//写入数据子程序

// delay();

i++;

y=Data[ appear[i]]; // 1';//0x47;

W_data ();//写入数据子程序

// delay();

i++;

y='-'; // 1';//0x47;

W_data ();//写入数据子程序

//delay();

}

y=0x0C0;

enable();//写入控制命令子程序

for(i=8;i<14;)

{

y=Data[appear[i]]; // 1';//0x47;

W_data ();//写入数据子程序

//delay();

i++;

y=Data[appear[i]]; // 1';//0x47;

W_data ();//写入数据子程序

// delay();

i++;

y=':'; // 1';//0x47;

W_data ();//写入数据子程序

// delay();

}

y='-'; // 1';//0x47;

W_data ();//写入数据子程序

// delay();

for(i=0;i<3;i++)

{

y=Data[ BCD[i]]; // 1';//0x47;

W_data ();//写入数据子程序

}

}

///主程序//

void main()

{

// TRISB=0x00;

// TRISC=0x00;

Set1302(&DisCash[0]);

initial ();//系统 各I/O初始化子程序

adinitial();//A/D转换初始化子程序/

y=0x01;//PORTB

enable();//写入控制命令子程序

y=0x38;//8位2行5X7点阵0x3c

enable();//写入控制命令子程序

y=0x0C;//显示器开,F=光标开,闪烁开。

enable();//写入控制命令子程序

y=0x06; //文字不动,光标自动右移。

enable();//写入控制命令子程序

///

while(1)

{

v_Get1302(get1302);//从1302读出 秒 分 时 日 月 星期 年

bcd_bcd(get1302);//拆字子程序

H_BCD ( ADRES ); //十六进制转十进制程序

ei();

ADGO=1; //启动A/D转换 ADCON0,

display();

Key();

}

}

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值