?? 1602b_lcd_test.c
字號:
#include <iom16v.h>
#include <macros.h>
#include "1602LCD.h"
volatile int zkb;
volatile int zq;
volatile int t1,t2;
uchar n=0,t=0;
void delay_1ms(void); //函數聲明,本實驗中會用到這兩個函數
void delay_nms(unsigned int n);
/*DS1302函數聲明*/
void write_data(uchar addr,uchar data);
uchar read_data(uchar addr);
void init_1302(void);
void init_time(uchar sec,uchar min,uchar hour,uchar day,uchar month,uchar d,uchar year);
//PWM信號產生中斷函數
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
//每次觸發為20微秒
TCNT2 = 0xF1; //反轉值,理論值為0xEC 但是實測值為0xEF 有點沒搞懂 ??
if((--zq)==0)
{
PORTC^=0B00000001; //PORTB.0 反轉
if((PORTC&0x01)==0x01)
{
zq=t1;
}else
{
zq=t2;
}
}
}
void timer2_init(void)//50kHz
{
//TCCR2 = 0x00; //stop
ASSR=0x00;
TCCR2=0x02;
TCNT2=0xEF;
OCR2=0x00;
}
/************************************************
1302顯示子程序
************************************************/
void showtime()
{
uchar s,i,th,tl;
//1302
s=read_data(0x8b);
tl=s&0x0f;
switch(tl)
{
case 1:LCD_write_string(0,0,"monday");break;
case 2:LCD_write_string(0,0,"tuesday");break;
case 3:LCD_write_string(0,0,"wednesday");break;
case 4:LCD_write_string(0,0,"thursday");break;
case 5:LCD_write_string(0,0,"friday");break;
case 6:LCD_write_string(0,0,"saturday");break;
case 7:LCD_write_string(0,0,"sunday");break;
}
LCD_set_xy(0,1);
//year
s=read_data(0x8d);
tl=s&0x0f;
th=(s>>4);
//LCD_write_char(0,th+48);
LCD_write_char(0,tl+48);
LCD_write_char(0,'/');
//month
s=read_data(0x89);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(0,th+48);
LCD_write_char(0,tl+48);
LCD_write_char(0,'/');
//day
s=read_data(0x87);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(0,th+48);
LCD_write_char(0,tl+48);
//LCD_write_char(0,' ');
LCD_write_char(0,' ');
// LCD_set_xy(0,1);
//hour
s=read_data(0x85);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(0,th+48);
LCD_write_char(0,tl+48);
LCD_write_char(0,':');
//min
s=read_data(0x83);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(0,th+48);
LCD_write_char(0,tl+48);
LCD_write_char(0,':');
//sec
s=read_data(0x81);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(0,th+48);
LCD_write_char(0,tl+48);
//date
}
//////////////////////////////////////////////////////////////
//k1接pd0 k2接pd1 k3接pd2
/*void settime()
{
uchar dout=0,i,j,k;
ret:;
PORTC = 0x00;
DDRC = 0xff;
write_data(0x8e,0x00); //關閉寄存器寫保護
dout=PINC;
i=((dout&0x40)==0x40);
delay_nms(100);
if(i)
{
n++;
t=0;
LCD_write_char(0x10,0);//光標自動右移
if(n==15)n=0;}
switch(n)
{
case 1 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x80,((read_data(0x81))&0xf0)|t);;
LCD_set_xy(1,1);
k=((read_data(0x81))&0xf0);
LCD_write_char(0,k+48);
break;//0
}
//else goto ret;
case 2 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x80,((read_data(0x81))&0x0f)|(t<<4));
LCD_set_xy(2,1);
k=(read_data(0x81));
k=(k>>4);
LCD_write_char(0,k+48);
break;
}
//else goto ret;
case 4 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x82,((read_data(0x83))&0xf0)|t);
LCD_set_xy(4,1);
k=((read_data(0x83))&0xf0);
LCD_write_char(0,k+48);
break;
}
case 5 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x82,((read_data(0x83))&0x0f)|(t<<4));
LCD_set_xy(5,1);
k=(read_data(0x83));
k=(k>>4);
LCD_write_char(0,k+48);
break;
}
case 7 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x84,((read_data(0x85))&0xf0)|t);
LCD_set_xy(7,1);
k=((read_data(0x85))&0xf0);
LCD_write_char(0,k+48);
break;
}
case 8 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x84,((read_data(0x85))&0x0f)|(t<<4));
LCD_set_xy(8,1);
k=(read_data(0x85));
k=(k>>4);
LCD_write_char(0,k+48);
break;
}
case 10 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x86,((read_data(0x87))&0xf0)|t);
LCD_set_xy(10,1);
k=((read_data(0x87))&0xf0);
LCD_write_char(0,k+48);
break;
}
case 11 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x86,((read_data(0x87))&0x0f)|(t<<4));
LCD_set_xy(11,1);
k=(read_data(0x87));
k=(k>>4);
LCD_write_char(0,k+48);
break;
}
case 13 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x88,((read_data(0x89))&0xf0)|t);
LCD_set_xy(13,1);
k=((read_data(0x89))&0xf0);
LCD_write_char(0,k+48);
break;
}
case 14 :dout=PINC;j=((dout&0x80)==0x80);
if(j)
{ t++;
write_data(0x88,((read_data(0x89))&0x0f)|(t<<4));
LCD_set_xy(14,1);
k=(read_data(0x89));
k=(k>>4);
LCD_write_char(0,k+48);
break;
}
else break;
}
}*/
void main(void)
{
volatile char aa=20,i=0,dout;
OSCCAL=0X95;
/********************************************/
CLI();
PORTD=0x00;
DDRD |= LCD_DATA | LCD_RW;
DDRD |= LCD_RS | LCD_EN;
PORTA = 0xc7;//端口設置
DDRA = 0xff;
// PORTC = 0x00;
//DDRC = 0xff;
init_1302();
init_1302();
init_time(0x00,0x58,0x20,0x19,0x04,0x06,0x08);//秒、分、時、日、月、星期、年
DDRC|=0x01; //置為輸出
PORTC|=0x01;
timer2_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x40;
LCD_init();
/*初始化參數*/
zkb=1500;
t1=zkb/20;
t2=(20000-zkb)/20;
zq=t1;
// Global enable interrupts
SEI();
while(1)
{
//settime();
// showtime();
delay2_nms(100);
zkb+=aa;
if(zkb==500||zkb==2500){ //標準應該是1000至2000
aa=-aa;
}
t1=zkb/20;
t2=(20000-zkb)/20;
//////////////////////////////////////////////
/* LCD_write_char(0x01,0); //顯示清屏
LCD_write_string(3,0,"Welcome");
LCD_write_string(1,1,"www.527dz.com!");
delay_nms(5000);
LCD_write_char(0x01,0); //顯示清屏
LCD_write_string(0,0,"Tel:13308844201");
LCD_write_string(0,1,"527dz@527dz.com");
delay_nms(5000);*/
}
}
void delay2_1ms(void)//1ms延時函數
{
unsigned int i;
for (i=0;i<150;i++)
{
}
}
void delay2_nms(unsigned int n)//延時n毫秒
{
unsigned int i;
for (i=0;i<n;i++)//執行n次1毫秒延時
delay2_1ms();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -