一年前弄的小玩意了,硬件丢失了,翻出来,重新分割了下,加了详细注释,注释很重要啊,以前没加详细,我自己理解起来也要半天,分享下,希望对他人有所帮助吧。其实我目前发的三个东西,现在想来,对单片机资源方面的知识涉及的不多,主要还是单片机C语言方面。在没硬件的情况下,我想分享的是我的思维,我是如何构思的,是如何运用运算符变量语句的。
单片机源程序如下:
- //=================================================================================================================================================================================================================
- //软件功能:带时钟计算器
- //硬件描述:最小系统(stc15)+ 1x(LCD1602 + PCF8574T) + 1x(5x4矩阵按键 + 74ls08)+ 1x(PCF8563)
- //程序描述:IIC.c中有PCF8574T和PCF8563的通信协议
- // anjian.c中有按键函数
- // shizhong.c中有时钟相关函数
- // jisuan.c中有计算器相关函数
- //功能概括描述:LCD1602用于显示、可以切换计算器模式和时钟模式(时间模式和闹钟模式)
- // (用x和y表示两个数的长度(小数点不算长度),则,x+y<16的条件下)可以进行四则运算
- // 时间和闹钟可以设置
- //=================================================================================================================================================================================================================
- #include "reg15.h" //STC15Wxx/STC15Fxx系列头文件
- #include "IIC.h" //I2C通信协议
- #include "anjian.h"
- #include "shizhong.h"
- #include "jisuan.h"
- #define FOSC 11059200L
- #define T50MS (65536-FOSC/12/20) //12T,11.0592MHz(50ms=20MHz)
- #define ANJ P1
- sbit INT0=P3^2;
- //=================================================================================================================================================================================================================
- uchar b=0,ajbh=21,hang,tsgn=0; //LCD列变量,按键编号变量,LCD行变量,特殊模式切换变量
- uchar HUANCUN[16],SUM[17],a=0,j=0,K=0,L=0,q=1,p=0; //算式缓存数组,计算结果缓存数组,算式缓存数组对应位变量,运算符标识变量,第一位数小数点变量,第二位数小数点变量,运算符限制变量,小数点限制变量
- uchar SZXSHC[8],sjsz=0,naoz=0,shuzi=10; //时间缓存变量,时钟模式切换变量,闹钟模式切换变量,特殊模式下的数字键变量
- //=================================================================================================================================================================================================================
- //中断和P口初始化程序
- //=========================================================================================
- void Init()
- {
- AUXR&=0x7f; //定时器0为12T模式
- INT0=1; //外部中断P口置高电平
- ANJ=0xf0; //矩阵输入输出对应P口初始化
- a4=0;
- TMOD=0x00; //定时器为方式0(STC15F2K60S2方式0是16位自动重装模式)
- TL0=T50MS; //初始化定时值
- TH0=T50MS>>8;
- ET0=1; //定时器T0中断开启
- IT0=1; //设置INT0的中断类型为下降沿触发
- EX0=1; //INT0中断开启
- PT0=1; //优先级T0优先
- PX0=0; //外部中断优先级低
- EA=1; //总中断开启
- TR0=0; //定时器0
- }
- //=========================================================================================
- void main() //主函数
- {
- Init();
- LCDInit(); //1602初始化
- CleanAlarm(); //闹钟初始化
- TR0=1;
- while(1);
- }
- //=========================================================================================
- //功能说明:按键所用中断
- // 矩阵按键的四个置位口连接74LS08的输入端,用了3个与门,2个与门的输出端接1个与门的输入端,
- // 最后引出来接INT0口,采用外部中断方式
- //=========================================================================================
- void EX_T() interrupt 0
- {
- EX0=0; //INT0中断关闭
- IICdelay1(20); //去抖动
- if(INT0==0) //如果仍有键按下
- {
- An_j();
- Cu_l();
- SZ_bd();
- }
- while(!INT0); //判断按键是否松开
- IICdelay1(20); //去抖动
- EX0=1; //INT0中断开启
- }
- //==================================================================================
- //功能说明:时钟所用中断
- // 给定变量tu用于计时,200ms读取一次闹钟响铃位GetPCF8563(0x01,SZXSHC+7)
- // 判断该位,如果告警了,LCD右下角显示字符'n'
- // 持续12.5s后字符'n'消失
- // 按任意键关闭闹钟在按键部分程序
- //==================================================================================
- void timer0() interrupt 1 //定时器中断
- {
- static uchar cb=0,tu=0;
- tu++;
- if(tu==4){ //加计数变量tu,不然读取速度过于频繁
- GetPCF8563(0x01,SZXSHC+7); //读取溢出标志位到SZXSHC[7]
- tu=0;
- }
- if(SZXSHC[7]&0x08){ //判断闹钟溢出标志位是否为1(第4位)
- if(cb==0){
- tu=4;
- cb=1;
- LCD_writezl(0x01); //LCD清除显示
- GotoXY(15,1); //右下角显示字符n
- yige('n');
- }else{
- if(tu==254){ //显示10多秒n后,闹钟自动关闭
- SetPCF8563(0x01,0x02); //清除告警中断位
- LCD_writezl(0x01); //LCD清除显示
- tu=3;
- cb=0;
- }
- }
- }else{
- Sh_z(sjsz);
- Sh_z(naoz);
- if(tu>4){ //如果是按任意键后关闭闹钟
- tu=3;
- cb=0;
- }
- }
- }
- //==================================================================================
复制代码
原理图: 无
仿真: 无
代码:
带时钟1602计算器终极程序.rar
(540.32 KB, 下载次数: 61)
|