?? clock 2.0.c
字號:
#include"pic18.h"
const char shu[160]={/*-- 文字: 0 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: 1 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 2 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 3 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 6 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 7 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字: 9 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
};
char mao[]={0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
};
char shi[]=
///*-- 文字: 時 --*/
///*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
{0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,};
char jian[]={
0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00,};
char *ARRAY[10];
char s[6];
char PPP[34];
char I;
char flagkey;
void YJ_initial()
{
INTCON=0X00;
WDTCON=0;
ADCON1=0X87; //設置所有與模擬輸入共用的引腳為I/O方式
TRISE=TRISE&0XF8; //設置RE0,RE1,RE2為輸出
TRISB=TRISB&0XFC; //設置RB0,1為輸出
TRISA=TRISA&0XF7; //設置RA3為輸出
TRISB=TRISB|0X10;
RB1=0;
}
//讀液晶顯示器狀態子程序,行參E代表液晶的邊
void LCDSTA1(int E)
//int E;
{
int E1FLAG;
TRISD=0XFF; //設置D口為輸入
while(1)
{
if(E==1)
{PORTA=PORTA|0X08; //設置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
PORTE=(PORTE|0X01)&0XF9;}
else
{PORTA=PORTA&0XF7; //設置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
PORTE=(PORTE|0X05)&0XFD;}
PORTB=PORTB|0X01; //RB0/E=1
E1FLAG=PORTD&0X80;
PORTB=PORTB&0XFE; //RB0/E=0
if(E1FLAG==0X0000)break;
}
}
//對液晶顯示器發指令子程序,行參E代表處理的液晶的邊
void TRANS1(int TRANS,int E)
//int TRANS,E;
{
LCDSTA1(E);
TRISD=0X00; //RD為輸出
if(E==1) //設置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=0
{PORTA=PORTA|0X08;
PORTE=PORTE&0XF8;}
else //設置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=0
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X04)&0XFC;}
PORTD=TRANS;
PORTB=PORTB|0X01; //RB0/E=1
PORTB=PORTB&0XFE; //RB0/E=0
}
//對液晶顯示器寫數據子程序
void WRITE1(char WRITE,int CLMADD,int E)
//int WRITE,CLMADD,E;
{
TRANS1(CLMADD,E); ///設置列地址
LCDSTA1(E); //查詢液晶是否為空閑
TRISD=0X00; //RD為輸出
if(E==1) //設置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=1
{PORTA=PORTA|0X08;
PORTE=(PORTE|0X02)&0xFA;}
else //設置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=1
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X06)&0xFE;}
PORTD=WRITE;
PORTB=PORTB|0X01; //RB0/E=1
PORTB=PORTB&0XFE; //RB0/E=0
}
//開E邊顯示子程序
void DISP1(int E)
//int E;
{
int E1FLAG;
while(1)
{
TRANS1(0X03F,E); ///送出控制命令
// LCDSTA1(E); //判斷液晶是否為空閑狀態
TRISD=0XFF; //設置ED為輸入
if(E==1) //設置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
{PORTA=PORTA|0X08;
PORTE=(PORTE|0X01)&0xF9;}
else //設置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X05)&0xFD;}
PORTB=PORTB|0X01; //RB0/E=1
E1FLAG=PORTD&0X20;
PORTB=PORTB&0XFE; //RB0/E=0
if(E1FLAG==0X00)break; //如果液晶被打開,則退出循環,否則繼續打開
}
}
//E邊清屏子程序
void CLEAR1(int E)
//int E;
{
int PAGEADD,PAGENUM,CLMSUM;
for(PAGENUM=0X08,PAGEADD=0X0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
{
TRANS1(PAGEADD,E); //設置相應的頁地址
for(CLMSUM=0x40;CLMSUM<=0X7F;CLMSUM++)
{
LCDSTA1(E); //判斷液晶空閑狀態
WRITE1(0X00,CLMSUM,E); //送0清屏
}
}
}
//關E邊顯示子程序
void DISOFF1(int E)
//int E;
{
int E1FLAG;
while(1)
{
TRANS1(0X3E,E); //發送控制命令
LCDSTA1(E); //判斷液晶是否為空閑狀態
TRISD=0XFF; //設置RD為輸入
if(E==1) //設置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
{PORTA=PORTA|0X08;
PORTE=(PORTE|0X01)&0xF9;}
else //設置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X05)&0xFD;}
PORTB=PORTB|0X01; //RB0/E=1
E1FLAG=PORTD&0X20;
PORTB=PORTB&0XFE; //RB0/E=0
if(E1FLAG==0X20)break; //如液晶關閉,則推出循環,否則繼續關閉
}
}
//LCD的E邊初始化子程序
void LCD1INIT(int E)
{
DISOFF1(E); //關E區顯示
/*TRANS1(0X0A4,E);
TRANS1(0X0A9,E);
TRANS1(0X0E2,E);
TRANS1(0X0A0,E);*/
CLEAR1(E); //清屏
LCDSTA1(E); //判斷液晶空閑狀態
DISP1(E); //開顯示
}
//顯示""
DISPLAY1(int E,int PAGADD,int CLMADD,int n)////////////////////////////////////////////////////
{int K;
char TEMP;
TRANS1(0xc0,E) ;
TRANS1(PAGADD,E);
for(K=0;K<16;K++,CLMADD++,ARRAY[n]++)
{TEMP=*ARRAY[n];
WRITE1(TEMP,CLMADD,E);
}
CLMADD=CLMADD-16;
PAGADD=PAGADD+1;
TRANS1(PAGADD,E);
for(;K<32;K++,CLMADD++,ARRAY[n]++)
{TEMP=*ARRAY[n];
WRITE1(TEMP,CLMADD,E);
}
}
DISPLAY2(int E,int PAGADD,int CLMADD,int n)
{int K;
char TEMP;
TRANS1(0xc0,E) ;
TRANS1(PAGADD,E);
for(K=0;K<8;K++,CLMADD++,ARRAY[n]++)
{TEMP=*ARRAY[n];
WRITE1(TEMP,CLMADD,E);
}
CLMADD=CLMADD-8;
PAGADD=PAGADD+1;
TRANS1(PAGADD,E);
for(;K<16;K++,CLMADD++,ARRAY[n]++)
{TEMP=*ARRAY[n];
WRITE1(TEMP,CLMADD,E);
}
}
void MAOXIAN()
{
int J;
for(J=0;J<16;J++)
PPP[J]=mao[J];
ARRAY[6]=&PPP[0];
DISPLAY2(2,0XBc,0X50,6);//4頁16列
for(J=0;J<16;J++)
PPP[J]=mao[J];
ARRAY[6]=&PPP[0];
DISPLAY2(1,0XBc,0X67,6);//4頁39列
for(J=0;J<16;J++)
PPP[J]=mao[J];
ARRAY[6]=&PPP[0];
DISPLAY2(1,0Xb9,0X60,6);//33列
}
void xianzi()
{ int i,j;
for(i=0,j=0;i<32;i++,j++)
PPP[j]=shi[i];
ARRAY[7]=&PPP[0];
DISPLAY1(1,0xb9,0x40,7); //2頁1列
for(i=0,j=0;i<32;i++,j++)
PPP[j]=jian[i];
ARRAY[8]=&PPP[0];
DISPLAY1(1,0xb9,0x50,8);//17列
}
void port_B()
{
TRISB=TRISB|0XF0;
INTCON=INTCON|0X08;
INTCON2=INTCON2&0X7F;
RBIP=0;
RB1=0;
PORTB=PORTB;
}
void xsh0()
{
int i,j,k,y,u; // 秒個
y=s[0];
k=y*16;
for(i=k,j=0;i<k+16;i++,j++)
PPP[j]=shu[i];
ARRAY[0]=&PPP[0];
DISPLAY2(2,0xbc,0X68,0);//40列
//CLEAR1(2); //加上有閃動效果
// for(u=0;u<52500;u++) //delay
// {}
}
void xsh1()
{
int i,j,k,y;
y=s[1];
k=y*16;
for(i=k,j=0;i<k+16;i++,j++)
PPP[j]=shu[i];
ARRAY[1]=&PPP[0];
DISPLAY2(2,0xbc,0X58,1); //24列
}
void xsh2()
{
int i,j,k,y;
int x,a;
y=s[2];
k=y*16;
for(i=k,j=0;i<k+16;i++,j++)//
PPP[j]=shu[i];
ARRAY[2]=&PPP[0];
DISPLAY2(2,0xbc,0X40,2);// 2塊4頁0列
}
void xsh3()
{
int i,j,k,y;
y=s[3];
k=y*16;
for(i=k,j=0;i<k+16;i++,j++)
PPP[j]=shu[i];
ARRAY[3]=&PPP[0];
DISPLAY2(1,0xbc,0X6f,3); //1塊4頁47列
}
void xsh4()
{
int i,j,k,y;
y=s[4];
k=y*16;
for(i=k,j=0;i<k+16;i++,j++)
PPP[j]=shu[i];
ARRAY[4]=&PPP[0];
DISPLAY2(1,0xbc,0X57,4);//23 lie
}
void xsh5()
{
int i,j,k,y;
y=s[5];
k=y*16;
for(i=k,j=0;i<k+16;i++,j++)
PPP[j]=shu[i];
ARRAY[5]=&PPP[0];
DISPLAY2(1,0xbc,0X47,5); //7 lie
}
void daxian()
{
s[0]=s[0]+1;
if(s[0]==10)
{
s[1]=s[1]+1;
s[0]=0;
}
xsh0();
if(s[1]>=6)
{
s[2]=s[2]+1;
s[1]=0;
}
xsh1();
if(s[2]>=10)
{
s[3]=s[3]+1;
s[2]=0;
}
xsh2();
if(s[3]>=6)
{
s[4]=s[4]+1;
s[3]=0;
}
xsh3();
if (s[5]<=1)
{ if(s[4]>=10)
{
s[5]=s[5]+1;
s[4]=0;
}
}
else
if(s[4]>=4)
{ s[5]=s[5]+1;
s[4]=0;
}
xsh4();
if(s[5]>=3)
{
s[0]=s[0]+1;
s[5]=0;
}
xsh5();
/////////////////////......................
}
void keyscan()
{
}
void interrupt low_priority LOW_ISR()
{
if(RBIF==1)
{ int i;
flagkey=1;
for(i=0;i<600;i++)
{}
if(RB4==0) return;//********rb4==0
else
RBIF=0;
}
}
main()
{long u;
YJ_initial();
LCD1INIT(1);
LCD1INIT(2);
port_B();
IPEN=1;
INTCON=INTCON|0XC0;
while(1){
xianzi();
MAOXIAN();
if (flagkey==1)
s[4]=s[4]+1;
daxian();
flagkey=0;
for(u=0;u<52500;u++) //delay
{}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -