機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
Freescale c 語(yǔ)言例子液晶時(shí)鐘
Freescale c 語(yǔ)言例子液晶時(shí)鐘
 更新時(shí)間:2010-1-29 16:08:30  點(diǎn)擊數(shù):0
【字體: 字體顏色

c 語(yǔ)言例子液晶時(shí)鐘,時(shí)間可通過(guò)串口修改--
main.c
/*----------------------C語(yǔ)言示例-----------------------*
*硬件連接:PTB-HD44780data,PTC0-RS,PTC1-RW,PTC2-E       *
*程序描述: 1.以串行中斷方式接收從PC機(jī)發(fā)送來(lái)的時(shí)鐘啟     *
*            動(dòng)信號(hào)56H和時(shí)間值                          *
*            v11:11:11:11表示11:11:11                 *
*          2.以定時(shí)中斷方式實(shí)現(xiàn)實(shí)現(xiàn)1秒的定時(shí)            *
*          3.以串行接受中斷方式接受從PC機(jī)發(fā)送來(lái)的時(shí)     *
*            鐘停止信號(hào)57H并向PC方發(fā)送當(dāng)前的時(shí)鐘數(shù)據(jù)    *
*使用模塊: 定時(shí)模塊、串行通信模塊及LCD模塊              *
*作者:     劉玉宏                                       *
*版本      V1.0                                         *
*修改日期: 2005-6-11                                    *
*------------------------------------------------------*/
#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();                //系統(tǒng)初始化
   
  DDRA=0xff;                  //I/O初始化
 DDRB=0xff;
 DDRC=0x17;
 
 init_timer1();              //定時(shí)器1初始化
 
 init_sci();                //[SCI初始化]
 
 Init_HD44780(0b00111100);   //LCD初始化
 
 print1L(time);              //顯示時(shí)間初值
 print2L(info);              //顯示其它信息
 
 EnableInterrupts;           //開(kāi)中斷
 
 for(;;){
 };
 
}
//===================================================================
//= 函數(shù)原型: void init_con(void)
//= 功    能: 系統(tǒng)配置及時(shí)鐘初始化
//= 參    數(shù): 無(wú)
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
void init_con(void)
{    
}                
//===================================================================
//= 函數(shù)原型: void init_timer1(void)
//= 功    能: 初始化定時(shí)器1
//= 參    數(shù): 無(wú)
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
void init_timer1(void)
{
   T1SC=0b01100110;           //01100110允許溢出中斷、
                              //不啟動(dòng)計(jì)數(shù)、分頻因子=64
  T1CNTH=0;        //計(jì)數(shù)器初值清0
  T1CNTL=0;
  T1MODH=0x96;       //設(shè)1秒產(chǎn)生1次溢出中斷
  T1MODL=0;        //模數(shù)寄存器設(shè)定值=
                             //1×(2457600/64)=$9600
}
//===================================================================
//= 函數(shù)原型: void init_sci(void)
//= 功    能: 初始化串口
//= 參    數(shù): 無(wú)
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
void init_sci(void)
{
                                //監(jiān)控程序已初始化一部分
    SCC2=0x2c;                  //設(shè)置接收中斷允許 
}

main.h
#ifndef main_h //防止在同一模塊多次包含
 #define main_h
 #i nclude "head.h"               //本工程公共頭文件
 #i nclude <hidef.h>              //系統(tǒng)頭文件,包含開(kāi)關(guān)中斷
    #i nclude <MC68HC908GP32.h>      //芯片頭文件 
 #ifndef main_c
 
  //*********主程序非靜態(tài)全局變量定義*************
  extern unsigned char time[];
        extern const unsigned char info[];
  //自己模塊內(nèi)的全局變量,公共函數(shù)聲明給其他模塊
     
 #else
  //*********主程序自定義函數(shù)說(shuō)明***
  void init_con(void);
  void init_timer1(void);
  void init_sci(void);
  //自己的私有函數(shù)和公共函數(shù)聲明給自己模塊
 #endif
#endif
lcd.c
#define lcd_c
#i nclude "main.h"               //其它模塊頭文件
#i nclude "lcd.h"                //本模塊頭文件
#i nclude "interrupt.h"          //其它模塊頭文件     
//===================================================================
//= 函數(shù)原型: void DelaySub(INT16U i,INT16U vector)
//= 功    能: 延時(shí)函數(shù)
//= 參    數(shù): 為延時(shí)大小,vector為延時(shí)矢量
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
void DelaySub(INT16U i,INT16U vector)
{
  INT16U j;
  INT16U x;
  for(j=0;j<=i;j++)
    for(x=0;x<=vector;x++);
}
//===================================================================
//= 函數(shù)原型: void AsmDelay(INT8U delaytime)
//= 功    能: 延時(shí)函數(shù)
//= 參    數(shù): 為延時(shí)大小
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
void AsmDelay(INT8U delaytime)
{
  while(delaytime--) {
   
  asm("NOP");     //1 cycles
  asm("NOP");      //1 cycles
  }
 
}
//===================================================================
//= 函數(shù)原型: void LCD_Command(INT8U cmd)
//= 功    能: 對(duì)A中指令使用PORTB作為輸出口,
//            到LCD進(jìn)行命令執(zhí)行或字符顯示
//= 參    數(shù): cmd,執(zhí)行的指令,8位
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
void LCD_Command(INT8U cmd)
{  
   
  AsmDelay(15);   //等待約40us
  PTB=cmd;    //把指令碼送到B口
  asm("NOP");
  asm("NOP");
  PTC|=0b00000100;  //LCD開(kāi)始接受數(shù)據(jù),置使能位為1
  asm("NOP");
  asm("NOP");
  PTC&=0b11111011;  //LCD結(jié)束接受數(shù)據(jù),置使能位為0
  AsmDelay(15);   //等待約40us
 
   
}
//===================================================================
//= 函數(shù)原型: void Init_HD44780(INT8U setting)
//= 功    能: 初始化HD44780
//= 參    數(shù): "HD44780功能"設(shè)置命令
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):公有函數(shù)
//===================================================================
void Init_HD44780(INT8U setting)
{
    PTC&=0b11111110;  //令LCD的RS=0,R/W=0,
                         //進(jìn)行LCD初始化
  PTC&=0b11111101;
   //功能設(shè)置:數(shù)據(jù)接口,顯示行數(shù),點(diǎn)陣模式
   //00111000:8位數(shù)據(jù)接口,2行顯示,5*7點(diǎn)陣模式
         //00110100:8位數(shù)據(jù)接口,1行顯示,5*10點(diǎn)陣模式
  LCD_Command(setting);
   //顯示開(kāi)關(guān)控制:關(guān)顯示,關(guān)光標(biāo)顯示,不閃爍
  LCD_Command(0b00001000);
  AsmDelay(15);   //等待約40us
  PTC&=0b11111110;    //RS,RW清零開(kāi)始清屏
  PTC&=0b11111101;
  LCD_Command(0b00000001);  //清屏指令
  DelaySub(1,0x200);   //等待清屏完畢,時(shí)間>1.6ms
      //輸入方式設(shè)置:數(shù)據(jù)讀寫(xiě)操作后,
      //AC自動(dòng)增1顯示不動(dòng),光標(biāo)左移
  LCD_Command(0b00000110);
      //光標(biāo)移位設(shè)置:光標(biāo)右移一個(gè)字符位,AC自動(dòng)加1
  LCD_Command(0b00010100);
      //顯示開(kāi)關(guān)設(shè)置:開(kāi)顯示,關(guān)光標(biāo)顯示,不閃爍 
  LCD_Command(0b00001100); 
}
//===================================================================
//= 函數(shù)原型: void print1L(INT8U *s)
//= 功    能: HD44780第一行顯示
//= 參    數(shù): 欲顯示的字符串
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):公有函數(shù)
//===================================================================
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,
                       //寫(xiě)入數(shù)據(jù)到DD RAM中
   PTC&=0b11111101;
   LCD_Command(*s); //將要顯示的字符串
                       //分個(gè)送到LCD
   s++;
   i++;
   }
}
//===================================================================
//= 函數(shù)原型: void print2L(INT8U *s)
//= 功    能: HD44780第二行顯示
//= 參    數(shù): 欲顯示的字符串
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):公有函數(shù)
//===================================================================
void print2L(INT8U *info)
{  
      INT8U i;
  i=0;
  PTC&=0b11111110;
  PTC&=0b11111101;
  LCD_Command(0b11000000);
  i=0;
  //如果超過(guò)16個(gè)字符,將字符全部送完
  while(info[i]&&i<16){
   PTC|=0b00000001; //令LCD的RS=1,R/W=0,
                       //寫(xiě)入數(shù)據(jù)到DD RAM中
   PTC&=0b11111101;
   LCD_Command(info[i]);
   i++;
   }
     
}

lcd.h
#ifndef lcd_h //防止在同一模塊多次包含
 #define lcd_h 
 #i nclude "head.h"               //本工程公共頭文件
 #i nclude <hidef.h>              //系統(tǒng)頭文件,包含開(kāi)關(guān)中斷
    #i nclude <MC68HC908GP32.h>      //芯片頭文件 
 #ifndef lcd_c
 
  //*********全局變量,公共函數(shù)定義*************
  void Init_HD44780(INT8U setting);
  void print1L(INT8U *s);
  void print2L(INT8U *s);
       
  //自己模塊內(nèi)的全局變量,公共函數(shù)聲明給其他模塊
     
 #else
  //*********本模塊自定義函數(shù)說(shuō)明***
  void DelaySub(INT16U i,INT16U vector);
        void AsmDelay(INT8U delaytime);
        void LCD_Command(INT8U cmd);
  //自己的私有函數(shù)和公共函數(shù)聲明給自己模塊
 #endif
#endif
interrupt.c
#define interrupt_c
#i nclude "main.h"               //其它模塊頭文件
#i nclude "lcd.h"                //其它模塊頭文件
#i nclude "interrupt.h"          //本模塊頭文件
//=================全局變量定義=====================================
unsigned char INBUF[8];         //存放PC機(jī)發(fā)來(lái)的8個(gè)數(shù)據(jù)變量
//===================================================================

//===================================================================
//= 函數(shù)原型: void SCISend(unsigned char out)
//= 功    能: 用SCI發(fā)送一個(gè)字節(jié)
//= 參    數(shù): 要發(fā)送的字節(jié)
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
void SCISend(unsigned char out)
{
 while((SCS1 & 0x80) == 0);  //判斷SCS1的第7位是否為1,
                             //是表示發(fā)送緩沖空,可以發(fā)送
 SCDR=out;
}
 
//===================================================================
//= 函數(shù)原型: void MainSend( )                 
//= 功    能: 接收中斷處理函數(shù)處理子程序
//= 參    數(shù): 無(wú)                  
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//=================================================================== 
void MainSend( )                 
{
    int i,m;
 unsigned char hand;
 
 for(;;)
 {
                          //等待接收1個(gè)字節(jié)的信號(hào),收不到數(shù)據(jù)退出
  m=0;
                          //SCS1第5位為1表示接收緩沖區(qū)中有數(shù)據(jù)可接收
  for(i=0;i<0xfff&&((SCS1 & 0x20) == 0);i++);
                          //i=0xfff表示超時(shí)未收到數(shù)據(jù)
  if(i==0xfff) continue;
 
  hand=SCDR;              //接收握手信號(hào)86
 
  if(hand==0x56)          //收到數(shù)據(jù),與86比較:
                          //是,表示計(jì)數(shù)開(kāi)始
  {
     T1SC&=0xdf;          //允許定時(shí)器1計(jì)數(shù)寄存器計(jì)數(shù)
                          //取PC機(jī)發(fā)來(lái)的6個(gè)數(shù)據(jù)暫存INBUF緩沖區(qū)
     while (m<=0x07)
     {                    //SCS1第5位為1表示接收緩沖區(qū)中有數(shù)據(jù)可接收
        for(i=0;i<0xfff&&((SCS1 & 0x20) == 0);i++);
                          //i=0xfff表示超時(shí)未收到數(shù)據(jù)
        if(i==0xfff)continue;  
        INBUF[m]=SCDR;    //讀取數(shù)據(jù)
        m=m+1;
      };
      
                                //[顯示PC方發(fā)來(lái)的時(shí)鐘設(shè)置值]
                                //[1.將發(fā)來(lái)的6個(gè)數(shù)據(jù)轉(zhuǎn)化為字符]
           for(i=0;i<=7;i++)
           {
              time[i]=INBUF[i];
           }
                                //[2.顯示時(shí)鐘初始值]
          
           print1L((unsigned char*)time);
        }
       
        else if(hand==0x57)    //不是86,在與87比較:
                               //是,表示計(jì)數(shù)結(jié)束
        {
            T1SC|=0x20;         //不允許定時(shí)器1計(jì)數(shù)寄存器計(jì)數(shù)
                                //[發(fā)送當(dāng)前時(shí)鐘的時(shí)間給PC]
                                //1.將SerialBuff中的6個(gè)數(shù)據(jù)由字符轉(zhuǎn)化
                                //為數(shù)值型,并發(fā)送給PC
            for(i=0;i<=7;i++)
            {
                SCISend(time[i]);
            }
                                //2.將發(fā)送緩沖區(qū)時(shí)鐘數(shù)據(jù)發(fā)送出去
        } 
         break; 
 }
 
}
//===================================================================
//= 函數(shù)原型: interrupt 13 void isrRec(void)
//= 功    能: 接收中斷服務(wù)函數(shù)
//= 參    數(shù): 無(wú)                  
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//=================================================================== 
interrupt 13 void isrRec(void)
  {
 asm("SEI");        //禁止所有中斷
 MainSend( );        //接收8個(gè)數(shù)據(jù)并返發(fā)回PC機(jī)方顯示
 asm("CLI");   //開(kāi)中斷
  }
//===================================================================
//= 函數(shù)原型: interrupt 6 void isrTIMER1(void)
//= 功    能: 定時(shí)器1溢出處理程序
//= 參    數(shù): 無(wú)                  
//= 返 回 值: 無(wú)
//= 函數(shù)性質(zhì):私有函數(shù)
//===================================================================
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;//小時(shí)的處理
                             //與小時(shí)的24進(jìn)行比較處理
           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;     //清除定時(shí)器溢出標(biāo)志位
  print1L((unsigned char*)time);    //顯示時(shí)間
  asm("CLI");
}
interrupt.h
#ifndef interrupt_h //防止在同一模塊多次包含
 #define interrupt_h 
 #i nclude "head.h"               //本工程公共頭文件
 #i nclude <hidef.h>              //系統(tǒng)頭文件,包含開(kāi)關(guān)中斷
    #i nclude <MC68HC908GP32.h>      //芯片頭文件 
 #ifndef interrupt_c
 
  //*********全局變量,公共函數(shù)定義*************
        extern unsigned char INBUF[8];         //存放PC機(jī)發(fā)來(lái)的8個(gè)數(shù)據(jù)變量
        
  //自己模塊內(nèi)的全局變量,公共函數(shù)聲明給其他模塊
     
 #else
  //*********本模塊自定義函數(shù)說(shuō)明***
  void SCISend(unsigned char out);
        void MainSend();
        interrupt 13 void isrRec(void);
        interrupt 6 void isrTIMER1(void);
  //自己的私有函數(shù)和公共函數(shù)聲明給自己模塊
 #endif
#endif
head.h
#ifndef _TYPE
#define _TYPE
typedef  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

  • 上一篇: HD7279(c語(yǔ)言)驅(qū)動(dòng)程序含有兩個(gè)按鍵驅(qū)動(dòng)程序及測(cè)試函數(shù)
  • 下一篇: 沒(méi)有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1