一个freescale的C语言程序之液晶时钟

来源:本站
导读:目前正在解读《一个freescale的C语言程序之液晶时钟》的相关信息,《一个freescale的C语言程序之液晶时钟》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《一个freescale的C语言程序之液晶时钟》的详细说明。
简介:本文主要介绍的是一个freescale的c程序---液晶时钟。程序描述;1.以串行中断方式接收从PC机发送来的时钟启动信号56H和时间值 ;2.以定时中断方式实现实现1秒的定时。。。

/*----------------------C语言示例-----------------------**硬件连接:PTB-HD44780data,PTC0-RS,PTC1-RW,PTC2-E       **程序描述: 1.以串行中断方式接收从PC机发送来的时钟启     **            动信号56H和时间值                          **            v11:11:11:11表示11:11:11                 **          2.以定时中断方式实现实现1秒的定时            **          3.以串行接受中断方式接受从PC机发送来的时     **            钟停止信号57H并向PC方发送当前的时钟数据    **使用模块: 定时模块、串行通信模块及LCD模块              **------------------------------------------------------*/#define main_c#i nclude "main.h"               //本模块头文件#i nclude "lcd.h"                //其它模块头文件#i nclude "interrupt.h"          //其它模块头文件//---------------主程序全局变量定义--------------------unsigned char time[9]= "12:00:00";const unsigned char info[17]= "HoHai university";//----------------------------------------------------void main(void) {    DisableInterrupts;          //禁止所有中断    init_con();                //系统初始化      DDRA=0xff;                  //I/O初始化 DDRB=0xff; DDRC=0x17;  init_timer1();              //定时器1初始化  init_sci();                //[SCI初始化]  Init_HD44780(0b00111100);   //LCD初始化  print1L(time);              //显示时间初值 print2L(info);              //显示其它信息  EnableInterrupts;           //开中断   for(;;){ };  }//===================================================================//= 函数原型: void init_con(void)//= 功    能: 系统配置及时钟初始化 //= 参    数: 无//= 返 回 值: 无//= 函数性质:私有函数//===================================================================void init_con(void){     }                 //===================================================================//= 函数原型: void init_timer1(void)//= 功    能: 初始化定时器1 //= 参    数: 无//= 返 回 值: 无//= 函数性质:私有函数//===================================================================void init_timer1(void){   T1SC=0b01100110;           //01100110允许溢出中断、                              //不启动计数、分频因子=64  T1CNTH=0;        //计数器初值清0  T1CNTL=0;  T1MODH=0x96;       //设1秒产生1次溢出中断  T1MODL=0;        //模数寄存器设定值=                             //1×(2457600/64)=$9600}//===================================================================//= 函数原型: void init_sci(void)//= 功    能: 初始化串口//= 参    数: 无//= 返 回 值: 无//= 函数性质:私有函数//===================================================================void init_sci(void){                                //监控程序已初始化一部分    SCC2=0x2c;                  //设置接收中断允许  }main.h#ifndef main_h //防止在同一模块多次包含 #define main_h #i nclude "head.h"               //本工程公共头文件 #i nclude               //系统头文件,包含开关中断    #i nclude       //芯片头文件   #ifndef main_c   //*********主程序非静态全局变量定义*************  extern unsigned char time[];        extern const unsigned char info[];  //自己模块内的全局变量,公共函数声明给其他模块       #else  //*********主程序自定义函数说明***  void init_con(void);  void init_timer1(void);  void init_sci(void);  //自己的私有函数和公共函数声明给自己模块 #endif#endiflcd.c#define lcd_c#i nclude "main.h"               //其它模块头文件#i nclude "lcd.h"                //本模块头文件#i nclude "interrupt.h"          //其它模块头文件      //===================================================================//= 函数原型: void DelaySub(INT16U i,INT16U vector)//= 功    能: 延时函数 //= 参    数: 为延时大小,vector为延时矢量//= 返 回 值: 无//= 函数性质:私有函数//===================================================================void DelaySub(INT16U i,INT16U vector){   INT16U j;  INT16U x;   for(j=0;j<=i;j++)    for(x=0;x<=vector;x++);}//===================================================================//= 函数原型: void AsmDelay(INT8U delaytime)//= 功    能: 延时函数 //= 参    数: 为延时大小//= 返 回 值: 无//= 函数性质:私有函数//===================================================================void AsmDelay(INT8U delaytime){   while(delaytime--) {      asm("NOP");     //1 cycles  asm("NOP");      //1 cycles  }  }//===================================================================//= 函数原型: void LCD_Command(INT8U cmd)//= 功    能: 对A中指令使用PORTB作为输出口,//            到LCD进行命令执行或字符显示//= 参    数: cmd,执行的指令,8位//= 返 回 值: 无//= 函数性质:私有函数//===================================================================void LCD_Command(INT8U cmd){         AsmDelay(15);   //等待约40us  PTB=cmd;    //把指令码送到B口  asm("NOP");  asm("NOP");  PTC|=0b00000100;  //LCD开始接受数据,置使能位为1  asm("NOP");  asm("NOP");  PTC&=0b11111011;  //LCD结束接受数据,置使能位为0  AsmDelay(15);   //等待约40us      }//===================================================================//= 函数原型: void Init_HD44780(INT8U setting)//= 功    能: 初始化HD44780//= 参    数: "HD44780功能"设置命令//= 返 回 值: 无//= 函数性质:公有函数//===================================================================void Init_HD44780(INT8U setting){    PTC&=0b11111110;  //令LCD的RS=0,R/W=0,                         //进行LCD初始化  PTC&=0b11111101;   //功能设置:数据接口,显示行数,点阵模式   //00111000:8位数据接口,2行显示,5*7点阵模式         //00110100:8位数据接口,1行显示,5*10点阵模式  LCD_Command(setting);    //显示开关控制:关显示,关光标显示,不闪烁  LCD_Command(0b00001000);  AsmDelay(15);   //等待约40us  PTC&=0b11111110;    //RS,RW清零开始清屏  PTC&=0b11111101;  LCD_Command(0b00000001);  //清屏指令  DelaySub(1,0x200);   //等待清屏完毕,时间>1.6ms      //输入方式设置:数据读写操作后,      //AC自动增1显示不动,光标左移  LCD_Command(0b00000110);       //光标移位设置:光标右移一个字符位,AC自动加1   LCD_Command(0b00010100);      //显示开关设置:开显示,关光标显示,不闪烁    LCD_Command(0b00001100);  }//===================================================================//= 函数原型: void print1L(INT8U *s)//= 功    能: HD44780第一行显示//= 参    数: 欲显示的字符串//= 返 回 值: 无//= 函数性质:公有函数//===================================================================void print1L(INT8U *s){         INT8U i;  i=0;  PTC&=0b11111110;  PTC&=0b11111101;  LCD_Command(0b10000000);  while(*s&&i<16){   PTC|=0b00000001; //令LCD的RS=1,R/W=0,                       //写入数据到DD RAM中   PTC&=0b11111101;   LCD_Command(*s); //将要显示的字符串                       //分个送到LCD   s++;   i++;   }}//===================================================================//= 函数原型: void print2L(INT8U *s)//= 功    能: HD44780第二行显示//= 参    数: 欲显示的字符串//= 返 回 值: 无//= 函数性质:公有函数//===================================================================void print2L(INT8U *info){         INT8U i;  i=0;  PTC&=0b11111110;  PTC&=0b11111101;  LCD_Command(0b11000000);  i=0;  //如果超过16个字符,将字符全部送完  while(info[i]&&i<16){   PTC|=0b00000001; //令LCD的RS=1,R/W=0,                       //写入数据到DD RAM中   PTC&=0b11111101;   LCD_Command(info[i]);   i++;   }      }lcd.h#ifndef lcd_h //防止在同一模块多次包含 #define lcd_h   #i nclude "head.h"               //本工程公共头文件 #i nclude               //系统头文件,包含开关中断    #i nclude       //芯片头文件   #ifndef lcd_c   //*********全局变量,公共函数定义*************  void Init_HD44780(INT8U setting);  void print1L(INT8U *s);  void print2L(INT8U *s);          //自己模块内的全局变量,公共函数声明给其他模块       #else  //*********本模块自定义函数说明***  void DelaySub(INT16U i,INT16U vector);        void AsmDelay(INT8U delaytime);        void LCD_Command(INT8U cmd);  //自己的私有函数和公共函数声明给自己模块 #endif#endifinterrupt.c#define interrupt_c#i nclude "main.h"               //其它模块头文件#i nclude "lcd.h"                //其它模块头文件#i nclude "interrupt.h"          //本模块头文件//=================全局变量定义=====================================unsigned char INBUF[8];         //存放PC机发来的8个数据变量//===================================================================//===================================================================//= 函数原型: void SCISend(unsigned char out)//= 功    能: 用SCI发送一个字节 //= 参    数: 要发送的字节//= 返 回 值: 无//= 函数性质:私有函数//===================================================================void SCISend(unsigned char out){ while((SCS1 & 0x80) == 0);  //判断SCS1的第7位是否为1,                             //是表示发送缓冲空,可以发送 SCDR=out;}  //===================================================================//= 函数原型: void MainSend( )                  //= 功    能: 接收中断处理函数处理子程序//= 参    数: 无                   //= 返 回 值: 无//= 函数性质:私有函数//===================================================================  void MainSend( )                  {    int i,m; unsigned char hand;  for(;;) {                          //等待接收1个字节的信号,收不到数据退出  m=0;                          //SCS1第5位为1表示接收缓冲区中有数据可接收  for(i=0;i<0xfff&&((SCS1 & 0x20) == 0);i++);                          //i=0xfff表示超时未收到数据  if(i==0xfff) continue;    hand=SCDR;              //接收握手信号86    if(hand==0x56)          //收到数据,与86比较:                          //是,表示计数开始  {      T1SC&=0xdf;          //允许定时器1计数寄存器计数                          //取PC机发来的6个数据暂存INBUF缓冲区     while (m<=0x07)     {                    //SCS1第5位为1表示接收缓冲区中有数据可接收        for(i=0;i<0xfff&&((SCS1 & 0x20) == 0);i++);                          //i=0xfff表示超时未收到数据         if(i==0xfff)continue;           INBUF[m]=SCDR;    //读取数据        m=m+1;      };                                       //[显示PC方发来的时钟设置值]                                //[1.将发来的6个数据转化为字符]           for(i=0;i<=7;i++)           {              time[i]=INBUF[i];           }                                //[2.显示时钟初始值]                      print1L((unsigned char*)time);        }                else if(hand==0x57)    //不是86,在与87比较:                               //是,表示计数结束        {            T1SC|=0x20;         //不允许定时器1计数寄存器计数                                //[发送当前时钟的时间给PC]                                //1.将SerialBuff中的6个数据由字符转化                                //为数值型,并发送给PC            for(i=0;i<=7;i++)            {                SCISend(time[i]);             }                                //2.将发送缓冲区时钟数据发送出去        }           break;   } }//===================================================================//= 函数原型: interrupt 13 void isrRec(void) //= 功    能: 接收中断服务函数//= 参    数: 无                   //= 返 回 值: 无//= 函数性质:私有函数//===================================================================  interrupt 13 void isrRec(void)   { asm("SEI");        //禁止所有中断 MainSend( );        //接收8个数据并返发回PC机方显示 asm("CLI");   //开中断   }//===================================================================//= 函数原型: interrupt 6 void isrTIMER1(void)//= 功    能: 定时器1溢出处理程序//= 参    数: 无                   //= 返 回 值: 无//= 函数性质:私有函数//===================================================================interrupt 6 void isrTIMER1(void){     asm("SEI");  time[7]=time[7]+1;         //秒钟的低位处理   if(time[7]==':')  {    time[7]='0';    time[6]=time[6]+1;       //秒钟的高位处理     if(time[6]=='6')    {      time[6]='0';      time[4]=time[4]+1;     //分钟的低位处理       if(time[4]==':')      {        time[4]='0';        time[3]=time[3]+1;   //分钟的高位处理         if(time[3]=='6')        {           time[3]='0';           time[1]=time[1]+1;//小时的处理                              //与小时的24进行比较处理           if(time[1]=='4')               {              if(time[0]=='2')              {                 time[1]='0';                 time[0]='0';               }            }           else if(time[1]==':')           {             time[1]='0';             time[0]=time[0]+1;           }         }       }    }   }       T1SC&=127;     //清除定时器溢出标志位  print1L((unsigned char*)time);    //显示时间  asm("CLI");}interrupt.h#ifndef interrupt_h //防止在同一模块多次包含 #define interrupt_h   #i nclude "head.h"               //本工程公共头文件 #i nclude               //系统头文件,包含开关中断    #i nclude       //芯片头文件   #ifndef interrupt_c   //*********全局变量,公共函数定义*************        extern unsigned char INBUF[8];         //存放PC机发来的8个数据变量           //自己模块内的全局变量,公共函数声明给其他模块       #else  //*********本模块自定义函数说明***  void SCISend(unsigned char out);        void MainSend();        interrupt 13 void isrRec(void);        interrupt 6 void isrTIMER1(void);  //自己的私有函数和公共函数声明给自己模块 #endif#endifhead.h#ifndef _TYPE#define _TYPEtypedef  unsigned char BOOLEAN;typedef  unsigned char INT8U;typedef  char INT8S;typedef  unsigned int INT16U;typedef  int INT16S;typedef  unsigned long INT32U;typedef  long INT32S;#endif

提醒:《一个freescale的C语言程序之液晶时钟》最后刷新时间 2024-03-14 01:03:25,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《一个freescale的C语言程序之液晶时钟》该内容的真实性请自行鉴别。