|
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
|