?? lcdw.txt
字號:
/************************************************************
項目: lcdw
版本: 1.1
日期: 2001-8-1
作者: will
廣州市天河雙龍電子有限公司
芯片型號: AT90S8515
時鐘頻率: 8.000000 MHz
存儲器類型: Small
內部SRAM 大小: 512
外部SRAM 大小: 0
數據堆棧大小: 128
此程序是以CodeVision AVR 編寫的LCD 時鐘程序利用定時器T0 作
256 分頻初值為06H 每隔八毫秒產生一次溢出中斷計滿125 次
為1 秒每次上電/復位后顯示0 0 0 等待按鍵輸入時/分/秒計時(按
SHIFT 確認) 即開始計時無SHIFT 確認則不啟動每當小時加一時分
為59 而秒進入56 57 58 59 60 時蜂鳴器發出BEE 聲當計時至
23 59 59 時時鐘變為0 0 0 并發出聲響提示全局數組變量lcd_buffer
中放置要送lcd 顯示的內容PORTB, PORTC 作輸出LCD 接PORTB
本程序在SL-AVR 上驗證通過
AT90S8515 與16*2 LCD 的硬件具體接口如下
RS-----------PB.0 (to PD.0)
R/W---------PB.1 (to PD.2)
E-------------PB.2 (to PD.1)
PB.3----------free
DB4---------PB.4
CodeVision AVR C 源程序例子
廣州市天河雙龍電子有限公司
DB5---------PB.5
DB6---------PB.6
DB7---------PB.7
speak-------PC.0
SHIFT-------PD.7
KEYBOARD----PC.0-PC.7
*************************************************************/
#include <90s8515.h>
#asm
.equ __lcd_port=0x18 // LCD 接口設置
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
#include <math.h>
(#include "lcd1602.h")
unsigned char hh,hl,mh,ml,sh,sl,sec,minu,hr,key;
char lcd_buffer[33];
void alarm(void) //音響提示
{
unsigned char x,y;
DDRC=0x01;
for(y=1;y<35;y++)
{
for(x=1;x<25;x++)
{
PORTC.0=1;
PORTA=0x00;
delay_us(75);
PORTC.0=0;
PORTA=0xFF;
delay_us(75);
}
}
}
void alarml(void) //音響提示
{ unsigned char x,y;
DDRC=0x01;
for(y=1;y<35;y++)
{
for(x=1;x<25;x++)
{
PORTC.0=1;
PORTA=0x00;
delay_us(110);
PORTC.0=0;
PORTA=0xFF;
delay_us(110);
}
}
}
// 定時器0 溢出中斷服務程序
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
static unsigned char mid=0;
// 重新初始化定時器0
TCNT0+=0x06;
mid++;
if(mid>=125)
{
mid=0;
#asm("wdr")
sec++;
if(minu==59) //音響提示
{
if(sec==56) alarm();
if(sec==57) alarm();
if(sec==58) alarm();
if(sec==59) alarm();
if(sec==60) alarml();
}
if(sec>=60) //秒判斷
{
sec=0;
minu++;
if(minu>=60) //分判斷
{
minu=0;
hr++;
if(hr>=24) //小時判斷
{
hr=0;
}
hh=hr/10;
hl=hr%10;
}
mh=minu/10;
ml=minu%10;
}
sh=sec/10;
sl=sec%10;
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer); //顯示
}
}
////--------------------------------------------------------------
void init(void) //初始化
{
sec=0;
minu=0;
hr=0;
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer);
}
//-----------------------------------------------------------------
unsigned char keyscan(void) //鍵盤掃描
{
unsigned char row,column,temp;
DDRC=0xf0;
PORTC=0x0f;
if (PINC!=0x0f)
{
delay_us(30);
for(row=0,PORTC=0xef;row<4;row++)
{
for (column=0,temp=0xfe;column<4;column++)
{
while((PINC&0x0f)==(temp&0x0f))
{
key=4*row+column;
return (1);
}
temp=((temp<<1)|0x01);
}
PORTC=((PORTC<<1)|0x01);
}
}
return (0);
}
//-------------------------------------------------------------
void main(void) //主程序
{unsigned char p;
// 輸入/輸出口初始化
// Port A
DDRA=0xFF;
PORTA=0xFF;
// Port B
DDRB=0xFF;
PORTB=0x00;
// Port C
DDRC=0xf0;
PORTC=0x0f;
// Port D
DDRD=0x00;
PORTD=0xff;
//定時器/計數器0 初始化
// 時鐘源: 系統時鐘
// 時鐘值: 31.250 kHz
// 模式輸出比較
// OC0 輸出: 不連接
TCCR0=0x04;
TCNT0=0x06;
//定時器/計數器1 初始化
//時鐘源: 系統時鐘
//時鐘值: 定時器1 停止
//模式: 輸出比較
// OC1A 輸出: 不連接
// OC1B 輸出: 不連接
// 噪聲消除: 關閉
// 下降沿輸入捕獲
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// 外部中斷初始化
// INT0 : 關閉
// INT1 : 關閉
GIMSK=0x00;
MCUCR=0x00;
//定時器/計數器中斷初始化
TIMSK=0x02;
// 模擬比較器初始化
// 模擬比較器: 關閉
// 模擬比較器輸入捕獲: 關閉
ACSR=0x80;
hh=0;
hl=0;
mh=0;
ml=0;
sh=0;
sl=0;
p=0;
key=0;
// LCD 模式初始化
lcd_init(16);
init();
while(PIND.7!=0) //無SHIFT 鍵確認
{
while(keyscan()) //有鍵按下
{
if(PIND.7!=0) //如不是SHIFT 鍵按下
{
++p;
switch(p) //顯示
{
case 1: //小時十位
{
while(keyscan())
{
hh=key;
hr=10*hh+hl;
delay_us(50);
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer);
delay_ms(150);
}
};
break;
case 2: //小時個位
{
while(keyscan())
{
hl=key;
hr=hh*10+hl;
delay_us(50);
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer);
delay_ms(150);
}
};
break;
case 3: //分鐘十位
{
while(keyscan())
{
mh=key;
minu=mh*10+ml;
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer);
delay_ms(150);
}
};
break;
case 4: //分鐘個位
{
while(keyscan())
{
ml=key;
minu=mh*10+ml;
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer);
delay_ms(150);
}
};
break;
case 5: //秒鐘十位
{
while(keyscan())
{
sh=key;
sec=sh*10+sl;
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer);
delay_ms(150);
}
};
break;
case 6: //秒鐘個位
{
while(keyscan())
{
sl=key;
sec=sh*10+sl;
lcd_clear();
sprintf(lcd_buffer,"The time now is\n %-2d:%-2d:%-2d",hr,minu,sec);
lcd_puts(lcd_buffer);
delay_ms(150);
}
};
break;
default: break;
}
}
}
}
// 看門狗定時器初始化
// 看門狗定時器預比例器: OSC/2048
WDTCR=0x0f;
// 全局中斷允許
#asm("sei")
while (1)
{
};
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -