⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdw.txt

📁 一款非常实用LCD16*2 液晶程序(时钟程序).仅供大家学习参考用
💻 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 + -