液晶时钟设计
一、实验目的
1、学习1602液晶显示的原理。
2、掌握1602液晶时钟设计,为课程设计打基础。 二、实验预备知识
LCD本身不发光,是通过借助外界光线照射液晶材料而实现显示的被动显示器件。可以显示各种文字、数字、图形。
LM016L为字符型液晶显示器LCD,其图形符号、引脚及属性如图所示。 引脚说明如下: ①数据线D7~D0
②控制线(有3根:RS、RW、E) ③1根地线Vss
④两根电源线(VDD、VEE) LM016L的属性设置如下: ①每行的字符数为16,行数为2; ②时钟为250KHz;
③行1的字符地址为80H~8FH
④行2的字符地址为C0H~CFH LCD图形符号和引脚 三、实验内容
液晶时钟电路原理图
使用LCD显示两行字符,第一行正中间显示字符为“BeiJing Time”,第二行显示时钟。 四、程序设计步骤
1、PROTEUS电路设计
电路仿真原理图设计在PROTEU ISIS平台中进行。 (1)新建设计文件
菜单【file】/【New Design】,出现选择模板窗口,选中”DEFAULT” 模板,再单击”OK”按钮,在文件名框中输入文件名,单击”保存”按钮,则保存新建设计文件,其后缀自动为.DSN。 (2)从PROTEUS库中选取元器件
单击“P”按钮,在其左上角“Keywords”(关键字)一栏中输入以下元器件的关键字,将以下元器件添加到对象选择器中。
①ATC51:单片机 ②RES:电阻
③LM0160L:16×2字符LCD显示器 ④CAP、CAP-ELEC:电容、电解电容 ⑤CRYSTAL:晶振
(3)放置元器件:按照原理图合理放置元器件。 (4)放置电源和地(终端)
单击工具栏中的
终端按钮,在对象选择器中选取电源(POWER)、地(GROUND), 用
上述放置元器件方法分别放置于编辑区中。 (5)电路图连线
系统默认自动扑捉
和自动布线
有效。只要在两端点相继单击,便可画线。画折
线,在拐弯处单击;若中途想取消,可右双击或按“Esc”;若终点在空白初,左双击即可结束。
(6)设置、修改元器件的属性
先右击后左击各器件,在弹出的属性编辑框中设置、修改它的属性。 (7)电气检测
选择【Tools】/【Electrical Rule Check】菜单项,出现电气检查报告单,无错误,则用户可执行下一步。
2、源程序设计、生成目标代码文件 在Kile软件中
第一步:建立一个工程项目文件
执行菜单【Project 】/【New project 】,给项目文件取名并保存,选择单片机型号为ATC51;
第二步:选择目标器件
右键Target1-Options for Target“ Target1”或选择【 Project】/ 【Options for Target“Target1” 】对选项卡进行设置,在“Output”选项卡,选中“Create HEX File”; 第三步:新建一个源程序文件
在菜单File/New编辑窗口中输入源程序,在菜单File/Save中保存源程序文件,文件后缀为.c;
显示程序参考实验9,以下程序供参考:
void main() //主函数 {
unsigned char i;
P1=0xff; // 送全1到P0口 int1(); // 初始化LCD
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-50000)/256; //定时器T0的高8位设置初值 TL0=(65536-50000)%256; //定时器T0的低8位设置初值 EA=1; //开总中断
ET0=1; //定时器T0中断允许 TR0=1; //启动定时器T0
count=0; //中断次数初始化为0 s=0; //秒初始化为0 m=0; //分钟初始化为0 h=0; //小时初始化为0
lcd_w_cmd(0x83); //写地址,从第1行第4列开始显示 i=0; //从字符数组的第1个元素开始显示
while(string[i]!='\\0') //只要没有显示到字符串的结束标志'\\0',就继续 {
lcd_w_dat(string[i]); //将第i个字符数组元素写入LCD i++; //指向下一个数组元素 }
lcd_w_cmd(0xc6); //写地址,将第二个分号显示在第2行第7列 lcd_w_dat(':'); //将分号的字符常量写入LCD
lcd_w_cmd(0xc9); //写地址,将第二个分号显示在第2行第10列 lcd_w_dat(':'); //将分号的字符常量写入LCD
while(1) {
DisplayHour(); //显示小时
delay1(); //给硬件一点反应时间 DisplayMinute(); //显示分钟
delay1(); //给硬件一点反应时间 DisplaySecond(); //显示秒
delay1(); //给硬件一点反应时间 }
}
void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器
{
count++; //每产生1次中断,中断累计次数加1 if(count==20) //如果中断次数计满20次 {
count=0; //中断累计次数清0
s++; //秒加1 }
if(s==60) //如果计满60秒 {
s=0; //秒清0 m++; //分钟加1 }
if(m==60) //如果计满60分 {
m=0; //分钟清0 h++; //小时加1 }
if(h==24) //如果计满24小时 {
h=0; //小时清0 }
TH0=(65536-50000)/256; //定时器T0高8位重新赋初值
TL0=(65536-50000)%256; //定时器T0低8位重新赋初值 }
void DisplayHour() {
unsigned char i,j;
i=h/10; //取整运算,求得十位数字 j=h%10; //取余运算,求得各位数字
lcd_w_cmd(0xc4); //写显示地址,将十位数字显示在第2行第5列 lcd_w_dat(digit[i]); //将十位数字的字符常量写入LCD lcd_w_dat(digit[j]); //将个位数字的字符常量写入LCD }
void DisplayMinute() {
unsigned char i,j;
i=m/10; //取整运算,求得十位数字 j=m%10; //取余运算,求得各位数字
lcd_w_cmd(0xc7); //写显示地址,将十位数字显示在第2行第8列 lcd_w_dat(digit[i]); //将十位数字的字符常量写入LCD lcd_w_dat(digit[j]); //将个位数字的字符常量写入LCD
}
void DisplaySecond() {
unsigned char i,j;
i=s/10; //取整运算,求得十位数字 j=s%10; //取余运算,求得各位数字
lcd_w_cmd(0xca); //写显示地址,将十位数字显示在第2行第11列 lcd_w_dat(digit[i]); //将十位数字的字符常量写入LCD lcd_w_dat(digit[j]); //将个位数字的字符常量写入LCD }
第四步:把源程序文件添加到工程项目中
单击工程项目【Target1】/【Source Group1】选择Add File to Group Source Group1,选择文件类型,单击Add按钮,添加完毕,关闭窗口; 第五步:源程序编译、生成目标代码文件
选择【Project】/【Rebuild all target files】选项或单击工具栏中编译成功,显示编译成功的信息,并生成目标代码文件,文件后缀.HEX。 3、PROTEUS调试
在PROTEUS软件中,将鼠标指向ATC51,先右击再左击,在此窗口中的“Program File”栏中,选择用Kile软件生成的.HEX文件,单击“打开”按钮,完成添加文件。在Clock Frequency栏中把频率设定为12MHz,单击“OK”。 在PROTEUS软件中,按“运行”按钮进行仿真。
按钮,如果