?? 液晶時鐘,串口調時.txt
字號:
#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<16){
PTC|=0b00000001; //令LCD的RS=1,R/W=0,
//寫入數據到DD RAM中
PTC&=0b11111101;
LCD_Command(info);
i++;
}
}
interrupt.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=INBUF;
}
//[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);
}
//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");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -